Merge topic 'ninja-no-phony-sources'
93371ed5 Ninja: Skip generating empty phony rules 7243c951 Ninja: Don't limit custom cmd side-effects to build folder (#14972) a33cf6d0 Ninja: Consider only custom commands deps as side-effects (#14972)
This commit is contained in:
commit
e4767a2b6d
@ -151,11 +151,6 @@ void cmGlobalNinjaGenerator::WriteBuild(std::ostream& os,
|
||||
++i)
|
||||
{
|
||||
arguments += " " + EncodeIdent(EncodePath(*i), os);
|
||||
|
||||
//we need to track every dependency that comes in, since we are trying
|
||||
//to find dependencies that are side effects of build commands
|
||||
//
|
||||
this->CombinedBuildExplicitDependencies.insert( EncodePath(*i) );
|
||||
}
|
||||
|
||||
// Write implicit dependencies.
|
||||
@ -280,6 +275,13 @@ cmGlobalNinjaGenerator::WriteCustomCommandBuild(const std::string& command,
|
||||
cmNinjaDeps(),
|
||||
orderOnly,
|
||||
vars);
|
||||
|
||||
//we need to track every dependency that comes in, since we are trying
|
||||
//to find dependencies that are side effects of build commands
|
||||
for(cmNinjaDeps::const_iterator i = deps.begin(); i != deps.end(); ++i)
|
||||
{
|
||||
this->CombinedCustomCommandExplicitDependencies.insert( EncodePath(*i) );
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
@ -1015,43 +1017,33 @@ void cmGlobalNinjaGenerator::WriteUnknownExplicitDependencies(std::ostream& os)
|
||||
//to keep this data around
|
||||
this->CombinedBuildOutputs.clear();
|
||||
|
||||
//now we difference with CombinedBuildExplicitDependencies to find
|
||||
//now we difference with CombinedCustomCommandExplicitDependencies to find
|
||||
//the list of items we know nothing about.
|
||||
//We have encoded all the paths in CombinedBuildExplicitDependencies
|
||||
//We have encoded all the paths in CombinedCustomCommandExplicitDependencies
|
||||
//and knownDependencies so no matter if unix or windows paths they
|
||||
//should all match now.
|
||||
|
||||
std::vector<std::string> unkownExplicitDepends;
|
||||
this->CombinedBuildExplicitDependencies.erase("all");
|
||||
this->CombinedCustomCommandExplicitDependencies.erase("all");
|
||||
|
||||
std::set_difference(this->CombinedBuildExplicitDependencies.begin(),
|
||||
this->CombinedBuildExplicitDependencies.end(),
|
||||
std::set_difference(this->CombinedCustomCommandExplicitDependencies.begin(),
|
||||
this->CombinedCustomCommandExplicitDependencies.end(),
|
||||
knownDependencies.begin(),
|
||||
knownDependencies.end(),
|
||||
std::back_inserter(unkownExplicitDepends));
|
||||
|
||||
|
||||
std::string const rootBuildDirectory =
|
||||
this->GetCMakeInstance()->GetHomeOutputDirectory();
|
||||
for (std::vector<std::string>::const_iterator
|
||||
i = unkownExplicitDepends.begin();
|
||||
i != unkownExplicitDepends.end();
|
||||
++i)
|
||||
{
|
||||
//verify the file is in the build directory
|
||||
std::string const absDepPath = cmSystemTools::CollapseFullPath(
|
||||
i->c_str(), rootBuildDirectory.c_str());
|
||||
bool const inBuildDir = cmSystemTools::IsSubDirectory(absDepPath.c_str(),
|
||||
rootBuildDirectory.c_str());
|
||||
if(inBuildDir)
|
||||
{
|
||||
cmNinjaDeps deps(1,*i);
|
||||
this->WritePhonyBuild(os,
|
||||
"",
|
||||
deps,
|
||||
deps);
|
||||
}
|
||||
}
|
||||
cmNinjaDeps deps(1,*i);
|
||||
this->WritePhonyBuild(os,
|
||||
"",
|
||||
deps,
|
||||
deps);
|
||||
}
|
||||
}
|
||||
|
||||
void cmGlobalNinjaGenerator::WriteBuiltinTargets(std::ostream& os)
|
||||
|
@ -363,10 +363,11 @@ private:
|
||||
/// The set of custom command outputs we have seen.
|
||||
std::set<std::string> CustomCommandOutputs;
|
||||
|
||||
//The combined explicit dependencies of all build commands that the global
|
||||
//generator has issued. When combined with CombinedBuildOutputs it allows
|
||||
//us to detect the set of explicit dependencies that have
|
||||
std::set<std::string> CombinedBuildExplicitDependencies;
|
||||
/// The combined explicit dependencies of custom build commands
|
||||
std::set<std::string> CombinedCustomCommandExplicitDependencies;
|
||||
|
||||
/// When combined with CombinedCustomCommandExplicitDependencies it allows
|
||||
/// us to detect the set of explicit dependencies that have
|
||||
std::set<std::string> CombinedBuildOutputs;
|
||||
|
||||
/// The mapping from source file to assumed dependencies.
|
||||
|
@ -542,22 +542,24 @@ cmNinjaTargetGenerator
|
||||
std::back_inserter(orderOnlyDeps), MapToNinjaPath());
|
||||
}
|
||||
|
||||
cmNinjaDeps orderOnlyTarget;
|
||||
orderOnlyTarget.push_back(this->OrderDependsTargetForTarget());
|
||||
this->GetGlobalGenerator()->WritePhonyBuild(this->GetBuildFileStream(),
|
||||
"Order-only phony target for "
|
||||
+ this->GetTargetName(),
|
||||
orderOnlyTarget,
|
||||
cmNinjaDeps(),
|
||||
cmNinjaDeps(),
|
||||
orderOnlyDeps);
|
||||
|
||||
if (!orderOnlyDeps.empty())
|
||||
{
|
||||
cmNinjaDeps orderOnlyTarget;
|
||||
orderOnlyTarget.push_back(this->OrderDependsTargetForTarget());
|
||||
this->GetGlobalGenerator()->WritePhonyBuild(this->GetBuildFileStream(),
|
||||
"Order-only phony target for "
|
||||
+ this->GetTargetName(),
|
||||
orderOnlyTarget,
|
||||
cmNinjaDeps(),
|
||||
cmNinjaDeps(),
|
||||
orderOnlyDeps);
|
||||
}
|
||||
std::vector<cmSourceFile const*> objectSources;
|
||||
this->GeneratorTarget->GetObjectSources(objectSources, config);
|
||||
for(std::vector<cmSourceFile const*>::const_iterator
|
||||
si = objectSources.begin(); si != objectSources.end(); ++si)
|
||||
{
|
||||
this->WriteObjectBuildStatement(*si);
|
||||
this->WriteObjectBuildStatement(*si, !orderOnlyDeps.empty());
|
||||
}
|
||||
std::string def = this->GeneratorTarget->GetModuleDefinitionFile(config);
|
||||
if(!def.empty())
|
||||
@ -570,7 +572,8 @@ cmNinjaTargetGenerator
|
||||
|
||||
void
|
||||
cmNinjaTargetGenerator
|
||||
::WriteObjectBuildStatement(cmSourceFile const* source)
|
||||
::WriteObjectBuildStatement(
|
||||
cmSourceFile const* source, bool writeOrderDependsTargetForTarget)
|
||||
{
|
||||
std::string comment;
|
||||
const std::string language = source->GetLanguage();
|
||||
@ -599,7 +602,10 @@ cmNinjaTargetGenerator
|
||||
}
|
||||
|
||||
cmNinjaDeps orderOnlyDeps;
|
||||
orderOnlyDeps.push_back(this->OrderDependsTargetForTarget());
|
||||
if (writeOrderDependsTargetForTarget)
|
||||
{
|
||||
orderOnlyDeps.push_back(this->OrderDependsTargetForTarget());
|
||||
}
|
||||
|
||||
// If the source file is GENERATED and does not have a custom command
|
||||
// (either attached to this source file or another one), assume that one of
|
||||
|
@ -114,7 +114,8 @@ protected:
|
||||
void WriteLanguageRules(const std::string& language);
|
||||
void WriteCompileRule(const std::string& language);
|
||||
void WriteObjectBuildStatements();
|
||||
void WriteObjectBuildStatement(cmSourceFile const* source);
|
||||
void WriteObjectBuildStatement(cmSourceFile const* source,
|
||||
bool writeOrderDependsTargetForTarget);
|
||||
void WriteCustomCommandBuildStatement(cmCustomCommand *cc);
|
||||
|
||||
cmNinjaDeps GetObjects() const
|
||||
|
Loading…
x
Reference in New Issue
Block a user