Ninja: work with ninja/master, don't compile rc files with cl
Ninja generates for paths with spaces wrong results for $out.d, using the new DEP_FILE variable instead.
This commit is contained in:
parent
12cc6434bf
commit
43200c145d
|
@ -872,6 +872,13 @@ cmLocalGenerator::ExpandRuleVariable(std::string const& variable,
|
||||||
return replaceValues.TargetPDB;
|
return replaceValues.TargetPDB;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if(replaceValues.DependencyFile )
|
||||||
|
{
|
||||||
|
if(variable == "DEP_FILE")
|
||||||
|
{
|
||||||
|
return replaceValues.DependencyFile;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if(replaceValues.Target)
|
if(replaceValues.Target)
|
||||||
{
|
{
|
||||||
|
|
|
@ -235,6 +235,7 @@ public:
|
||||||
const char* LanguageCompileFlags;
|
const char* LanguageCompileFlags;
|
||||||
const char* Defines;
|
const char* Defines;
|
||||||
const char* RuleLauncher;
|
const char* RuleLauncher;
|
||||||
|
const char* DependencyFile;
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Set whether to treat conversions to SHELL as a link script shell. */
|
/** Set whether to treat conversions to SHELL as a link script shell. */
|
||||||
|
|
|
@ -55,21 +55,6 @@ cmNinjaNormalTargetGenerator::~cmNinjaNormalTargetGenerator()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
cmNinjaNormalTargetGenerator
|
|
||||||
::EnsureDirectoryExists(const std::string& dir)
|
|
||||||
{
|
|
||||||
cmSystemTools::MakeDirectory(dir.c_str());
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
cmNinjaNormalTargetGenerator
|
|
||||||
::EnsureParentDirectoryExists(const std::string& path)
|
|
||||||
{
|
|
||||||
EnsureDirectoryExists(cmSystemTools::GetParentDirectory(path.c_str()));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void cmNinjaNormalTargetGenerator::Generate()
|
void cmNinjaNormalTargetGenerator::Generate()
|
||||||
{
|
{
|
||||||
if (!this->TargetLinkLanguage) {
|
if (!this->TargetLinkLanguage) {
|
||||||
|
|
|
@ -35,9 +35,6 @@ private:
|
||||||
void WriteObjectLibStatement();
|
void WriteObjectLibStatement();
|
||||||
std::vector<std::string> ComputeLinkCmd();
|
std::vector<std::string> ComputeLinkCmd();
|
||||||
|
|
||||||
void EnsureDirectoryExists(const std::string& dir);
|
|
||||||
void EnsureParentDirectoryExists(const std::string& path);
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// Target name info.
|
// Target name info.
|
||||||
std::string TargetNameOut;
|
std::string TargetNameOut;
|
||||||
|
|
|
@ -333,19 +333,29 @@ cmNinjaTargetGenerator
|
||||||
vars.Defines = "$DEFINES";
|
vars.Defines = "$DEFINES";
|
||||||
vars.TargetPDB = "$TARGET_PDB";
|
vars.TargetPDB = "$TARGET_PDB";
|
||||||
|
|
||||||
|
|
||||||
cmMakefile* mf = this->GetMakefile();
|
cmMakefile* mf = this->GetMakefile();
|
||||||
|
|
||||||
bool useClDeps = false;
|
bool useClDeps = false;
|
||||||
const char* clDepsBinary = mf->GetDefinition("CMAKE_CMCLDEPS_EXECUTABLE");
|
std::string clDepsBinary;
|
||||||
const char* clShowPrefix = mf->GetDefinition("CMAKE_CL_SHOWINCLUDE_PREFIX");
|
std::string clShowPrefix;
|
||||||
const char* projectName = mf->GetProjectName();
|
if (lang == "C" || lang == "CXX")
|
||||||
if (clDepsBinary && clShowPrefix)
|
|
||||||
{
|
{
|
||||||
useClDeps = true;
|
const char* depsPtr = mf->GetDefinition("CMAKE_CMCLDEPS_EXECUTABLE");
|
||||||
if (projectName && std::string(projectName) == "CMAKE_TRY_COMPILE")
|
const char* showPtr = mf->GetDefinition("CMAKE_CL_SHOWINCLUDE_PREFIX");
|
||||||
|
if (depsPtr && showPtr)
|
||||||
{
|
{
|
||||||
// don't wrap for try_compile,
|
// don't wrap for try_compile,
|
||||||
// TODO but why doesn't it work with cmcldeps?
|
// TODO but why doesn't it work with cmcldeps?
|
||||||
useClDeps = false;
|
const std::string projectName = mf->GetProjectName() ?
|
||||||
|
mf->GetProjectName() : "";
|
||||||
|
if (projectName != "CMAKE_TRY_COMPILE")
|
||||||
|
{
|
||||||
|
useClDeps = true;
|
||||||
|
clDepsBinary = depsPtr;
|
||||||
|
clShowPrefix = showPtr;
|
||||||
|
vars.DependencyFile = "$DEP_FILE";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -354,15 +364,13 @@ cmNinjaTargetGenerator
|
||||||
std::string depfileFlagsName = "CMAKE_DEPFILE_FLAGS_" + language;
|
std::string depfileFlagsName = "CMAKE_DEPFILE_FLAGS_" + language;
|
||||||
const char *depfileFlags = mf->GetDefinition(depfileFlagsName.c_str());
|
const char *depfileFlags = mf->GetDefinition(depfileFlagsName.c_str());
|
||||||
if (depfileFlags || useClDeps) {
|
if (depfileFlags || useClDeps) {
|
||||||
std::string depfileFlagsStr = depfileFlags ? depfileFlags : "";
|
std::string depFlagsStr = depfileFlags ? depfileFlags : "";
|
||||||
depfile = "$out.d";
|
depfile = "$DEP_FILE";
|
||||||
cmSystemTools::ReplaceString(depfileFlagsStr, "<DEPFILE>",
|
cmSystemTools::ReplaceString(depFlagsStr, "<DEPFILE>", "\"$DEP_FILE\"");
|
||||||
depfile.c_str());
|
cmSystemTools::ReplaceString(depFlagsStr, "<OBJECT>", "$out");
|
||||||
cmSystemTools::ReplaceString(depfileFlagsStr, "<OBJECT>",
|
cmSystemTools::ReplaceString(depFlagsStr, "<CMAKE_C_COMPILER>",
|
||||||
"$out");
|
|
||||||
cmSystemTools::ReplaceString(depfileFlagsStr, "<CMAKE_C_COMPILER>",
|
|
||||||
mf->GetDefinition("CMAKE_C_COMPILER"));
|
mf->GetDefinition("CMAKE_C_COMPILER"));
|
||||||
flags += " " + depfileFlagsStr;
|
flags += " " + depFlagsStr;
|
||||||
}
|
}
|
||||||
vars.Flags = flags.c_str();
|
vars.Flags = flags.c_str();
|
||||||
|
|
||||||
|
@ -384,9 +392,8 @@ cmNinjaTargetGenerator
|
||||||
|
|
||||||
if(useClDeps)
|
if(useClDeps)
|
||||||
{
|
{
|
||||||
std::string prefix = clShowPrefix;
|
cmdLine = "\"" + clDepsBinary + "\" $in \"$DEP_FILE\" $out \""
|
||||||
cmdLine = "\"" + std::string(clDepsBinary) + "\" $in $out.d $out \""
|
+ clShowPrefix + "\" " + cmdLine;
|
||||||
+ prefix + "\" " + cmdLine;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Write the rule for compiling file of the given language.
|
// Write the rule for compiling file of the given language.
|
||||||
|
@ -509,6 +516,8 @@ cmNinjaTargetGenerator
|
||||||
cmNinjaVars vars;
|
cmNinjaVars vars;
|
||||||
vars["FLAGS"] = this->ComputeFlagsForObject(source, language);
|
vars["FLAGS"] = this->ComputeFlagsForObject(source, language);
|
||||||
vars["DEFINES"] = this->ComputeDefines(source, language);
|
vars["DEFINES"] = this->ComputeDefines(source, language);
|
||||||
|
vars["DEP_FILE"] = objectFileName + ".d";;
|
||||||
|
EnsureParentDirectoryExists(objectFileName);
|
||||||
|
|
||||||
// TODO move to GetTargetPDB
|
// TODO move to GetTargetPDB
|
||||||
cmMakefile* mf = this->GetMakefile();
|
cmMakefile* mf = this->GetMakefile();
|
||||||
|
@ -599,3 +608,17 @@ cmNinjaTargetGenerator
|
||||||
this->ModuleDefinitionFile.c_str()));
|
this->ModuleDefinitionFile.c_str()));
|
||||||
this->LocalGenerator->AppendFlags(flags, flag.c_str());
|
this->LocalGenerator->AppendFlags(flags, flag.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
cmNinjaTargetGenerator
|
||||||
|
::EnsureDirectoryExists(const std::string& dir)
|
||||||
|
{
|
||||||
|
cmSystemTools::MakeDirectory(dir.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
cmNinjaTargetGenerator
|
||||||
|
::EnsureParentDirectoryExists(const std::string& path)
|
||||||
|
{
|
||||||
|
EnsureDirectoryExists(cmSystemTools::GetParentDirectory(path.c_str()));
|
||||||
|
}
|
||||||
|
|
|
@ -111,6 +111,9 @@ protected:
|
||||||
// Helper to add flag for windows .def file.
|
// Helper to add flag for windows .def file.
|
||||||
void AddModuleDefinitionFlag(std::string& flags);
|
void AddModuleDefinitionFlag(std::string& flags);
|
||||||
|
|
||||||
|
void EnsureDirectoryExists(const std::string& dir);
|
||||||
|
void EnsureParentDirectoryExists(const std::string& path);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
cmTarget* Target;
|
cmTarget* Target;
|
||||||
cmGeneratorTarget* GeneratorTarget;
|
cmGeneratorTarget* GeneratorTarget;
|
||||||
|
|
Loading…
Reference in New Issue