diff options
author | Deniz Bahadir <deniz@code.bahadir.email> | 2023-11-06 22:41:23 (GMT) |
---|---|---|
committer | Deniz Bahadir <deniz@code.bahadir.email> | 2023-11-06 22:41:23 (GMT) |
commit | cbddc66277d162ed4a152724baf0878451e79cf9 (patch) | |
tree | 772b748d578fefa2e27543786a4b82c6b43c0cd9 /Tests/RunCMake/VS10Project | |
parent | dea37a4e7df2d433c90d78a5df303f94eeda9e0f (diff) | |
download | CMake-cbddc66277d162ed4a152724baf0878451e79cf9.zip CMake-cbddc66277d162ed4a152724baf0878451e79cf9.tar.gz CMake-cbddc66277d162ed4a152724baf0878451e79cf9.tar.bz2 |
VS: Consider macros with values when determining CharacterSet
In order to determine what character-set (Unicode, Multi-Byte, none)
shall be set in the generated `*.vcxproj` files, CMake checks if one of
the macros `_UNICODE` or `_SBCS` are defined.
However, as these macros can be defined with or without a value, the
check should always recognize these macros whether they are defined with
a value or without. That is now assured by this commit.
Fixes: #25379
Diffstat (limited to 'Tests/RunCMake/VS10Project')
-rw-r--r-- | Tests/RunCMake/VS10Project/RunCMakeTest.cmake | 3 | ||||
-rw-r--r-- | Tests/RunCMake/VS10Project/VsCharacterSet-check.cmake | 49 | ||||
-rw-r--r-- | Tests/RunCMake/VS10Project/VsCharacterSet.cmake | 17 |
3 files changed, 69 insertions, 0 deletions
diff --git a/Tests/RunCMake/VS10Project/RunCMakeTest.cmake b/Tests/RunCMake/VS10Project/RunCMakeTest.cmake index 669049a..e0d74cf 100644 --- a/Tests/RunCMake/VS10Project/RunCMakeTest.cmake +++ b/Tests/RunCMake/VS10Project/RunCMakeTest.cmake @@ -11,6 +11,9 @@ run_cmake(CustomCommandGenex) if(NOT RunCMake_GENERATOR MATCHES "^Visual Studio 1[1-5] ") run_cmake(CustomCommandParallel) endif() +run_cmake_with_options(VsCharacterSet -DSET_CHARSET=MultiByte) +run_cmake_with_options(VsCharacterSet -DSET_CHARSET=Unicode) +run_cmake_with_options(VsCharacterSet -DSET_CHARSET=NotSet) run_cmake(VsCsharpSourceGroup) run_cmake(VsCSharpCompilerOpts) run_cmake(ExplicitCMakeLists) diff --git a/Tests/RunCMake/VS10Project/VsCharacterSet-check.cmake b/Tests/RunCMake/VS10Project/VsCharacterSet-check.cmake new file mode 100644 index 0000000..93770a1 --- /dev/null +++ b/Tests/RunCMake/VS10Project/VsCharacterSet-check.cmake @@ -0,0 +1,49 @@ +macro(check_project_file projectFile outvar) + set(insideConfiguration FALSE) + set(characterSetFound FALSE) + + if(NOT EXISTS "${projectFile}") + set(RunCMake_TEST_FAILED "Project file ${projectFile} does not exist.") + return() + endif() + + string(REPLACE "${RunCMake_TEST_BINARY_DIR}/" "" projectName ${projectFile}) + + file(STRINGS "${projectFile}" lines) + foreach(line IN LISTS lines) + if(line MATCHES "^ *<PropertyGroup Condition=\"'[$][(]Configuration[)]|[$][(]Platform[)]'=='([^\"])+\" Label=\"Configuration\">.*$") + set(insideConfiguration TRUE) + elseif(insideConfiguration) + if(line MATCHES "^ *</PropertyGroup>.*$") + set(insideConfiguration FALSE) + elseif(line MATCHES "^ *<CharacterSet>(.+)</CharacterSet>*$") + message(STATUS "Found CharacterSet = ${CMAKE_MATCH_1} in PropertyGroup 'Configuration' in ${projectName}") + set(characterSetFound TRUE) + set(${outvar} ${CMAKE_MATCH_1}) + endif() + endif() + endforeach() + if(NOT characterSetFound) + set(RunCMake_TEST_FAILED "CharacterSet not found in \"Configuration\" propertygroup in ${projectName}") + return() # This should intentionally return from the caller, not the macro + endif() +endmacro() + +check_project_file("${RunCMake_TEST_BINARY_DIR}/CMakeFiles/${CMAKE_VERSION}/CompilerIdCXX/CompilerIdCXX.vcxproj" MULTI_BYTE_CHARSET) +check_project_file("${RunCMake_TEST_BINARY_DIR}/foo.vcxproj" OVERRIDDEN_CHARSET) + +if (NOT "${MULTI_BYTE_CHARSET}" STREQUAL "MultiByte") + set(RunCMake_TEST_FAILED "Default character-set (\"MultiByte\") was overridden (it shouldn't)") + return() +endif() + +if(NOT EXISTS "${RunCMake_TEST_BINARY_DIR}/set_charset.txt") + set(RunCMake_TEST_FAILED "File 'set_charset.txt' with set charset does not exist.") + return() +endif() +file(STRINGS "${RunCMake_TEST_BINARY_DIR}/set_charset.txt" SET_CHARSET) + +if (NOT "${OVERRIDDEN_CHARSET}" STREQUAL "${SET_CHARSET}") + set(RunCMake_TEST_FAILED "Failed to override the character-set with \"${SET_CHARSET}\"") + return() +endif() diff --git a/Tests/RunCMake/VS10Project/VsCharacterSet.cmake b/Tests/RunCMake/VS10Project/VsCharacterSet.cmake new file mode 100644 index 0000000..c8c3e0e --- /dev/null +++ b/Tests/RunCMake/VS10Project/VsCharacterSet.cmake @@ -0,0 +1,17 @@ +enable_language(CXX) + +# Write value of `SET_CHARSET` for comparison later. +file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/set_charset.txt" "${SET_CHARSET}") + +# Set macro which determines the character-set. +if("${SET_CHARSET}" STREQUAL "MultiByte") + add_compile_definitions(_MBCS=1) +endif() +if("${SET_CHARSET}" STREQUAL "NotSet") + add_compile_definitions(_SBCS=1) +endif() +if("${SET_CHARSET}" STREQUAL "Unicode") + add_compile_definitions(_UNICODE=1) +endif() + +add_library(foo foo.cpp) |