mirror of
https://github.com/Kitware/CMake.git
synced 2026-01-02 20:00:38 -06:00
try_compile: Restore expansion of ;-list in COMPILE_DEFINITIONS
The quoting added by commit8c5221fb1f(try_compile: Preserve special characters in COMPILE_DEFINITIONS, 2019-01-21, v3.14.0-rc1~108^2~3) broke the case that the `COMPILE_DEFINITIONS` value contains a `;`. Without the quoting the `;` would be generated literally in an unquoted argument in the test `CMakeLists.txt` file and would then be expanded. With quoting the `;` is preserved, which is not the old behavior. Fix this by expanding the `;`-list ahead of time. Add test cases for behavior with both `#` and `;`. This was noticed with the PGI compiler where we set `CMAKE_CXX*_STANDARD_COMPILE_OPTION` to values like `--c++17;-A`. The symptom had also been observed while preparing commitef8f237686(ParseImplicitIncludeInfo: add SunPro Fortran and PGI compiler, Cray fix, 2019-01-29, v3.14.0-rc1~26^2~2) but was not recognized at the time as a regression. Revert the workaround added by that commit. Fixes: #18919
This commit is contained in:
@@ -8,13 +8,13 @@ string(APPEND CMAKE_C_FLAGS_MINSIZEREL_INIT " -DNDEBUG")
|
||||
string(APPEND CMAKE_C_FLAGS_RELEASE_INIT " -DNDEBUG")
|
||||
|
||||
if (CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 8.1)
|
||||
set(CMAKE_C90_STANDARD_COMPILE_OPTION "-h noc99,conform")
|
||||
set(CMAKE_C90_EXTENSION_COMPILE_OPTION "-h noc99,gnu")
|
||||
set(CMAKE_C99_STANDARD_COMPILE_OPTION "-h c99,conform")
|
||||
set(CMAKE_C99_EXTENSION_COMPILE_OPTION "-h c99,gnu")
|
||||
set(CMAKE_C90_STANDARD_COMPILE_OPTION -h noc99,conform)
|
||||
set(CMAKE_C90_EXTENSION_COMPILE_OPTION -h noc99,gnu)
|
||||
set(CMAKE_C99_STANDARD_COMPILE_OPTION -h c99,conform)
|
||||
set(CMAKE_C99_EXTENSION_COMPILE_OPTION -h c99,gnu)
|
||||
if (CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 8.5)
|
||||
set(CMAKE_C11_STANDARD_COMPILE_OPTION "-h std=c11,conform")
|
||||
set(CMAKE_C11_EXTENSION_COMPILE_OPTION "-h std=c11,gnu")
|
||||
set(CMAKE_C11_STANDARD_COMPILE_OPTION -h std=c11,conform)
|
||||
set(CMAKE_C11_EXTENSION_COMPILE_OPTION -h std=c11,gnu)
|
||||
endif ()
|
||||
endif ()
|
||||
|
||||
|
||||
@@ -8,15 +8,15 @@ string(APPEND CMAKE_CXX_FLAGS_MINSIZEREL_INIT " -DNDEBUG")
|
||||
string(APPEND CMAKE_CXX_FLAGS_RELEASE_INIT " -DNDEBUG")
|
||||
|
||||
if (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 8.1)
|
||||
set(CMAKE_CXX98_STANDARD_COMPILE_OPTION "-h conform")
|
||||
set(CMAKE_CXX98_EXTENSION_COMPILE_OPTION "-h gnu")
|
||||
set(CMAKE_CXX98_STANDARD_COMPILE_OPTION -h conform)
|
||||
set(CMAKE_CXX98_EXTENSION_COMPILE_OPTION -h gnu)
|
||||
if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 8.4)
|
||||
set(CMAKE_CXX11_STANDARD_COMPILE_OPTION "-h std=c++11")
|
||||
set(CMAKE_CXX11_EXTENSION_COMPILE_OPTION "-h std=c++11,gnu")
|
||||
set(CMAKE_CXX11_STANDARD_COMPILE_OPTION -h std=c++11)
|
||||
set(CMAKE_CXX11_EXTENSION_COMPILE_OPTION -h std=c++11,gnu)
|
||||
endif()
|
||||
if(NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 8.6)
|
||||
set(CMAKE_CXX14_STANDARD_COMPILE_OPTION "-h std=c++14")
|
||||
set(CMAKE_CXX14_EXTENSION_COMPILE_OPTION "-h std=c++14,gnu")
|
||||
set(CMAKE_CXX14_STANDARD_COMPILE_OPTION -h std=c++14)
|
||||
set(CMAKE_CXX14_EXTENSION_COMPILE_OPTION -h std=c++14,gnu)
|
||||
endif ()
|
||||
endif ()
|
||||
|
||||
|
||||
@@ -226,7 +226,7 @@ int cmCoreTryCompile::TryCompileCode(std::vector<std::string> const& argv,
|
||||
} else if (doing == DoingCMakeFlags) {
|
||||
cmakeFlags.push_back(argv[i]);
|
||||
} else if (doing == DoingCompileDefinitions) {
|
||||
compileDefs.push_back(argv[i]);
|
||||
cmSystemTools::ExpandListArgument(argv[i], compileDefs);
|
||||
} else if (doing == DoingLinkOptions) {
|
||||
linkOptions.push_back(argv[i]);
|
||||
} else if (doing == DoingLinkLibraries) {
|
||||
|
||||
@@ -165,6 +165,35 @@ try_compile(TEST_INNER
|
||||
OUTPUT_VARIABLE output)
|
||||
TEST_ASSERT(TEST_INNER "try_compile project mode failed:\n${output}")
|
||||
|
||||
try_compile(COMPILE_DEFINITIONS_LIST_EXPANDED
|
||||
${TryCompile_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp
|
||||
${TryCompile_SOURCE_DIR}/check_a_b.c
|
||||
OUTPUT_VARIABLE output
|
||||
COMPILE_DEFINITIONS "-DDEF_A;-DDEF_B"
|
||||
)
|
||||
if(COMPILE_DEFINITIONS_LIST_EXPANDED)
|
||||
message(STATUS "COMPILE_DEFINITIONS list expanded correctly")
|
||||
else()
|
||||
string(REPLACE "\n" "\n " output " ${output}")
|
||||
message(SEND_ERROR "COMPILE_DEFINITIONS list did not expand correctly\n${output}")
|
||||
endif()
|
||||
|
||||
try_compile(SHOULD_FAIL_DUE_TO_BAD_SOURCE
|
||||
${TryCompile_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp
|
||||
${TryCompile_SOURCE_DIR}/pass.c
|
||||
OUTPUT_VARIABLE output
|
||||
COMPILE_DEFINITIONS "bad#source.c"
|
||||
)
|
||||
if(SHOULD_FAIL_DUE_TO_BAD_SOURCE AND NOT CMAKE_GENERATOR MATCHES "Watcom WMake|NMake Makefiles")
|
||||
string(REPLACE "\n" "\n " output " ${output}")
|
||||
message(SEND_ERROR "try_compile with bad#source.c did not fail:\n${output}")
|
||||
elseif(NOT output MATCHES [[(bad#source\.c|bad\\)]])
|
||||
string(REPLACE "\n" "\n " output " ${output}")
|
||||
message(SEND_ERROR "try_compile with bad#source.c failed without mentioning bad source:\n${output}")
|
||||
else()
|
||||
message(STATUS "try_compile with bad#source.c correctly failed")
|
||||
endif()
|
||||
|
||||
add_executable(TryCompile pass.c)
|
||||
|
||||
######################################
|
||||
|
||||
10
Tests/TryCompile/check_a_b.c
Normal file
10
Tests/TryCompile/check_a_b.c
Normal file
@@ -0,0 +1,10 @@
|
||||
#ifndef DEF_A
|
||||
# error DEF_A not defined
|
||||
#endif
|
||||
#ifndef DEF_B
|
||||
# error DEF_B not defined
|
||||
#endif
|
||||
int main()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user