Переглянути джерело

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
Brad King 6 роки тому
батько
коміт
cde2596a19

+ 6 - 6
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 ()
 

+ 6 - 6
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 ()
 

+ 1 - 1
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) {

+ 29 - 0
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)
 
 ######################################

+ 10 - 0
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;
+}