cmake_host_system_information: Add query for the locale's charset

Issue: #27562
This commit is contained in:
Brad King
2026-02-11 11:56:05 -05:00
parent d284ce2fd6
commit b02ae60a76
19 changed files with 71 additions and 0 deletions
@@ -108,6 +108,7 @@ set(CMake_TEST_IPO_WORKS_Fortran "ON" CACHE BOOL "")
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_Qt5 "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 "")
@@ -4,6 +4,7 @@ if (NOT "$ENV{CMAKE_CI_NIGHTLY}" STREQUAL "")
set(CMake_TEST_CPACK_APPIMAGE_RUNTIME_FILE "$ENV{CI_PROJECT_DIR}/.gitlab/appimagetool/lib/appimagetool/runtime" CACHE FILEPATH "")
set(CMake_TEST_ISPC "ON" CACHE STRING "")
endif()
set(CMake_TEST_LOCALE_CHARSET "UTF-8" CACHE STRING "")
set(CMake_TEST_MODULE_COMPILATION "named,compile_commands,collation,partitions,internal_partitions,export_bmi,install_bmi,shared,bmionly,build_database" CACHE STRING "")
set(CMake_TEST_Rust "ON" CACHE STRING "")
set(CMake_TEST_TLS_VERIFY_URL "https://gitlab.kitware.com" CACHE STRING "")
@@ -6,6 +6,7 @@ set(CMake_TEST_FindOpenMP "ON" CACHE BOOL "")
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_TLS_VERIFY_URL "https://gitlab.kitware.com" CACHE STRING "")
set(CMake_TEST_TLS_VERIFY_URL_BAD "https://badtls-expired.kitware.com" CACHE STRING "")
set(CMake_TEST_TLS_VERSION "1.2" CACHE STRING "")
@@ -9,6 +9,7 @@ set(CMake_TEST_GUI "ON" CACHE BOOL "")
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_TLS_VERIFY_URL "https://gitlab.kitware.com" CACHE STRING "")
set(CMake_TEST_TLS_VERIFY_URL_BAD "https://badtls-expired.kitware.com" CACHE STRING "")
set(CMake_TEST_TLS_VERSION "1.2" CACHE STRING "")
@@ -2,6 +2,7 @@ set(BUILD_QtDialog ON CACHE BOOL "")
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(Python_FIND_REGISTRY NEVER CACHE STRING "")
include("${CMAKE_CURRENT_LIST_DIR}/configure_common.cmake")
+3
View File
@@ -1,3 +1,6 @@
if test "$CMAKE_CI_NIGHTLY" = "true"; then
source .gitlab/ci/ispc-env.sh
fi
# Test in a Latin-1 locale.
export LANG=en_US.ISO-8859-1
+3
View File
@@ -2,3 +2,6 @@ if test "$CMAKE_CI_NIGHTLY" = "true"; then
source .gitlab/ci/appimagetool-env.sh
source .gitlab/ci/ispc-env.sh
fi
# Test in a UTF-8 locale.
export LANG=en_US.UTF-8
@@ -137,6 +137,17 @@ queried. The list of queried values is stored in ``<variable>``.
Human readable full processor description
``LOCALE_CHARSET``
.. versionadded:: 4.3
The locale's character set, if known, otherwise empty.
This is the :ref:`encoding <CMake Language Encoding>` expected
in :manual:`cmake-language(7)` files and scripts:
* On Windows, this is always ``UTF-8``.
* On UNIX and macOS, this is based on the current locale.
``OS_NAME``
.. versionadded:: 3.10
+5
View File
@@ -78,6 +78,11 @@ Furthermore, CMake 3.0 and above allow a leading UTF-8
.. _Byte-Order Mark: https://en.wikipedia.org/wiki/Byte_order_mark
.. versionadded:: 4.3
The :command:`cmake_host_system_information` command's ``LOCALE_CHARSET``
query returns the expected character set encoding.
Source Files
------------
+6
View File
@@ -0,0 +1,6 @@
cmake-locale
------------
* The :command:`cmake_host_system_information` command gained a
``LOCALE_CHARSET`` query for the expected :manual:`cmake-language(7)`
script encoding.
@@ -15,6 +15,10 @@
#include <cm/type_traits>
#include <cmext/string_view>
#if !defined(_WIN32)
# include <langinfo.h>
#endif
#include "cmsys/FStream.hxx"
#include "cmsys/Glob.hxx"
#include "cmsys/String.h"
@@ -74,6 +78,22 @@ cm::optional<std::string> GetValue(cmsys::SystemInformation& info,
if (key == "FQDN"_s) {
return ValueToString(info.GetFullyQualifiedDomainName());
}
if (key == "LOCALE_CHARSET"_s) {
#if defined(_WIN32)
// On Windows we always use UTF-8.
return ValueToString("UTF-8");
#else
// On non-Windows platforms we use the locale's encoding.
if (char const* charset = nl_langinfo(CODESET)) {
if (cmsysString_strcasecmp(charset, "utf-8") == 0 ||
cmsysString_strcasecmp(charset, "utf8") == 0) {
charset = "UTF-8";
}
return ValueToString(charset);
}
return ValueToString("");
#endif
}
if (key == "TOTAL_VIRTUAL_MEMORY"_s) {
return ValueToString(info.GetTotalVirtualMemory());
}
+3
View File
@@ -685,6 +685,9 @@ if(WIN32)
endif()
add_RunCMake_test(execute_process)
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(CMake_TEST_MSYSTEM_PREFIX)
list(APPEND cmake_host_system_information_ARGS -DCMake_TEST_MSYSTEM_PREFIX=${CMake_TEST_MSYSTEM_PREFIX})
endif()
@@ -0,0 +1 @@
^-- LOCALE_CHARSET='ISO-8859-1'$
@@ -0,0 +1 @@
^-- LOCALE_CHARSET='UTF-8'$
@@ -0,0 +1 @@
^-- LOCALE_CHARSET='[^']+'$
@@ -0,0 +1,2 @@
cmake_host_system_information(RESULT charset QUERY LOCALE_CHARSET)
message(STATUS "LOCALE_CHARSET='${charset}'")
@@ -23,6 +23,7 @@
-- PROCESSOR_SERIAL_NUMBER=`.*`
-- PROCESSOR_NAME=`.*`
-- PROCESSOR_DESCRIPTION=`.*`
-- LOCALE_CHARSET=`[^`]+`
-- OS_NAME=`.*`
-- OS_RELEASE=`.*`
-- OS_VERSION=`.*`
@@ -28,6 +28,7 @@ try_and_print(HAS_L1_CACHE)
try_and_print(PROCESSOR_SERIAL_NUMBER)
try_and_print(PROCESSOR_NAME)
try_and_print(PROCESSOR_DESCRIPTION)
try_and_print(LOCALE_CHARSET)
try_and_print(OS_NAME)
try_and_print(OS_RELEASE)
try_and_print(OS_VERSION)
@@ -7,6 +7,14 @@ run_cmake(BadArg3)
run_cmake(QueryList)
run_cmake(QueryKeys)
if(CMake_TEST_LOCALE_CHARSET STREQUAL "UTF-8" OR CMAKE_HOST_WIN32)
set(RunCMake-stdout-file Locale-stdout-utf-8.txt)
elseif(CMake_TEST_LOCALE_CHARSET STREQUAL "ISO-8859-1")
set(RunCMake-stdout-file Locale-stdout-iso-8859-1.txt)
endif()
run_cmake_script(Locale)
unset(RunCMake-stdout-file)
run_cmake(UnitTest)
run_cmake(Exherbo)
run_cmake(Ubuntu)