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:
@@ -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(
|
||||||
|
@@ -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.
|
||||||
|
@@ -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;
|
||||||
|
@@ -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";
|
||||||
}
|
}
|
||||||
|
@@ -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()
|
||||||
|
Reference in New Issue
Block a user