Use the same codepaths as for MSVC. Mingw-w64 does have the _mktemp_s function; on Vista and newer, msvcrt.dll does contain the function, which ends up called. (Same thing in the UCRT.) In older versions of msvcrt.dll (older than what libc++ supports), mingw-w64 provides a fallback implementation. This effectively reverts23323e25f8(andd07e5c23b4). That commit tried to fix unspecified MinGW build breakage. This reduces the risk of temp name collisions between processes (when running multiple tests in parallel); the path returned by GetTempFileName can easily collide with other similar paths. (_mktemp_s on the other hand tries to avoid such clashes by using the process id as part of the uniqueness seed.) This avoids stray random failures in fstreams tests in mingw configurations. Differential Revision: https://reviews.llvm.org/D98526
108 lines
3.0 KiB
C++
108 lines
3.0 KiB
C++
//===----------------------------------------------------------------------===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
// Define a bunch of macros that can be used in the tests instead of
|
|
// implementation defined assumptions:
|
|
// - locale names
|
|
// - floating point number string output
|
|
|
|
#ifndef PLATFORM_SUPPORT_H
|
|
#define PLATFORM_SUPPORT_H
|
|
|
|
// locale names
|
|
#ifdef _WIN32
|
|
// WARNING: Windows does not support UTF-8 codepages.
|
|
// Locales are "converted" using https://docs.moodle.org/dev/Table_of_locales
|
|
# define LOCALE_en_US "en-US"
|
|
# define LOCALE_en_US_UTF_8 "en-US"
|
|
# define LOCALE_cs_CZ_ISO8859_2 "cs-CZ"
|
|
# define LOCALE_fr_FR_UTF_8 "fr-FR"
|
|
# define LOCALE_fr_CA_ISO8859_1 "fr-CA"
|
|
# define LOCALE_ru_RU_UTF_8 "ru-RU"
|
|
# define LOCALE_zh_CN_UTF_8 "zh-CN"
|
|
#else
|
|
# define LOCALE_en_US "en_US"
|
|
# define LOCALE_en_US_UTF_8 "en_US.UTF-8"
|
|
# define LOCALE_fr_FR_UTF_8 "fr_FR.UTF-8"
|
|
# ifdef __linux__
|
|
# define LOCALE_fr_CA_ISO8859_1 "fr_CA.ISO-8859-1"
|
|
# define LOCALE_cs_CZ_ISO8859_2 "cs_CZ.ISO-8859-2"
|
|
# else
|
|
# define LOCALE_fr_CA_ISO8859_1 "fr_CA.ISO8859-1"
|
|
# define LOCALE_cs_CZ_ISO8859_2 "cs_CZ.ISO8859-2"
|
|
# endif
|
|
# define LOCALE_ru_RU_UTF_8 "ru_RU.UTF-8"
|
|
# define LOCALE_zh_CN_UTF_8 "zh_CN.UTF-8"
|
|
#endif
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <codecvt>
|
|
#include <locale>
|
|
#include <string>
|
|
#if defined(_WIN32)
|
|
# include <io.h> // _mktemp_s
|
|
#else
|
|
# include <unistd.h> // close
|
|
#endif
|
|
|
|
#if defined(_NEWLIB_VERSION) && defined(__STRICT_ANSI__)
|
|
// Newlib provides this, but in the header it's under __STRICT_ANSI__
|
|
extern "C" {
|
|
int mkstemp(char*);
|
|
}
|
|
#endif
|
|
|
|
inline
|
|
std::string get_temp_file_name()
|
|
{
|
|
#if defined(_WIN32)
|
|
char Name[] = "libcxx.XXXXXX";
|
|
if (_mktemp_s(Name, sizeof(Name)) != 0) abort();
|
|
return Name;
|
|
#else
|
|
std::string Name;
|
|
int FD = -1;
|
|
do {
|
|
Name = "libcxx.XXXXXX";
|
|
FD = mkstemp(&Name[0]);
|
|
if (FD == -1 && errno == EINVAL) {
|
|
perror("mkstemp");
|
|
abort();
|
|
}
|
|
} while (FD == -1);
|
|
close(FD);
|
|
return Name;
|
|
#endif
|
|
}
|
|
|
|
#ifdef _LIBCPP_HAS_OPEN_WITH_WCHAR
|
|
inline
|
|
std::wstring get_wide_temp_file_name()
|
|
{
|
|
return std::wstring_convert<std::codecvt_utf8_utf16<wchar_t> >().from_bytes(
|
|
get_temp_file_name());
|
|
}
|
|
#endif // _LIBCPP_HAS_OPEN_WITH_WCHAR
|
|
|
|
#if defined(_CS_GNU_LIBC_VERSION)
|
|
inline bool glibc_version_less_than(char const* version) {
|
|
std::string test_version = std::string("glibc ") + version;
|
|
|
|
size_t n = confstr(_CS_GNU_LIBC_VERSION, nullptr, (size_t)0);
|
|
char *current_version = new char[n];
|
|
confstr(_CS_GNU_LIBC_VERSION, current_version, n);
|
|
|
|
bool result = strverscmp(current_version, test_version.c_str()) < 0;
|
|
delete[] current_version;
|
|
return result;
|
|
}
|
|
#endif // _CS_GNU_LIBC_VERSION
|
|
|
|
#endif // PLATFORM_SUPPORT_H
|