diff options
author | Brad King <brad.king@kitware.com> | 2019-09-27 15:48:58 (GMT) |
---|---|---|
committer | Brad King <brad.king@kitware.com> | 2019-09-30 14:34:23 (GMT) |
commit | 742084337010ed26c19132a8b9d96e9e4891f9f6 (patch) | |
tree | 6416fe543c99104f585c9ec4126a4e403da19398 /Source | |
parent | d713bcb6427381ab8743084726196a4eed96c135 (diff) | |
download | CMake-742084337010ed26c19132a8b9d96e9e4891f9f6.zip CMake-742084337010ed26c19132a8b9d96e9e4891f9f6.tar.gz CMake-742084337010ed26c19132a8b9d96e9e4891f9f6.tar.bz2 |
Makefiles: Fix EXCLUDE_FROM_ALL OFF on sub/sub/tgt in sub/all
Defer adding a test to a later commit after all generators have been
fixed.
Issue: #19753
Co-Author: Sebastian Holtermann <sebholt@xwmw.org>
Diffstat (limited to 'Source')
-rw-r--r-- | Source/cmGlobalUnixMakefileGenerator3.cxx | 89 | ||||
-rw-r--r-- | Source/cmGlobalUnixMakefileGenerator3.h | 4 |
2 files changed, 31 insertions, 62 deletions
diff --git a/Source/cmGlobalUnixMakefileGenerator3.cxx b/Source/cmGlobalUnixMakefileGenerator3.cxx index df4673d..4c2d69f 100644 --- a/Source/cmGlobalUnixMakefileGenerator3.cxx +++ b/Source/cmGlobalUnixMakefileGenerator3.cxx @@ -230,17 +230,14 @@ void cmGlobalUnixMakefileGenerator3::WriteMainMakefile2() depends.push_back(this->EmptyRuleHackDepends); } - // Write and empty all: - lg->WriteMakeRule(makefileStream, "The main recursive all target", "all", - depends, no_commands, true); - - // Write an empty preinstall: - lg->WriteMakeRule(makefileStream, "The main recursive preinstall target", - "preinstall", depends, no_commands, true); - // Write out the "special" stuff lg->WriteSpecialTargetsTop(makefileStream); + // Write the directory level rules. + for (auto const& it : this->ComputeDirectoryTargets()) { + this->WriteDirectoryRules2(makefileStream, it.second); + } + // Write the target convenience rules for (cmLocalGenerator* localGen : this->LocalGenerators) { this->WriteConvenienceRules2( @@ -396,44 +393,37 @@ void cmGlobalUnixMakefileGenerator3::WriteMainCMakefileLanguageRules( } void cmGlobalUnixMakefileGenerator3::WriteDirectoryRule2( - std::ostream& ruleFileStream, cmLocalUnixMakefileGenerator3* lg, - const char* pass, bool check_all, bool check_relink, - std::vector<std::string> const& commands) + std::ostream& ruleFileStream, DirectoryTarget const& dt, const char* pass, + bool check_all, bool check_relink, std::vector<std::string> const& commands) { - // Get the relative path to the subdirectory from the top. + auto* lg = static_cast<cmLocalUnixMakefileGenerator3*>(dt.LG); std::string makeTarget = cmStrCat(lg->GetCurrentBinaryDirectory(), '/', pass); // The directory-level rule should depend on the target-level rules // for all targets in the directory. std::vector<std::string> depends; - for (cmGeneratorTarget* gtarget : lg->GetGeneratorTargets()) { - int type = gtarget->GetType(); - if ((type == cmStateEnums::EXECUTABLE) || - (type == cmStateEnums::STATIC_LIBRARY) || - (type == cmStateEnums::SHARED_LIBRARY) || - (type == cmStateEnums::MODULE_LIBRARY) || - (type == cmStateEnums::OBJECT_LIBRARY) || - (type == cmStateEnums::UTILITY)) { - // Add this to the list of depends rules in this directory. - if ((!check_all || !gtarget->GetPropertyAsBool("EXCLUDE_FROM_ALL")) && - (!check_relink || - gtarget->NeedRelinkBeforeInstall(lg->GetConfigName()))) { - std::string tname = - cmStrCat(lg->GetRelativeTargetDirectory(gtarget), '/', pass); - depends.push_back(std::move(tname)); - } + for (DirectoryTarget::Target const& t : dt.Targets) { + // Add this to the list of depends rules in this directory. + if ((!check_all || !t.ExcludeFromAll) && + (!check_relink || + t.GT->NeedRelinkBeforeInstall(lg->GetConfigName()))) { + // The target may be from a different directory; use its local gen. + auto const* tlg = static_cast<cmLocalUnixMakefileGenerator3 const*>( + t.GT->GetLocalGenerator()); + std::string tname = + cmStrCat(tlg->GetRelativeTargetDirectory(t.GT), '/', pass); + depends.push_back(std::move(tname)); } } // The directory-level rule should depend on the directory-level // rules of the subdirectories. - for (cmStateSnapshot const& c : lg->GetStateSnapshot().GetChildren()) { - if (check_all && c.GetDirectory().GetPropertyAsBool("EXCLUDE_FROM_ALL")) { + for (DirectoryTarget::Dir const& d : dt.Children) { + if (check_all && d.ExcludeFromAll) { continue; } - std::string subdir = - cmStrCat(c.GetDirectory().GetCurrentBinary(), '/', pass); + std::string subdir = cmStrCat(d.Path, '/', pass); depends.push_back(std::move(subdir)); } @@ -455,8 +445,9 @@ void cmGlobalUnixMakefileGenerator3::WriteDirectoryRule2( } void cmGlobalUnixMakefileGenerator3::WriteDirectoryRules2( - std::ostream& ruleFileStream, cmLocalUnixMakefileGenerator3* lg) + std::ostream& ruleFileStream, DirectoryTarget const& dt) { + auto* lg = static_cast<cmLocalUnixMakefileGenerator3*>(dt.LG); // Begin the directory-level rules section. { std::string dir = @@ -471,19 +462,17 @@ void cmGlobalUnixMakefileGenerator3::WriteDirectoryRules2( ruleFileStream << "\n\n"; } - if (!lg->IsRootMakefile()) { - // Write directory-level rules for "all". - this->WriteDirectoryRule2(ruleFileStream, lg, "all", true, false); + // Write directory-level rules for "all". + this->WriteDirectoryRule2(ruleFileStream, dt, "all", true, false); - // Write directory-level rules for "preinstall". - this->WriteDirectoryRule2(ruleFileStream, lg, "preinstall", true, true); - } + // Write directory-level rules for "preinstall". + this->WriteDirectoryRule2(ruleFileStream, dt, "preinstall", true, true); // Write directory-level rules for "clean". { std::vector<std::string> cmds; lg->AppendDirectoryCleanCommand(cmds); - this->WriteDirectoryRule2(ruleFileStream, lg, "clean", false, false, cmds); + this->WriteDirectoryRule2(ruleFileStream, dt, "clean", false, false, cmds); } } @@ -630,9 +619,6 @@ void cmGlobalUnixMakefileGenerator3::WriteConvenienceRules2( std::string localName; std::string makeTargetName; - // write the directory level rules for this local gen - this->WriteDirectoryRules2(ruleFileStream, lg); - bool regenerate = !this->GlobalSettingIsOn("CMAKE_SUPPRESS_REGENERATION"); if (regenerate) { depends.emplace_back("cmake_check_build_system"); @@ -698,15 +684,6 @@ void cmGlobalUnixMakefileGenerator3::WriteConvenienceRules2( lg->WriteMakeRule(ruleFileStream, "All Build rule for target.", localName, depends, commands, true); - // add the all/all dependency - if (!this->IsExcluded(this->LocalGenerators[0], gtarget)) { - depends.clear(); - depends.push_back(localName); - commands.clear(); - lg->WriteMakeRule(ruleFileStream, "Include target in all.", "all", - depends, commands, true); - } - // Write the rule. commands.clear(); @@ -760,14 +737,6 @@ void cmGlobalUnixMakefileGenerator3::WriteConvenienceRules2( lg->WriteMakeRule(ruleFileStream, "Pre-install relink rule for target.", localName, depends, commands, true); - - if (!this->IsExcluded(this->LocalGenerators[0], gtarget)) { - depends.clear(); - depends.push_back(localName); - commands.clear(); - lg->WriteMakeRule(ruleFileStream, "Prepare target for install.", - "preinstall", depends, commands, true); - } } // add the clean rule diff --git a/Source/cmGlobalUnixMakefileGenerator3.h b/Source/cmGlobalUnixMakefileGenerator3.h index 6a39509..79db30e 100644 --- a/Source/cmGlobalUnixMakefileGenerator3.h +++ b/Source/cmGlobalUnixMakefileGenerator3.h @@ -164,11 +164,11 @@ protected: cmLocalUnixMakefileGenerator3*); void WriteDirectoryRule2(std::ostream& ruleFileStream, - cmLocalUnixMakefileGenerator3* lg, const char* pass, + DirectoryTarget const& dt, const char* pass, bool check_all, bool check_relink, std::vector<std::string> const& commands = {}); void WriteDirectoryRules2(std::ostream& ruleFileStream, - cmLocalUnixMakefileGenerator3* lg); + DirectoryTarget const& dt); void AppendGlobalTargetDepends(std::vector<std::string>& depends, cmGeneratorTarget* target); |