Commit dc688857 authored by Zack Galbreath's avatar Zack Galbreath

Pass EXCLUDE_FROM_ALL from directory to targets

When a target is created it now inherits the EXCLUDE_FROM_ALL property
from its directory. This change makes it possible to include a target
in "all", even if its directory has been marked as EXCLUDE_FROM_ALL.
parent bd3685b6
......@@ -7,3 +7,9 @@ A property on a directory that indicates if its targets are excluded
from the default build target. If it is not, then with a Makefile for
example typing make will cause the targets to be built. The same
concept applies to the default build of other generators.
Targets inherit the :prop_tgt:`EXCLUDE_FROM_ALL` property from the directory
that they are created in. When a directory is excluded, all of its targets will
have :prop_tgt:`EXCLUDE_FROM_ALL` set to ``TRUE``. After creating such a target
you can change its :prop_tgt:`EXCLUDE_FROM_ALL` property to ``FALSE``. This
will cause the target to be included in the default build target.
......@@ -8,3 +8,6 @@ the default build target. If it is not, then with a Makefile for
example typing make will cause this target to be built. The same
concept applies to the default build of other generators. Installing
a target with EXCLUDE_FROM_ALL set to true has undefined behavior.
This property is enabled by default for targets that are created in
directories that have :prop_dir:`EXCLUDE_FROM_ALL` set to ``TRUE``.
EXCLUDE_FROM_ALL
----------------
* A target's :prop_tgt:`EXCLUDE_FROM_ALL` property can now override the
setting of its directory. A target will now be built as part of "all"
if its :prop_tgt:`EXCLUDE_FROM_ALL` property is set to ``OFF``, even if its
containing directory is marked as :prop_dir:`EXCLUDE_FROM_ALL`.
......@@ -2034,17 +2034,10 @@ bool cmGlobalGenerator::IsExcluded(cmLocalGenerator* root,
return this->IsExcluded(rootSnp, snp);
}
bool cmGlobalGenerator::IsExcluded(cmLocalGenerator* root,
cmGeneratorTarget* target) const
bool cmGlobalGenerator::IsExcluded(cmGeneratorTarget* target) const
{
if (target->GetType() == cmStateEnums::INTERFACE_LIBRARY ||
target->GetPropertyAsBool("EXCLUDE_FROM_ALL")) {
// This target is excluded from its directory.
return true;
}
// This target is included in its directory. Check whether the
// directory is excluded.
return this->IsExcluded(root, target->GetLocalGenerator());
return target->GetType() == cmStateEnums::INTERFACE_LIBRARY ||
target->GetPropertyAsBool("EXCLUDE_FROM_ALL");
}
void cmGlobalGenerator::GetEnabledLanguages(
......
......@@ -468,7 +468,7 @@ protected:
bool IsExcluded(cmStateSnapshot const& root,
cmStateSnapshot const& snp) const;
bool IsExcluded(cmLocalGenerator* root, cmLocalGenerator* gen) const;
bool IsExcluded(cmLocalGenerator* root, cmGeneratorTarget* target) const;
bool IsExcluded(cmGeneratorTarget* target) const;
virtual void InitializeProgressMarks() {}
struct GlobalTargetInfo
......
......@@ -331,9 +331,9 @@ public:
return LocalGenerators;
}
bool IsExcluded(cmLocalGenerator* root, cmGeneratorTarget* target)
bool IsExcluded(cmGeneratorTarget* target)
{
return cmGlobalGenerator::IsExcluded(root, target);
return cmGlobalGenerator::IsExcluded(target);
}
int GetRuleCmdLength(const std::string& name) { return RuleCmdLength[name]; }
......
......@@ -702,7 +702,7 @@ void cmGlobalUnixMakefileGenerator3::WriteConvenienceRules2(
localName, depends, commands, true);
// add the all/all dependency
if (!this->IsExcluded(this->LocalGenerators[0], gtarget)) {
if (!this->IsExcluded(gtarget)) {
depends.clear();
depends.push_back(localName);
commands.clear();
......@@ -767,7 +767,7 @@ void cmGlobalUnixMakefileGenerator3::WriteConvenienceRules2(
"Pre-install relink rule for target.", localName,
depends, commands, true);
if (!this->IsExcluded(this->LocalGenerators[0], gtarget)) {
if (!this->IsExcluded(gtarget)) {
depends.clear();
depends.push_back(localName);
commands.clear();
......
......@@ -201,7 +201,7 @@ void cmGlobalVisualStudioGenerator::AddExtraIDETargets()
tgt->IsImported()) {
continue;
}
if (!this->IsExcluded(gen[0], tgt)) {
if (!this->IsExcluded(tgt)) {
allBuild->AddUtility(tgt->GetName());
}
}
......
......@@ -522,10 +522,6 @@ void cmGlobalXCodeGenerator::AddExtraTargets(
// now make the allbuild depend on all the non-utility targets
// in the project
for (auto& gen : gens) {
if (this->IsExcluded(root, gen)) {
continue;
}
for (auto target : gen->GetGeneratorTargets()) {
if (target->GetType() == cmStateEnums::GLOBAL_TARGET) {
continue;
......@@ -558,8 +554,7 @@ void cmGlobalXCodeGenerator::AddExtraTargets(
false, "", false, cmMakefile::AcceptObjectLibraryCommands);
}
if (target->GetType() != cmStateEnums::INTERFACE_LIBRARY &&
!target->GetPropertyAsBool("EXCLUDE_FROM_ALL")) {
if (!this->IsExcluded(target)) {
allbuild->AddUtility(target->GetName());
}
}
......
......@@ -90,9 +90,7 @@ void cmLocalNinjaGenerator::Generate()
if (tg) {
tg->Generate();
// Add the target to "all" if required.
if (!this->GetGlobalNinjaGenerator()->IsExcluded(
this->GetGlobalNinjaGenerator()->GetLocalGenerators()[0],
target)) {
if (!this->GetGlobalNinjaGenerator()->IsExcluded(target)) {
this->GetGlobalNinjaGenerator()->AddDependencyToAll(target);
}
delete tg;
......
......@@ -1127,7 +1127,7 @@ cmTarget* cmMakefile::AddUtilityCommand(
// Create a target instance for this utility.
cmTarget* target = this->AddNewTarget(cmStateEnums::UTILITY, utilityName);
target->SetIsGeneratorProvided(origin == TargetOrigin::Generator);
if (excludeFromAll) {
if (excludeFromAll || this->GetPropertyAsBool("EXCLUDE_FROM_ALL")) {
target->SetProperty("EXCLUDE_FROM_ALL", "TRUE");
}
if (!comment) {
......@@ -1662,7 +1662,7 @@ void cmMakefile::AddSubDirectory(const std::string& srcPath,
cmMakefile* subMf = new cmMakefile(this->GlobalGenerator, newSnapshot);
this->GetGlobalGenerator()->AddMakefile(subMf);
if (excludeFromAll) {
if (excludeFromAll || this->GetPropertyAsBool("EXCLUDE_FROM_ALL")) {
subMf->SetProperty("EXCLUDE_FROM_ALL", "TRUE");
}
......@@ -1958,7 +1958,7 @@ cmTarget* cmMakefile::AddLibrary(const std::string& lname,
// over changes in CMakeLists.txt, making the information stale and
// hence useless.
target->ClearDependencyInformation(*this);
if (excludeFromAll) {
if (excludeFromAll || this->GetPropertyAsBool("EXCLUDE_FROM_ALL")) {
target->SetProperty("EXCLUDE_FROM_ALL", "TRUE");
}
target->AddSources(srcs);
......@@ -1971,7 +1971,7 @@ cmTarget* cmMakefile::AddExecutable(const std::string& exeName,
bool excludeFromAll)
{
cmTarget* target = this->AddNewTarget(cmStateEnums::EXECUTABLE, exeName);
if (excludeFromAll) {
if (excludeFromAll || this->GetPropertyAsBool("EXCLUDE_FROM_ALL")) {
target->SetProperty("EXCLUDE_FROM_ALL", "TRUE");
}
target->AddSources(srcs);
......
add_library(bar STATIC bar.cpp)
add_library(foo STATIC foo.cpp)
add_library(baz STATIC foo.cpp)
set_target_properties(baz PROPERTIES EXCLUDE_FROM_ALL OFF)
file(GENERATE
OUTPUT "${CMAKE_BINARY_DIR}/main.txt"
CONTENT "$<TARGET_FILE_NAME:main>")
file(GENERATE
OUTPUT "${CMAKE_BINARY_DIR}/bar.txt"
CONTENT "$<TARGET_FILE_NAME:bar>")
file(GENERATE
OUTPUT "${CMAKE_BINARY_DIR}/baz.txt"
CONTENT "$<TARGET_FILE_NAME:baz>")
target_include_directories(foo PUBLIC .)
# Use globbing to check if exes / libs were built because determining
# exactly where these files will live inside a CMake -P script is
# pretty challenging.
file(READ "${RunCMake_TEST_BINARY_DIR}/main.txt" main_exe)
file(READ "${RunCMake_TEST_BINARY_DIR}/bar.txt" bar_lib)
file(READ "${RunCMake_TEST_BINARY_DIR}/baz.txt" baz_lib)
set(found_main FALSE)
file(GLOB_RECURSE files
LIST_DIRECTORIES FALSE
RELATIVE "${RunCMake_TEST_BINARY_DIR}"
"${RunCMake_TEST_BINARY_DIR}/*")
foreach (file IN LISTS files)
if (file MATCHES "${main_exe}")
set(found_main TRUE)
endif()
endforeach()
if (NOT found_main)
set(RunCMake_TEST_FAILED "'main' missing from ${RunCMake_TEST_BINARY_DIR}")
endif()
set(found_bar FALSE)
set(found_baz FALSE)
file(GLOB_RECURSE files
LIST_DIRECTORIES FALSE
RELATIVE "${RunCMake_TEST_BINARY_DIR}/ExcludeFromAll"
"${RunCMake_TEST_BINARY_DIR}/ExcludeFromAll/*")
foreach (file IN LISTS files)
if (file MATCHES "${bar_lib}")
set(found_bar TRUE)
endif()
if (file MATCHES "${baz_lib}")
set(found_baz TRUE)
endif()
endforeach()
if (found_bar)
set(RunCMake_TEST_FAILED
"'bar' was not excluded from ${RunCMake_TEST_BINARY_DIR}/ExcludeFromAll")
endif()
if (NOT found_baz)
set(RunCMake_TEST_FAILED
"'baz' missing from ${RunCMake_TEST_BINARY_DIR}/ExcludeFromAll")
endif()
......@@ -33,6 +33,7 @@ file(REMOVE_RECURSE "${RunCMake_TEST_BINARY_DIR}")
file(MAKE_DIRECTORY "${RunCMake_TEST_BINARY_DIR}")
run_cmake(ExcludeFromAll)
set(RunCMake-check-file ExcludeFromAll/check.cmake)
run_cmake_command(ExcludeFromAll-build ${CMAKE_COMMAND} --build .)
unset(RunCMake_TEST_BINARY_DIR)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment