Browse Source

Makefile: Handle '#' in COMPILE_OPTIONS (#15070)

Teach the Makefile generators to escape '#' characters on the right hand
side of variable assignments in flags.make.  This is needed for flags
like '-Wno-error=#warnings'.  Otherwise the make tool treats them as
comments and leaves them out of the _FLAGS variable value.

Add a case to the CompileOptions test covering '#' in a COMPILE_OPTIONS
value, at least on compilers where it is known to be supported.
Brad King 11 years ago
parent
commit
fbf7a92975

+ 7 - 3
Source/cmMakefileTargetGenerator.cxx

@@ -361,9 +361,13 @@ void cmMakefileTargetGenerator::WriteTargetLanguageFlags()
   for(std::set<std::string>::const_iterator l = languages.begin();
       l != languages.end(); ++l)
     {
-    *this->FlagFileStream << *l << "_FLAGS = " << this->GetFlags(*l) << "\n\n";
-    *this->FlagFileStream << *l << "_DEFINES = " << this->GetDefines(*l) <<
-      "\n\n";
+    std::string flags = this->GetFlags(*l);
+    std::string defines = this->GetDefines(*l);
+    // Escape comment characters so they do not terminate assignment.
+    cmSystemTools::ReplaceString(flags, "#", "\\#");
+    cmSystemTools::ReplaceString(defines, "#", "\\#");
+    *this->FlagFileStream << *l << "_FLAGS = " << flags << "\n\n";
+    *this->FlagFileStream << *l << "_DEFINES = " << defines << "\n\n";
     }
 }
 

+ 6 - 0
Tests/CompileOptions/CMakeLists.txt

@@ -22,6 +22,12 @@ set_property(TARGET CompileOptions PROPERTY COMPILE_OPTIONS
   ${cxx_tests}
   )
 
+if(CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang|Borland")
+  set_property(TARGET CompileOptions APPEND PROPERTY COMPILE_OPTIONS
+    "-DTEST_OCTOTHORPE=\"#\""
+    )
+endif()
+
 target_link_libraries(CompileOptions testlib)
 
 if(CMAKE_CXX_COMPILER_ID MATCHES "GNU")

+ 3 - 0
Tests/CompileOptions/main.cpp

@@ -17,6 +17,9 @@
 int main()
 {
   return (strcmp(NEEDS_ESCAPE, "E$CAPE") == 0
+#ifdef TEST_OCTOTHORPE
+      && strcmp(TEST_OCTOTHORPE, "#") == 0
+#endif
       && strcmp(EXPECTED_C_COMPILER_VERSION, TEST_C_COMPILER_VERSION) == 0
       && strcmp(EXPECTED_CXX_COMPILER_VERSION, TEST_CXX_COMPILER_VERSION) == 0
       && TEST_C_COMPILER_VERSION_EQUALITY == 1