From de8e534b4141e0300c0329c47387de9635e3024f Mon Sep 17 00:00:00 2001 From: Brad King Date: Wed, 8 Oct 2014 08:49:05 -0400 Subject: Ninja: Limit custom command side-effects to build folder Revert commit 7243c951 (Ninja: Don't limit custom cmd side-effects to build folder, 2014-06-27) because it causes every custom command dependency in the source tree to get a phony rule. For large projects these rules get too big for Ninja to handle efficiently. While the original change addressed a valid concern, it did not seem to occur regularly in practice because well-behaved projects generate their side-effects only in the build tree. Until we support explicit specification of side-effects (CMake issue #14963), we will have to use this as a middle-ground. --- Source/cmGlobalNinjaGenerator.cxx | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/Source/cmGlobalNinjaGenerator.cxx b/Source/cmGlobalNinjaGenerator.cxx index f391203..6e7b06b 100644 --- a/Source/cmGlobalNinjaGenerator.cxx +++ b/Source/cmGlobalNinjaGenerator.cxx @@ -1042,17 +1042,27 @@ void cmGlobalNinjaGenerator::WriteUnknownExplicitDependencies(std::ostream& os) std::back_inserter(unkownExplicitDepends)); + std::string const rootBuildDirectory = + this->GetCMakeInstance()->GetHomeOutputDirectory(); for (std::vector::const_iterator i = unkownExplicitDepends.begin(); i != unkownExplicitDepends.end(); ++i) { - cmNinjaDeps deps(1,*i); - this->WritePhonyBuild(os, - "", - deps, - deps); - } + //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); + } + } } void cmGlobalNinjaGenerator::WriteBuiltinTargets(std::ostream& os) -- cgit v0.12