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.
This commit is contained in:
Brad King 2014-08-12 13:26:03 -04:00
parent 1f8cfc3b5f
commit fbf7a92975
3 changed files with 16 additions and 3 deletions

View File

@ -361,9 +361,13 @@ void cmMakefileTargetGenerator::WriteTargetLanguageFlags()
for(std::set<std::string>::const_iterator l = languages.begin(); for(std::set<std::string>::const_iterator l = languages.begin();
l != languages.end(); ++l) l != languages.end(); ++l)
{ {
*this->FlagFileStream << *l << "_FLAGS = " << this->GetFlags(*l) << "\n\n"; std::string flags = this->GetFlags(*l);
*this->FlagFileStream << *l << "_DEFINES = " << this->GetDefines(*l) << std::string defines = this->GetDefines(*l);
"\n\n"; // 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";
} }
} }

View File

@ -22,6 +22,12 @@ set_property(TARGET CompileOptions PROPERTY COMPILE_OPTIONS
${cxx_tests} ${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) target_link_libraries(CompileOptions testlib)
if(CMAKE_CXX_COMPILER_ID MATCHES "GNU") if(CMAKE_CXX_COMPILER_ID MATCHES "GNU")

View File

@ -17,6 +17,9 @@
int main() int main()
{ {
return (strcmp(NEEDS_ESCAPE, "E$CAPE") == 0 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_C_COMPILER_VERSION, TEST_C_COMPILER_VERSION) == 0
&& strcmp(EXPECTED_CXX_COMPILER_VERSION, TEST_CXX_COMPILER_VERSION) == 0 && strcmp(EXPECTED_CXX_COMPILER_VERSION, TEST_CXX_COMPILER_VERSION) == 0
&& TEST_C_COMPILER_VERSION_EQUALITY == 1 && TEST_C_COMPILER_VERSION_EQUALITY == 1