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 AllowDeleteOnError() const override { return false; }
|
||||
bool CanEscapeOctothorpe() const override { return true; }
|
||||
|
||||
protected:
|
||||
std::vector<GeneratedMakeCommand> GenerateBuildCommand(
|
||||
|
@@ -117,6 +117,12 @@ void cmGlobalUnixMakefileGenerator3::ComputeTargetObjectDirectory(
|
||||
gt->ObjectDirectory = dir;
|
||||
}
|
||||
|
||||
bool cmGlobalUnixMakefileGenerator3::CanEscapeOctothorpe() const
|
||||
{
|
||||
// Make tools that use UNIX-style '/' paths also support '\' escaping.
|
||||
return this->ForceUnixPaths;
|
||||
}
|
||||
|
||||
void cmGlobalUnixMakefileGenerator3::Configure()
|
||||
{
|
||||
// Initialize CMAKE_EDIT_COMMAND cache entry.
|
||||
|
@@ -157,6 +157,9 @@ public:
|
||||
/** Does the make tool tolerate .DELETE_ON_ERROR? */
|
||||
virtual bool AllowDeleteOnError() const { return true; }
|
||||
|
||||
/** Does the make tool interpret '\#' as '#'? */
|
||||
virtual bool CanEscapeOctothorpe() const;
|
||||
|
||||
bool IsIPOSupported() const override { return true; }
|
||||
|
||||
void ComputeTargetObjectDirectory(cmGeneratorTarget* gt) const override;
|
||||
|
@@ -341,12 +341,16 @@ void cmMakefileTargetGenerator::WriteTargetLanguageFlags()
|
||||
<< "\n";
|
||||
}
|
||||
|
||||
bool const escapeOctothorpe = this->GlobalGenerator->CanEscapeOctothorpe();
|
||||
|
||||
for (std::string const& language : languages) {
|
||||
std::string defines = this->GetDefines(language, this->GetConfigName());
|
||||
std::string includes = this->GetIncludes(language, this->GetConfigName());
|
||||
if (escapeOctothorpe) {
|
||||
// Escape comment characters so they do not terminate assignment.
|
||||
cmSystemTools::ReplaceString(defines, "#", "\\#");
|
||||
cmSystemTools::ReplaceString(includes, "#", "\\#");
|
||||
}
|
||||
*this->FlagFileStream << language << "_DEFINES = " << defines << "\n\n";
|
||||
*this->FlagFileStream << language << "_INCLUDES = " << includes << "\n\n";
|
||||
|
||||
@@ -357,7 +361,9 @@ void cmMakefileTargetGenerator::WriteTargetLanguageFlags()
|
||||
for (const std::string& arch : architectures) {
|
||||
std::string flags =
|
||||
this->GetFlags(language, this->GetConfigName(), arch);
|
||||
if (escapeOctothorpe) {
|
||||
cmSystemTools::ReplaceString(flags, "#", "\\#");
|
||||
}
|
||||
*this->FlagFileStream << language << "_FLAGS" << arch << " = " << flags
|
||||
<< "\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")
|
||||
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\\)]])
|
||||
elseif(NOT output MATCHES [[(bad#source\.c|bad\.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()
|
||||
|
Reference in New Issue
Block a user