1
0
mirror of https://github.com/Kitware/CMake.git synced 2025-10-20 21:40:15 +08:00

Makefiles: Do not use '\#' escape sequence with Windows-style make tools

Since commit fbf7a92975 (Makefile: Handle '#' in COMPILE_OPTIONS,
2014-08-12, v3.1.0-rc1~174^2) we escape `#` as `\#` in `flags.make`
variable assignments so that they are not treated as a comment.
Windows-style make tools like NMake do not interpret backslashes
in that way.  Other means will be needed to handle `#` in contexts
where it is even possible.  The test suite is not covering this
for NMake anyway, and actually has a workaround in `Tests/TryCompile`
for the old behavior, which we can now update.
This commit is contained in:
Brad King
2020-04-14 08:15:30 -04:00
parent 1639ee70ef
commit af7de05853
5 changed files with 21 additions and 5 deletions

View File

@@ -46,6 +46,7 @@ public:
bool AllowNotParallel() const override { return false; } bool AllowNotParallel() const override { return false; }
bool AllowDeleteOnError() const override { return false; } bool AllowDeleteOnError() const override { return false; }
bool CanEscapeOctothorpe() const override { return true; }
protected: protected:
std::vector<GeneratedMakeCommand> GenerateBuildCommand( std::vector<GeneratedMakeCommand> GenerateBuildCommand(

View File

@@ -117,6 +117,12 @@ void cmGlobalUnixMakefileGenerator3::ComputeTargetObjectDirectory(
gt->ObjectDirectory = dir; gt->ObjectDirectory = dir;
} }
bool cmGlobalUnixMakefileGenerator3::CanEscapeOctothorpe() const
{
// Make tools that use UNIX-style '/' paths also support '\' escaping.
return this->ForceUnixPaths;
}
void cmGlobalUnixMakefileGenerator3::Configure() void cmGlobalUnixMakefileGenerator3::Configure()
{ {
// Initialize CMAKE_EDIT_COMMAND cache entry. // Initialize CMAKE_EDIT_COMMAND cache entry.

View File

@@ -157,6 +157,9 @@ public:
/** Does the make tool tolerate .DELETE_ON_ERROR? */ /** Does the make tool tolerate .DELETE_ON_ERROR? */
virtual bool AllowDeleteOnError() const { return true; } virtual bool AllowDeleteOnError() const { return true; }
/** Does the make tool interpret '\#' as '#'? */
virtual bool CanEscapeOctothorpe() const;
bool IsIPOSupported() const override { return true; } bool IsIPOSupported() const override { return true; }
void ComputeTargetObjectDirectory(cmGeneratorTarget* gt) const override; void ComputeTargetObjectDirectory(cmGeneratorTarget* gt) const override;

View File

@@ -341,12 +341,16 @@ void cmMakefileTargetGenerator::WriteTargetLanguageFlags()
<< "\n"; << "\n";
} }
bool const escapeOctothorpe = this->GlobalGenerator->CanEscapeOctothorpe();
for (std::string const& language : languages) { for (std::string const& language : languages) {
std::string defines = this->GetDefines(language, this->GetConfigName()); std::string defines = this->GetDefines(language, this->GetConfigName());
std::string includes = this->GetIncludes(language, this->GetConfigName()); std::string includes = this->GetIncludes(language, this->GetConfigName());
if (escapeOctothorpe) {
// Escape comment characters so they do not terminate assignment. // Escape comment characters so they do not terminate assignment.
cmSystemTools::ReplaceString(defines, "#", "\\#"); cmSystemTools::ReplaceString(defines, "#", "\\#");
cmSystemTools::ReplaceString(includes, "#", "\\#"); cmSystemTools::ReplaceString(includes, "#", "\\#");
}
*this->FlagFileStream << language << "_DEFINES = " << defines << "\n\n"; *this->FlagFileStream << language << "_DEFINES = " << defines << "\n\n";
*this->FlagFileStream << language << "_INCLUDES = " << includes << "\n\n"; *this->FlagFileStream << language << "_INCLUDES = " << includes << "\n\n";
@@ -357,7 +361,9 @@ void cmMakefileTargetGenerator::WriteTargetLanguageFlags()
for (const std::string& arch : architectures) { for (const std::string& arch : architectures) {
std::string flags = std::string flags =
this->GetFlags(language, this->GetConfigName(), arch); this->GetFlags(language, this->GetConfigName(), arch);
if (escapeOctothorpe) {
cmSystemTools::ReplaceString(flags, "#", "\\#"); cmSystemTools::ReplaceString(flags, "#", "\\#");
}
*this->FlagFileStream << language << "_FLAGS" << arch << " = " << flags *this->FlagFileStream << language << "_FLAGS" << arch << " = " << flags
<< "\n\n"; << "\n\n";
} }

View File

@@ -187,7 +187,7 @@ try_compile(SHOULD_FAIL_DUE_TO_BAD_SOURCE
if(SHOULD_FAIL_DUE_TO_BAD_SOURCE AND NOT CMAKE_GENERATOR MATCHES "Watcom WMake|NMake Makefiles") if(SHOULD_FAIL_DUE_TO_BAD_SOURCE AND NOT CMAKE_GENERATOR MATCHES "Watcom WMake|NMake Makefiles")
string(REPLACE "\n" "\n " output " ${output}") string(REPLACE "\n" "\n " output " ${output}")
message(SEND_ERROR "try_compile with bad#source.c did not fail:\n${output}") message(SEND_ERROR "try_compile with bad#source.c did not fail:\n${output}")
elseif(NOT output MATCHES [[(bad#source\.c|bad\\)]]) elseif(NOT output MATCHES [[(bad#source\.c|bad\.c|bad')]])
string(REPLACE "\n" "\n " output " ${output}") string(REPLACE "\n" "\n " output " ${output}")
message(SEND_ERROR "try_compile with bad#source.c failed without mentioning bad source:\n${output}") message(SEND_ERROR "try_compile with bad#source.c failed without mentioning bad source:\n${output}")
else() else()