|
|
@@ -35,6 +35,30 @@
|
|
|
#include <memory> // auto_ptr
|
|
|
#include <queue>
|
|
|
|
|
|
+//----------------------------------------------------------------------------
|
|
|
+// Escape special characters in Makefile dependency lines
|
|
|
+class cmMakeSafe
|
|
|
+{
|
|
|
+public:
|
|
|
+ cmMakeSafe(const char* s): Data(s) {}
|
|
|
+ cmMakeSafe(std::string const& s): Data(s.c_str()) {}
|
|
|
+private:
|
|
|
+ const char* Data;
|
|
|
+ friend std::ostream& operator<<(std::ostream& os,
|
|
|
+ cmMakeSafe const& self)
|
|
|
+ {
|
|
|
+ for(const char* c = self.Data; *c; ++c)
|
|
|
+ {
|
|
|
+ switch (*c)
|
|
|
+ {
|
|
|
+ case '=': os << "$(EQUALS)"; break;
|
|
|
+ default: os << *c; break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return os;
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
//----------------------------------------------------------------------------
|
|
|
// Helper function used below.
|
|
|
static std::string cmSplitExtension(std::string const& in, std::string& base)
|
|
|
@@ -555,28 +579,13 @@ cmLocalUnixMakefileGenerator3
|
|
|
space = " ";
|
|
|
}
|
|
|
|
|
|
- // Warn about paths not supported by Make tools.
|
|
|
- std::string::size_type pos = tgt.find_first_of("=");
|
|
|
- if(pos != std::string::npos)
|
|
|
- {
|
|
|
- cmOStringStream m;
|
|
|
- m <<
|
|
|
- "Make rule for\n"
|
|
|
- " " << tgt << "\n"
|
|
|
- "has '=' on left hand side. "
|
|
|
- "The make tool may not support this.";
|
|
|
- cmListFileBacktrace bt;
|
|
|
- this->GlobalGenerator->GetCMakeInstance()
|
|
|
- ->IssueMessage(cmake::WARNING, m.str(), bt);
|
|
|
- }
|
|
|
-
|
|
|
// Mark the rule as symbolic if requested.
|
|
|
if(symbolic)
|
|
|
{
|
|
|
if(const char* sym =
|
|
|
this->Makefile->GetDefinition("CMAKE_MAKE_SYMBOLIC_RULE"))
|
|
|
{
|
|
|
- os << tgt.c_str() << space << ": " << sym << "\n";
|
|
|
+ os << cmMakeSafe(tgt) << space << ": " << sym << "\n";
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -584,7 +593,7 @@ cmLocalUnixMakefileGenerator3
|
|
|
if(depends.empty())
|
|
|
{
|
|
|
// No dependencies. The commands will always run.
|
|
|
- os << tgt.c_str() << space << ":\n";
|
|
|
+ os << cmMakeSafe(tgt) << space << ":\n";
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
@@ -595,7 +604,7 @@ cmLocalUnixMakefileGenerator3
|
|
|
{
|
|
|
replace = *dep;
|
|
|
replace = this->Convert(replace.c_str(),HOME_OUTPUT,MAKEFILE);
|
|
|
- os << tgt.c_str() << space << ": " << replace.c_str() << "\n";
|
|
|
+ os << cmMakeSafe(tgt) << space << ": " << cmMakeSafe(replace) << "\n";
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -608,7 +617,7 @@ cmLocalUnixMakefileGenerator3
|
|
|
}
|
|
|
if(symbolic && !this->WatcomWMake)
|
|
|
{
|
|
|
- os << ".PHONY : " << tgt.c_str() << "\n";
|
|
|
+ os << ".PHONY : " << cmMakeSafe(tgt) << "\n";
|
|
|
}
|
|
|
os << "\n";
|
|
|
// Add the output to the local help if requested.
|
|
|
@@ -687,6 +696,10 @@ cmLocalUnixMakefileGenerator3
|
|
|
<< this->ConvertShellCommand(cmakecommand, FULL)
|
|
|
<< " -E remove -f\n"
|
|
|
<< "\n";
|
|
|
+ makefileStream
|
|
|
+ << "# Escaping for special characters.\n"
|
|
|
+ << "EQUALS = =\n"
|
|
|
+ << "\n";
|
|
|
|
|
|
if(const char* edit_cmd =
|
|
|
this->Makefile->GetDefinition("CMAKE_EDIT_COMMAND"))
|