diff options
author | Brad King <brad.king@kitware.com> | 2019-10-01 16:25:01 (GMT) |
---|---|---|
committer | Kitware Robot <kwrobot@kitware.com> | 2019-10-01 16:25:13 (GMT) |
commit | 62d65286e71c58c88646f2f851edf7669fd40a41 (patch) | |
tree | e2ac0c77e9ba02a7fd80f1963617a5b5f00a22e9 /Source | |
parent | ec16afc9e8aed8aebd387c416af5b5eef4ad337a (diff) | |
parent | 8a15e75fe351579314f92dd9d9e2c6faeac5ad71 (diff) | |
download | CMake-62d65286e71c58c88646f2f851edf7669fd40a41.zip CMake-62d65286e71c58c88646f2f851edf7669fd40a41.tar.gz CMake-62d65286e71c58c88646f2f851edf7669fd40a41.tar.bz2 |
Merge topic 'fix-EXCLUDE_FROM_ALL-subdir-all'
8a15e75fe3 Tests: Cover EXCLUDE_FROM_ALL OFF on sub/sub/tgt in sub/all
7420843370 Makefiles: Fix EXCLUDE_FROM_ALL OFF on sub/sub/tgt in sub/all
d713bcb642 Ninja: Factor out per-dir "all" target computation into common generator
a75586c775 Ninja: Simplify top-level "all" target generation
a49cd4d1a7 Ninja: Fix EXCLUDE_FROM_ALL OFF on sub/sub/tgt in sub/all
0733a94f64 Ninja,Makefile: Fix subdir "all" with nested EXCLUDE_FROM_ALL subdir
11fb377eb9 cmLocalUnixMakefileGenerator3: Mark GetRelativeTargetDirectory const
be7857f40d cmLocalCommonGenerator: Mark GetConfigName as const
...
Acked-by: Kitware Robot <kwrobot@kitware.com>
Merge-request: !3869
Diffstat (limited to 'Source')
-rw-r--r-- | Source/cmGlobalCommonGenerator.cxx | 66 | ||||
-rw-r--r-- | Source/cmGlobalCommonGenerator.h | 24 | ||||
-rw-r--r-- | Source/cmGlobalNinjaGenerator.cxx | 96 | ||||
-rw-r--r-- | Source/cmGlobalNinjaGenerator.h | 13 | ||||
-rw-r--r-- | Source/cmGlobalUnixMakefileGenerator3.cxx | 90 | ||||
-rw-r--r-- | Source/cmGlobalUnixMakefileGenerator3.h | 4 | ||||
-rw-r--r-- | Source/cmLocalCommonGenerator.h | 2 | ||||
-rw-r--r-- | Source/cmLocalNinjaGenerator.cxx | 6 | ||||
-rw-r--r-- | Source/cmLocalUnixMakefileGenerator3.cxx | 2 | ||||
-rw-r--r-- | Source/cmLocalUnixMakefileGenerator3.h | 3 |
10 files changed, 156 insertions, 150 deletions
diff --git a/Source/cmGlobalCommonGenerator.cxx b/Source/cmGlobalCommonGenerator.cxx index bf992b4..93ff00b 100644 --- a/Source/cmGlobalCommonGenerator.cxx +++ b/Source/cmGlobalCommonGenerator.cxx @@ -2,6 +2,15 @@ file Copyright.txt or https://cmake.org/licensing for details. */ #include "cmGlobalCommonGenerator.h" +#include "cmGeneratorTarget.h" +#include "cmLocalGenerator.h" +#include "cmStateDirectory.h" +#include "cmStateSnapshot.h" +#include "cmStateTypes.h" +#include "cmStringAlgorithms.h" + +#include <utility> + class cmake; cmGlobalCommonGenerator::cmGlobalCommonGenerator(cmake* cm) @@ -10,3 +19,60 @@ cmGlobalCommonGenerator::cmGlobalCommonGenerator(cmake* cm) } cmGlobalCommonGenerator::~cmGlobalCommonGenerator() = default; + +std::map<std::string, cmGlobalCommonGenerator::DirectoryTarget> +cmGlobalCommonGenerator::ComputeDirectoryTargets() const +{ + std::map<std::string, DirectoryTarget> dirTargets; + for (cmLocalGenerator* lg : this->LocalGenerators) { + std::string const& currentBinaryDir( + lg->GetStateSnapshot().GetDirectory().GetCurrentBinary()); + DirectoryTarget& dirTarget = dirTargets[currentBinaryDir]; + dirTarget.LG = lg; + + // The directory-level rule should depend on the target-level rules + // for all targets in the directory. + for (auto gt : lg->GetGeneratorTargets()) { + cmStateEnums::TargetType const type = gt->GetType(); + if (type != cmStateEnums::EXECUTABLE && + type != cmStateEnums::STATIC_LIBRARY && + type != cmStateEnums::SHARED_LIBRARY && + type != cmStateEnums::MODULE_LIBRARY && + type != cmStateEnums::OBJECT_LIBRARY && + type != cmStateEnums::UTILITY) { + continue; + } + DirectoryTarget::Target t; + t.GT = gt; + if (const char* exclude = gt->GetProperty("EXCLUDE_FROM_ALL")) { + if (cmIsOn(exclude)) { + // This target has been explicitly excluded. + t.ExcludeFromAll = true; + } else { + // This target has been explicitly un-excluded. The directory-level + // rule for every directory between this and the root should depend + // on the target-level rule for this target. + for (cmStateSnapshot dir = + lg->GetStateSnapshot().GetBuildsystemDirectoryParent(); + dir.IsValid(); dir = dir.GetBuildsystemDirectoryParent()) { + std::string const& d = dir.GetDirectory().GetCurrentBinary(); + dirTargets[d].Targets.emplace_back(t); + } + } + } + dirTarget.Targets.emplace_back(t); + } + + // The directory-level rule should depend on the directory-level + // rules of the subdirectories. + for (cmStateSnapshot const& state : lg->GetStateSnapshot().GetChildren()) { + DirectoryTarget::Dir d; + d.Path = state.GetDirectory().GetCurrentBinary(); + d.ExcludeFromAll = + state.GetDirectory().GetPropertyAsBool("EXCLUDE_FROM_ALL"); + dirTarget.Children.emplace_back(std::move(d)); + } + } + + return dirTargets; +} diff --git a/Source/cmGlobalCommonGenerator.h b/Source/cmGlobalCommonGenerator.h index e19118b..de81da7 100644 --- a/Source/cmGlobalCommonGenerator.h +++ b/Source/cmGlobalCommonGenerator.h @@ -7,7 +7,13 @@ #include "cmGlobalGenerator.h" +#include <map> +#include <string> +#include <vector> + class cmake; +class cmGeneratorTarget; +class cmLocalGenerator; /** \class cmGlobalCommonGenerator * \brief Common infrastructure for Makefile and Ninja global generators. @@ -17,6 +23,24 @@ class cmGlobalCommonGenerator : public cmGlobalGenerator public: cmGlobalCommonGenerator(cmake* cm); ~cmGlobalCommonGenerator() override; + + struct DirectoryTarget + { + cmLocalGenerator* LG = nullptr; + struct Target + { + cmGeneratorTarget const* GT = nullptr; + bool ExcludeFromAll = false; + }; + std::vector<Target> Targets; + struct Dir + { + std::string Path; + bool ExcludeFromAll = false; + }; + std::vector<Dir> Children; + }; + std::map<std::string, DirectoryTarget> ComputeDirectoryTargets() const; }; #endif diff --git a/Source/cmGlobalNinjaGenerator.cxx b/Source/cmGlobalNinjaGenerator.cxx index 7bba874..d8fe258 100644 --- a/Source/cmGlobalNinjaGenerator.cxx +++ b/Source/cmGlobalNinjaGenerator.cxx @@ -20,6 +20,7 @@ #include "cmGeneratedFileStream.h" #include "cmGeneratorExpressionEvaluationFile.h" #include "cmGeneratorTarget.h" +#include "cmGlobalGenerator.h" #include "cmListFileCache.h" #include "cmLocalGenerator.h" #include "cmLocalNinjaGenerator.h" @@ -888,16 +889,6 @@ void cmGlobalNinjaGenerator::WriteDisclaimer(std::ostream& os) << cmVersion::GetMinorVersion() << "\n\n"; } -void cmGlobalNinjaGenerator::AddDependencyToAll(cmGeneratorTarget* target) -{ - this->AppendTargetOutputs(target, this->AllDependencies); -} - -void cmGlobalNinjaGenerator::AddDependencyToAll(const std::string& input) -{ - this->AllDependencies.push_back(input); -} - void cmGlobalNinjaGenerator::WriteAssumedSourceDependencies() { for (auto const& asd : this->AssumedSourceDependencies) { @@ -1096,59 +1087,32 @@ void cmGlobalNinjaGenerator::WriteFolderTargets(std::ostream& os) cmGlobalNinjaGenerator::WriteDivider(os); os << "# Folder targets.\n\n"; - std::string const& rootBinaryDir = - this->LocalGenerators[0]->GetBinaryDirectory(); + std::map<std::string, DirectoryTarget> dirTargets = + this->ComputeDirectoryTargets(); - std::map<std::string, cmNinjaDeps> targetsPerFolder; - for (cmLocalGenerator const* lg : this->LocalGenerators) { - std::string const& currentBinaryFolder( - lg->GetStateSnapshot().GetDirectory().GetCurrentBinary()); - - // Do not generate a rule for the root binary dir. - if (currentBinaryFolder == rootBinaryDir) { - continue; - } - - // The directory-level rule should depend on the target-level rules - // for all targets in the directory. - cmNinjaDeps& folderTargets = targetsPerFolder[currentBinaryFolder]; - for (auto gt : lg->GetGeneratorTargets()) { - cmStateEnums::TargetType const type = gt->GetType(); - if ((type == cmStateEnums::EXECUTABLE || - type == cmStateEnums::STATIC_LIBRARY || - type == cmStateEnums::SHARED_LIBRARY || - type == cmStateEnums::MODULE_LIBRARY || - type == cmStateEnums::OBJECT_LIBRARY || - type == cmStateEnums::UTILITY) && - !gt->GetPropertyAsBool("EXCLUDE_FROM_ALL")) { - folderTargets.push_back(gt->GetName()); + for (auto const& it : dirTargets) { + cmNinjaBuild build("phony"); + cmGlobalNinjaGenerator::WriteDivider(os); + std::string const& currentBinaryDir = it.first; + DirectoryTarget const& dt = it.second; + + // Setup target + build.Comment = "Folder: " + currentBinaryDir; + build.Outputs.emplace_back( + this->ConvertToNinjaPath(currentBinaryDir + "/all")); + for (DirectoryTarget::Target const& t : dt.Targets) { + if (!t.ExcludeFromAll) { + this->AppendTargetOutputs(t.GT, build.ExplicitDeps); } } - - // The directory-level rule should depend on the directory-level - // rules of the subdirectories. - for (cmStateSnapshot const& state : lg->GetStateSnapshot().GetChildren()) { - std::string const& currentBinaryDir = - state.GetDirectory().GetCurrentBinary(); - folderTargets.push_back( - this->ConvertToNinjaPath(currentBinaryDir + "/all")); - } - } - - if (!targetsPerFolder.empty()) { - cmNinjaBuild build("phony"); - build.Outputs.emplace_back(""); - for (auto& it : targetsPerFolder) { - cmGlobalNinjaGenerator::WriteDivider(os); - std::string const& currentBinaryDir = it.first; - - // Setup target - build.Comment = "Folder: " + currentBinaryDir; - build.Outputs[0] = this->ConvertToNinjaPath(currentBinaryDir + "/all"); - build.ExplicitDeps = std::move(it.second); - // Write target - this->WriteBuild(os, build); + for (DirectoryTarget::Dir const& d : dt.Children) { + if (!d.ExcludeFromAll) { + build.ExplicitDeps.emplace_back( + this->ConvertToNinjaPath(d.Path + "/all")); + } } + // Write target + this->WriteBuild(os, build); } } @@ -1281,22 +1245,18 @@ void cmGlobalNinjaGenerator::WriteBuiltinTargets(std::ostream& os) cmGlobalNinjaGenerator::WriteDivider(os); os << "# Built-in targets\n\n"; - this->WriteTargetAll(os); + this->WriteTargetDefault(os); this->WriteTargetRebuildManifest(os); this->WriteTargetClean(os); this->WriteTargetHelp(os); } -void cmGlobalNinjaGenerator::WriteTargetAll(std::ostream& os) +void cmGlobalNinjaGenerator::WriteTargetDefault(std::ostream& os) { - cmNinjaBuild build("phony"); - build.Comment = "The main all target."; - build.Outputs.push_back(this->TargetAll); - build.ExplicitDeps = this->AllDependencies; - this->WriteBuild(os, build); - if (!this->HasOutputPathPrefix()) { - cmGlobalNinjaGenerator::WriteDefault(os, build.Outputs, + cmNinjaDeps all; + all.push_back(this->TargetAll); + cmGlobalNinjaGenerator::WriteDefault(os, all, "Make the all target the default."); } } diff --git a/Source/cmGlobalNinjaGenerator.h b/Source/cmGlobalNinjaGenerator.h index dca783f..1bfbffa 100644 --- a/Source/cmGlobalNinjaGenerator.h +++ b/Source/cmGlobalNinjaGenerator.h @@ -17,7 +17,6 @@ #include "cmGeneratedFileStream.h" #include "cmGlobalCommonGenerator.h" -#include "cmGlobalGenerator.h" #include "cmGlobalGeneratorFactory.h" #include "cmNinjaTypes.h" #include "cmPolicies.h" @@ -294,19 +293,12 @@ public: cmNinjaDeps& outputs); void AppendTargetDependsClosure(cmGeneratorTarget const* target, cmNinjaOuts& outputs, bool omit_self); - void AddDependencyToAll(cmGeneratorTarget* target); - void AddDependencyToAll(const std::string& input); const std::vector<cmLocalGenerator*>& GetLocalGenerators() const { return LocalGenerators; } - bool IsExcluded(cmLocalGenerator* root, cmGeneratorTarget* target) - { - return cmGlobalGenerator::IsExcluded(root, target); - } - int GetRuleCmdLength(const std::string& name) { return RuleCmdLength[name]; } void AddTargetAlias(const std::string& alias, cmGeneratorTarget* target); @@ -373,7 +365,7 @@ private: void WriteUnknownExplicitDependencies(std::ostream& os); void WriteBuiltinTargets(std::ostream& os); - void WriteTargetAll(std::ostream& os); + void WriteTargetDefault(std::ostream& os); void WriteTargetRebuildManifest(std::ostream& os); bool WriteTargetCleanAdditional(std::ostream& os); void WriteTargetClean(std::ostream& os); @@ -400,9 +392,6 @@ private: /// Length of rule command, used by rsp file evaluation std::unordered_map<std::string, int> RuleCmdLength; - /// The set of dependencies to add to the "all" target. - cmNinjaDeps AllDependencies; - bool UsingGCCOnWindows = false; /// The set of custom commands we have seen. diff --git a/Source/cmGlobalUnixMakefileGenerator3.cxx b/Source/cmGlobalUnixMakefileGenerator3.cxx index 4ce3d5e..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,41 +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()) { - std::string subdir = - cmStrCat(c.GetDirectory().GetCurrentBinary(), '/', pass); + for (DirectoryTarget::Dir const& d : dt.Children) { + if (check_all && d.ExcludeFromAll) { + continue; + } + std::string subdir = cmStrCat(d.Path, '/', pass); depends.push_back(std::move(subdir)); } @@ -452,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 = @@ -468,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); } } @@ -627,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"); @@ -695,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(); @@ -757,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); diff --git a/Source/cmLocalCommonGenerator.h b/Source/cmLocalCommonGenerator.h index abebbc2..eaef6ab 100644 --- a/Source/cmLocalCommonGenerator.h +++ b/Source/cmLocalCommonGenerator.h @@ -25,7 +25,7 @@ public: std::string wd); ~cmLocalCommonGenerator() override; - std::string const& GetConfigName() { return this->ConfigName; } + std::string const& GetConfigName() const { return this->ConfigName; } std::string GetWorkingDirectory() const { return this->WorkingDirectory; } diff --git a/Source/cmLocalNinjaGenerator.cxx b/Source/cmLocalNinjaGenerator.cxx index fed8be5..187a847 100644 --- a/Source/cmLocalNinjaGenerator.cxx +++ b/Source/cmLocalNinjaGenerator.cxx @@ -88,12 +88,6 @@ void cmLocalNinjaGenerator::Generate() auto tg = cmNinjaTargetGenerator::New(target); if (tg) { tg->Generate(); - // Add the target to "all" if required. - if (!this->GetGlobalNinjaGenerator()->IsExcluded( - this->GetGlobalNinjaGenerator()->GetLocalGenerators()[0], - target)) { - this->GetGlobalNinjaGenerator()->AddDependencyToAll(target); - } } } diff --git a/Source/cmLocalUnixMakefileGenerator3.cxx b/Source/cmLocalUnixMakefileGenerator3.cxx index 1d87e93..c50989e 100644 --- a/Source/cmLocalUnixMakefileGenerator3.cxx +++ b/Source/cmLocalUnixMakefileGenerator3.cxx @@ -809,7 +809,7 @@ void cmLocalUnixMakefileGenerator3::WriteConvenienceRule( } std::string cmLocalUnixMakefileGenerator3::GetRelativeTargetDirectory( - cmGeneratorTarget* target) + cmGeneratorTarget const* target) const { std::string dir = cmStrCat(this->HomeRelativeOutputPath, this->GetTargetDirectory(target)); diff --git a/Source/cmLocalUnixMakefileGenerator3.h b/Source/cmLocalUnixMakefileGenerator3.h index c02c0dc..f2295ef 100644 --- a/Source/cmLocalUnixMakefileGenerator3.h +++ b/Source/cmLocalUnixMakefileGenerator3.h @@ -139,7 +139,8 @@ public: void WriteSpecialTargetsTop(std::ostream& makefileStream); void WriteSpecialTargetsBottom(std::ostream& makefileStream); - std::string GetRelativeTargetDirectory(cmGeneratorTarget* target); + std::string GetRelativeTargetDirectory( + cmGeneratorTarget const* target) const; // File pairs for implicit dependency scanning. The key of the map // is the depender and the value is the explicit dependee. |