diff --git a/.gitlab/ci/configure_fedora43_makefiles.cmake b/.gitlab/ci/configure_fedora43_makefiles.cmake index b533870a2d..2cd93f40bf 100644 --- a/.gitlab/ci/configure_fedora43_makefiles.cmake +++ b/.gitlab/ci/configure_fedora43_makefiles.cmake @@ -109,6 +109,7 @@ if (NOT "$ENV{CMAKE_CI_NIGHTLY}" STREQUAL "") set(CMake_TEST_ISPC "ON" CACHE STRING "") endif() set(CMake_TEST_LOCALE_CHARSET "ISO-8859-1" CACHE STRING "") +set(CMake_TEST_LOCALE_C_UTF8 ON CACHE BOOL "") set(CMake_TEST_MATH_OVERFLOW ON CACHE BOOL "") set(CMake_TEST_Qt5 "ON" CACHE BOOL "") set(CMake_TEST_TLS_VERIFY_URL "https://gitlab.kitware.com" CACHE STRING "") diff --git a/.gitlab/ci/configure_fedora43_ninja.cmake b/.gitlab/ci/configure_fedora43_ninja.cmake index c9f58f24cc..6f4dbac758 100644 --- a/.gitlab/ci/configure_fedora43_ninja.cmake +++ b/.gitlab/ci/configure_fedora43_ninja.cmake @@ -5,6 +5,7 @@ if (NOT "$ENV{CMAKE_CI_NIGHTLY}" STREQUAL "") set(CMake_TEST_ISPC "ON" CACHE STRING "") endif() set(CMake_TEST_LOCALE_CHARSET "UTF-8" CACHE STRING "") +set(CMake_TEST_LOCALE_C_UTF8 ON CACHE BOOL "") set(CMake_TEST_MATH_OVERFLOW ON CACHE BOOL "") set(CMake_TEST_MODULE_COMPILATION "named,compile_commands,collation,partitions,internal_partitions,export_bmi,install_bmi,shared,bmionly,build_database,import_std23" CACHE STRING "") set(CMake_TEST_Rust "ON" CACHE STRING "") diff --git a/.gitlab/ci/configure_macos_arm64_ninja.cmake b/.gitlab/ci/configure_macos_arm64_ninja.cmake index 7ea87ec8ce..1d0787c08b 100644 --- a/.gitlab/ci/configure_macos_arm64_ninja.cmake +++ b/.gitlab/ci/configure_macos_arm64_ninja.cmake @@ -7,6 +7,7 @@ set(CMake_TEST_FindOpenMP_C "ON" CACHE BOOL "") set(CMake_TEST_FindOpenMP_CXX "ON" CACHE BOOL "") set(CMake_TEST_GUI "ON" CACHE BOOL "") set(CMake_TEST_LOCALE_CHARSET "UTF-8" CACHE STRING "") +set(CMake_TEST_LOCALE_C_UTF8 ON CACHE BOOL "") set(CMake_TEST_MATH_OVERFLOW ON CACHE BOOL "") set(CMake_TEST_TLS_VERIFY_URL "https://gitlab.kitware.com" CACHE STRING "") set(CMake_TEST_TLS_VERIFY_URL_BAD "https://badtls-expired.kitware.com" CACHE STRING "") diff --git a/.gitlab/ci/configure_macos_x86_64_ninja.cmake b/.gitlab/ci/configure_macos_x86_64_ninja.cmake index c9db73da39..c3c3d8380c 100644 --- a/.gitlab/ci/configure_macos_x86_64_ninja.cmake +++ b/.gitlab/ci/configure_macos_x86_64_ninja.cmake @@ -10,6 +10,7 @@ if (NOT "$ENV{CMAKE_CI_NIGHTLY}" STREQUAL "") set(CMake_TEST_ISPC "ON" CACHE STRING "") endif() set(CMake_TEST_LOCALE_CHARSET "UTF-8" CACHE STRING "") +set(CMake_TEST_LOCALE_C_UTF8 ON CACHE BOOL "") set(CMake_TEST_MATH_OVERFLOW ON CACHE BOOL "") set(CMake_TEST_TLS_VERIFY_URL "https://gitlab.kitware.com" CACHE STRING "") set(CMake_TEST_TLS_VERIFY_URL_BAD "https://badtls-expired.kitware.com" CACHE STRING "") diff --git a/.gitlab/ci/configure_windows_common.cmake b/.gitlab/ci/configure_windows_common.cmake index 124688531d..b243ece7e5 100644 --- a/.gitlab/ci/configure_windows_common.cmake +++ b/.gitlab/ci/configure_windows_common.cmake @@ -3,6 +3,7 @@ set(BUILD_CursesDialog ON CACHE BOOL "") set(CMAKE_PREFIX_PATH "$ENV{CI_PROJECT_DIR}/.gitlab/qt" CACHE STRING "") set(CMake_TEST_Java OFF CACHE BOOL "") set(CMake_TEST_LOCALE_CHARSET "UTF-8" CACHE STRING "") +set(CMake_TEST_LOCALE_C_UTF8 ON CACHE BOOL "") set(Python_FIND_REGISTRY NEVER CACHE STRING "") include("${CMAKE_CURRENT_LIST_DIR}/configure_common.cmake") diff --git a/Source/cmStdIoInit.cxx b/Source/cmStdIoInit.cxx index 0d7a3d027e..e6e2e16cac 100644 --- a/Source/cmStdIoInit.cxx +++ b/Source/cmStdIoInit.cxx @@ -17,6 +17,9 @@ # include "cm_fileno.hxx" #else +# include +# include + # include #endif @@ -118,6 +121,17 @@ Globals::Globals() #else // On non-Windows platforms, we select the user's locale. std::setlocale(LC_CTYPE, ""); + + // In the "C" locale try switching to a UTF-8 character set. + if (char const* locale = std::setlocale(LC_CTYPE, nullptr)) { + if (locale == "C"_s || locale == "POSIX"_s) { + std::setlocale(LC_CTYPE, "C.UTF-8") +# ifdef __APPLE__ + || std::setlocale(LC_CTYPE, "UTF-8") +# endif + || std::setlocale(LC_CTYPE, "en_US.UTF-8"); + } + } #endif } diff --git a/Tests/RunCMake/CMakeLists.txt b/Tests/RunCMake/CMakeLists.txt index a2a6bdc42c..76251d1d58 100644 --- a/Tests/RunCMake/CMakeLists.txt +++ b/Tests/RunCMake/CMakeLists.txt @@ -694,6 +694,9 @@ add_RunCMake_test(export) if(DEFINED CMake_TEST_LOCALE_CHARSET) list(APPEND cmake_host_system_information_ARGS -DCMake_TEST_LOCALE_CHARSET=${CMake_TEST_LOCALE_CHARSET}) endif() +if(DEFINED CMake_TEST_LOCALE_C_UTF8) + list(APPEND cmake_host_system_information_ARGS -DCMake_TEST_LOCALE_C_UTF8=${CMake_TEST_LOCALE_C_UTF8}) +endif() if(CMake_TEST_MSYSTEM_PREFIX) list(APPEND cmake_host_system_information_ARGS -DCMake_TEST_MSYSTEM_PREFIX=${CMake_TEST_MSYSTEM_PREFIX}) endif() diff --git a/Tests/RunCMake/cmake_host_system_information/RunCMakeTest.cmake b/Tests/RunCMake/cmake_host_system_information/RunCMakeTest.cmake index 803518af8a..89a5f51cec 100644 --- a/Tests/RunCMake/cmake_host_system_information/RunCMakeTest.cmake +++ b/Tests/RunCMake/cmake_host_system_information/RunCMakeTest.cmake @@ -15,6 +15,14 @@ endif() run_cmake_script(Locale) unset(RunCMake-stdout-file) +if(CMake_TEST_LOCALE_C_UTF8 OR CMAKE_HOST_WIN32) + set(RunCMake-stdout-file Locale-stdout-utf-8.txt) + run_cmake_command(LocaleC-UTF8 ${CMAKE_COMMAND} -E env LC_CTYPE=C ${CMAKE_COMMAND} -P ${RunCMake_SOURCE_DIR}/Locale.cmake) + run_cmake_command(LocaleBad-UTF8 ${CMAKE_COMMAND} -E env LC_CTYPE=Bad ${CMAKE_COMMAND} -P ${RunCMake_SOURCE_DIR}/Locale.cmake) + run_cmake_command(LocalePOSIX-UTF8 ${CMAKE_COMMAND} -E env LC_CTYPE=POSIX ${CMAKE_COMMAND} -P ${RunCMake_SOURCE_DIR}/Locale.cmake) + unset(RunCMake-stdout-file) +endif() + run_cmake(UnitTest) run_cmake(Exherbo) run_cmake(Ubuntu)