Ninja: Consider only custom commands deps as side-effects (#14972)

Since commit v2.8.12~248^2 (Ninja: Custom Command file depends don't
need to exist before building, 2013-06-07) all explicit dependencies
inside build folder were considered as possible build command
side-effects and phony rules were produced for them in case they don't
exist when starting to build. This is unnecessary since regular compile
inputs need to exist or cmake will fail.  Moreover the exception for
sources having GENERATED property that can be missing is already handled
by WriteAssumedSourceDependencies.

This fixes unwanted phony rules for all regular source files when doing
in-source build, causing Ninja not complain when such files gets missing,
i.e. during development. Also this reduces number of rules in ninja.build.

Now only custom command dependencies are considered as possible side-effects.
This commit is contained in:
Adam Strzelecki 2014-06-27 22:13:50 +02:00 committed by Brad King
parent bf5fc1d582
commit a33cf6d088
2 changed files with 17 additions and 14 deletions

View File

@ -151,11 +151,6 @@ void cmGlobalNinjaGenerator::WriteBuild(std::ostream& os,
++i) ++i)
{ {
arguments += " " + EncodeIdent(EncodePath(*i), os); 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. // Write implicit dependencies.
@ -280,6 +275,13 @@ cmGlobalNinjaGenerator::WriteCustomCommandBuild(const std::string& command,
cmNinjaDeps(), cmNinjaDeps(),
orderOnly, orderOnly,
vars); 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 void
@ -1015,17 +1017,17 @@ void cmGlobalNinjaGenerator::WriteUnknownExplicitDependencies(std::ostream& os)
//to keep this data around //to keep this data around
this->CombinedBuildOutputs.clear(); 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. //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 //and knownDependencies so no matter if unix or windows paths they
//should all match now. //should all match now.
std::vector<std::string> unkownExplicitDepends; std::vector<std::string> unkownExplicitDepends;
this->CombinedBuildExplicitDependencies.erase("all"); this->CombinedCustomCommandExplicitDependencies.erase("all");
std::set_difference(this->CombinedBuildExplicitDependencies.begin(), std::set_difference(this->CombinedCustomCommandExplicitDependencies.begin(),
this->CombinedBuildExplicitDependencies.end(), this->CombinedCustomCommandExplicitDependencies.end(),
knownDependencies.begin(), knownDependencies.begin(),
knownDependencies.end(), knownDependencies.end(),
std::back_inserter(unkownExplicitDepends)); std::back_inserter(unkownExplicitDepends));

View File

@ -363,10 +363,11 @@ private:
/// The set of custom command outputs we have seen. /// The set of custom command outputs we have seen.
std::set<std::string> CustomCommandOutputs; std::set<std::string> CustomCommandOutputs;
//The combined explicit dependencies of all build commands that the global /// The combined explicit dependencies of custom build commands
//generator has issued. When combined with CombinedBuildOutputs it allows std::set<std::string> CombinedCustomCommandExplicitDependencies;
//us to detect the set of explicit dependencies that have
std::set<std::string> CombinedBuildExplicitDependencies; /// When combined with CombinedCustomCommandExplicitDependencies it allows
/// us to detect the set of explicit dependencies that have
std::set<std::string> CombinedBuildOutputs; std::set<std::string> CombinedBuildOutputs;
/// The mapping from source file to assumed dependencies. /// The mapping from source file to assumed dependencies.