diff options
author | Brad King <brad.king@kitware.com> | 2019-02-14 13:16:20 (GMT) |
---|---|---|
committer | Brad King <brad.king@kitware.com> | 2019-02-15 11:21:19 (GMT) |
commit | cde2596a19861e52d6ef0f98dcc0b70ba572573e (patch) | |
tree | 7c64bb0af7ded7b028c9320c49fa3bf21b271a37 | |
parent | 6f23321d405930241fa431cfda7650f2993f0c19 (diff) | |
download | CMake-cde2596a19861e52d6ef0f98dcc0b70ba572573e.zip CMake-cde2596a19861e52d6ef0f98dcc0b70ba572573e.tar.gz CMake-cde2596a19861e52d6ef0f98dcc0b70ba572573e.tar.bz2 |
try_compile: Restore expansion of ;-list in COMPILE_DEFINITIONS
The quoting added by commit 8c5221fb1f (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 commit ef8f237686
(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
-rw-r--r-- | Modules/Compiler/Cray-C.cmake | 12 | ||||
-rw-r--r-- | Modules/Compiler/Cray-CXX.cmake | 12 | ||||
-rw-r--r-- | Source/cmCoreTryCompile.cxx | 2 | ||||
-rw-r--r-- | Tests/TryCompile/CMakeLists.txt | 29 | ||||
-rw-r--r-- | Tests/TryCompile/check_a_b.c | 10 |
5 files changed, 52 insertions, 13 deletions
diff --git a/Modules/Compiler/Cray-C.cmake b/Modules/Compiler/Cray-C.cmake index b3c96ee..d34154c 100644 --- a/Modules/Compiler/Cray-C.cmake +++ b/Modules/Compiler/Cray-C.cmake @@ -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 () diff --git a/Modules/Compiler/Cray-CXX.cmake b/Modules/Compiler/Cray-CXX.cmake index bbb5718..85a3167 100644 --- a/Modules/Compiler/Cray-CXX.cmake +++ b/Modules/Compiler/Cray-CXX.cmake @@ -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 () diff --git a/Source/cmCoreTryCompile.cxx b/Source/cmCoreTryCompile.cxx index bd110ec..eb52895 100644 --- a/Source/cmCoreTryCompile.cxx +++ b/Source/cmCoreTryCompile.cxx @@ -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) { diff --git a/Tests/TryCompile/CMakeLists.txt b/Tests/TryCompile/CMakeLists.txt index 184a7be..54e96a2 100644 --- a/Tests/TryCompile/CMakeLists.txt +++ b/Tests/TryCompile/CMakeLists.txt @@ -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) ###################################### diff --git a/Tests/TryCompile/check_a_b.c b/Tests/TryCompile/check_a_b.c new file mode 100644 index 0000000..05fba0f --- /dev/null +++ b/Tests/TryCompile/check_a_b.c @@ -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; +} |