mirror of
https://github.com/reactos/CMake.git
synced 2025-01-31 17:12:49 +00:00
Merge branch 'backport-3.14-fix-EXCLUDE_FROM_ALL-subdir-all'
This commit is contained in:
commit
05d7ca14e9
@ -1,15 +1,13 @@
|
||||
EXCLUDE_FROM_ALL
|
||||
----------------
|
||||
|
||||
Exclude the directory from the all target of its parent.
|
||||
Set this directory property to a true value on a subdirectory to exclude
|
||||
its targets from the "all" target of its ancestors. If excluded, running
|
||||
e.g. ``make`` in the parent directory will not build targets the
|
||||
subdirectory by default. This does not affect the "all" target of the
|
||||
subdirectory itself. Running e.g. ``make`` inside the subdirectory will
|
||||
still build its targets.
|
||||
|
||||
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.
|
||||
If the :prop_tgt:`EXCLUDE_FROM_ALL` target property is set on a target
|
||||
then its value determines whether the target is included in the "all"
|
||||
target of this directory and its ancestors.
|
||||
|
@ -1,12 +1,15 @@
|
||||
EXCLUDE_FROM_ALL
|
||||
----------------
|
||||
|
||||
Exclude the target from the all target.
|
||||
Set this target property to a true (or false) value to exclude (or include)
|
||||
the target from the "all" target of the containing directory and its
|
||||
ancestors. If excluded, running e.g. ``make`` in the containing directory
|
||||
or its ancestors will not build the target by default.
|
||||
|
||||
A property on a target that indicates if the target is excluded from
|
||||
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.
|
||||
If this target property is not set then the target will be included in
|
||||
the "all" target of the containing directory. Furthermore, it will be
|
||||
included in the "all" target of its ancestor directories unless the
|
||||
:prop_dir:`EXCLUDE_FROM_ALL` directory property is set.
|
||||
|
||||
With ``EXCLUDE_FROM_ALL`` set to false or not set at all, the target
|
||||
will be brought up to date as part of doing a ``make install`` or its
|
||||
@ -16,6 +19,3 @@ target has undefined behavior. Note that such a target can still safely
|
||||
be listed in an :command:`install(TARGETS)` command as long as the install
|
||||
components the target belongs to are not part of the set of components
|
||||
that anything tries to install.
|
||||
|
||||
This property is enabled by default for targets that are created in
|
||||
directories that have :prop_dir:`EXCLUDE_FROM_ALL` set to ``TRUE``.
|
||||
|
@ -2088,10 +2088,18 @@ bool cmGlobalGenerator::IsExcluded(cmLocalGenerator* root,
|
||||
return this->IsExcluded(rootSnp, snp);
|
||||
}
|
||||
|
||||
bool cmGlobalGenerator::IsExcluded(cmGeneratorTarget* target) const
|
||||
bool cmGlobalGenerator::IsExcluded(cmLocalGenerator* root,
|
||||
cmGeneratorTarget* target) const
|
||||
{
|
||||
return target->GetType() == cmStateEnums::INTERFACE_LIBRARY ||
|
||||
target->GetPropertyAsBool("EXCLUDE_FROM_ALL");
|
||||
if (target->GetType() == cmStateEnums::INTERFACE_LIBRARY) {
|
||||
return true;
|
||||
}
|
||||
if (const char* exclude = target->GetProperty("EXCLUDE_FROM_ALL")) {
|
||||
return cmSystemTools::IsOn(exclude);
|
||||
}
|
||||
// This target is included in its directory. Check whether the
|
||||
// directory is excluded.
|
||||
return this->IsExcluded(root, target->GetLocalGenerator());
|
||||
}
|
||||
|
||||
void cmGlobalGenerator::GetEnabledLanguages(
|
||||
|
@ -509,7 +509,7 @@ protected:
|
||||
bool IsExcluded(cmStateSnapshot const& root,
|
||||
cmStateSnapshot const& snp) const;
|
||||
bool IsExcluded(cmLocalGenerator* root, cmLocalGenerator* gen) const;
|
||||
bool IsExcluded(cmGeneratorTarget* target) const;
|
||||
bool IsExcluded(cmLocalGenerator* root, cmGeneratorTarget* target) const;
|
||||
virtual void InitializeProgressMarks() {}
|
||||
|
||||
struct GlobalTargetInfo
|
||||
|
@ -302,9 +302,9 @@ public:
|
||||
return LocalGenerators;
|
||||
}
|
||||
|
||||
bool IsExcluded(cmGeneratorTarget* target)
|
||||
bool IsExcluded(cmLocalGenerator* root, cmGeneratorTarget* target)
|
||||
{
|
||||
return cmGlobalGenerator::IsExcluded(target);
|
||||
return cmGlobalGenerator::IsExcluded(root, target);
|
||||
}
|
||||
|
||||
int GetRuleCmdLength(const std::string& name) { return RuleCmdLength[name]; }
|
||||
|
@ -718,7 +718,7 @@ void cmGlobalUnixMakefileGenerator3::WriteConvenienceRules2(
|
||||
localName, depends, commands, true);
|
||||
|
||||
// add the all/all dependency
|
||||
if (!this->IsExcluded(gtarget)) {
|
||||
if (!this->IsExcluded(this->LocalGenerators[0], gtarget)) {
|
||||
depends.clear();
|
||||
depends.push_back(localName);
|
||||
commands.clear();
|
||||
@ -782,7 +782,7 @@ void cmGlobalUnixMakefileGenerator3::WriteConvenienceRules2(
|
||||
"Pre-install relink rule for target.", localName,
|
||||
depends, commands, true);
|
||||
|
||||
if (!this->IsExcluded(gtarget)) {
|
||||
if (!this->IsExcluded(this->LocalGenerators[0], gtarget)) {
|
||||
depends.clear();
|
||||
depends.push_back(localName);
|
||||
commands.clear();
|
||||
|
@ -208,7 +208,7 @@ void cmGlobalVisualStudioGenerator::AddExtraIDETargets()
|
||||
tgt->IsImported()) {
|
||||
continue;
|
||||
}
|
||||
if (!this->IsExcluded(tgt)) {
|
||||
if (!this->IsExcluded(gen[0], tgt)) {
|
||||
allBuild->AddUtility(tgt->GetName());
|
||||
}
|
||||
}
|
||||
|
@ -571,7 +571,7 @@ void cmGlobalXCodeGenerator::AddExtraTargets(
|
||||
false, "", "", false, cmMakefile::AcceptObjectLibraryCommands);
|
||||
}
|
||||
|
||||
if (!this->IsExcluded(target)) {
|
||||
if (!this->IsExcluded(gens[0], target)) {
|
||||
allbuild->AddUtility(target->GetName());
|
||||
}
|
||||
}
|
||||
|
@ -88,7 +88,9 @@ void cmLocalNinjaGenerator::Generate()
|
||||
if (tg) {
|
||||
tg->Generate();
|
||||
// Add the target to "all" if required.
|
||||
if (!this->GetGlobalNinjaGenerator()->IsExcluded(target)) {
|
||||
if (!this->GetGlobalNinjaGenerator()->IsExcluded(
|
||||
this->GetGlobalNinjaGenerator()->GetLocalGenerators()[0],
|
||||
target)) {
|
||||
this->GetGlobalNinjaGenerator()->AddDependencyToAll(target);
|
||||
}
|
||||
}
|
||||
|
@ -1166,7 +1166,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 || this->GetPropertyAsBool("EXCLUDE_FROM_ALL")) {
|
||||
if (excludeFromAll) {
|
||||
target->SetProperty("EXCLUDE_FROM_ALL", "TRUE");
|
||||
}
|
||||
if (!comment) {
|
||||
@ -1716,7 +1716,7 @@ void cmMakefile::AddSubDirectory(const std::string& srcPath,
|
||||
cmMakefile* subMf = new cmMakefile(this->GlobalGenerator, newSnapshot);
|
||||
this->GetGlobalGenerator()->AddMakefile(subMf);
|
||||
|
||||
if (excludeFromAll || this->GetPropertyAsBool("EXCLUDE_FROM_ALL")) {
|
||||
if (excludeFromAll) {
|
||||
subMf->SetProperty("EXCLUDE_FROM_ALL", "TRUE");
|
||||
}
|
||||
|
||||
@ -2010,9 +2010,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 ||
|
||||
(type != cmStateEnums::INTERFACE_LIBRARY &&
|
||||
this->GetPropertyAsBool("EXCLUDE_FROM_ALL"))) {
|
||||
if (excludeFromAll) {
|
||||
target->SetProperty("EXCLUDE_FROM_ALL", "TRUE");
|
||||
}
|
||||
target->AddSources(srcs);
|
||||
@ -2025,7 +2023,7 @@ cmTarget* cmMakefile::AddExecutable(const std::string& exeName,
|
||||
bool excludeFromAll)
|
||||
{
|
||||
cmTarget* target = this->AddNewTarget(cmStateEnums::EXECUTABLE, exeName);
|
||||
if (excludeFromAll || this->GetPropertyAsBool("EXCLUDE_FROM_ALL")) {
|
||||
if (excludeFromAll) {
|
||||
target->SetProperty("EXCLUDE_FROM_ALL", "TRUE");
|
||||
}
|
||||
target->AddSources(srcs);
|
||||
|
@ -82,9 +82,12 @@ function(run_cmake test)
|
||||
set(maybe_input_file "")
|
||||
endif()
|
||||
if(RunCMake_TEST_COMMAND)
|
||||
if(NOT RunCMake_TEST_COMMAND_WORKING_DIRECTORY)
|
||||
set(RunCMake_TEST_COMMAND_WORKING_DIRECTORY "${RunCMake_TEST_BINARY_DIR}")
|
||||
endif()
|
||||
execute_process(
|
||||
COMMAND ${RunCMake_TEST_COMMAND}
|
||||
WORKING_DIRECTORY "${RunCMake_TEST_BINARY_DIR}"
|
||||
WORKING_DIRECTORY "${RunCMake_TEST_COMMAND_WORKING_DIRECTORY}"
|
||||
OUTPUT_VARIABLE actual_stdout
|
||||
ERROR_VARIABLE ${actual_stderr_var}
|
||||
RESULT_VARIABLE actual_result
|
||||
|
@ -0,0 +1 @@
|
||||
.*
|
@ -4,3 +4,11 @@ add_subdirectory(ExcludeFromAll EXCLUDE_FROM_ALL)
|
||||
|
||||
add_executable(main main.cpp)
|
||||
target_link_libraries(main PRIVATE foo)
|
||||
|
||||
file(GENERATE OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/check-$<LOWER_CASE:$<CONFIG>>.cmake CONTENT "
|
||||
set(main_exe \"$<TARGET_FILE:main>\")
|
||||
set(foo_lib \"$<TARGET_FILE:foo>\")
|
||||
set(bar_lib \"$<TARGET_FILE:bar>\")
|
||||
set(zot_lib \"$<TARGET_FILE:zot>\")
|
||||
set(subinc_lib \"$<TARGET_FILE:subinc>\")
|
||||
")
|
||||
|
@ -1,20 +1,11 @@
|
||||
add_library(bar STATIC bar.cpp)
|
||||
project(ExcludeFromAllSub NONE)
|
||||
|
||||
add_library(bar STATIC EXCLUDE_FROM_ALL bar.cpp)
|
||||
|
||||
add_library(zot STATIC zot.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 .)
|
||||
|
||||
add_library(subinc STATIC subinc.cpp)
|
||||
set_target_properties(subinc PROPERTIES EXCLUDE_FROM_ALL OFF)
|
||||
|
@ -0,0 +1,32 @@
|
||||
if(EXISTS ${RunCMake_TEST_BINARY_DIR}/check-debug.cmake)
|
||||
include(${RunCMake_TEST_BINARY_DIR}/check-debug.cmake)
|
||||
if(RunCMake_TEST_FAILED)
|
||||
return()
|
||||
endif()
|
||||
|
||||
foreach(file
|
||||
"${foo_lib}"
|
||||
"${subinc_lib}"
|
||||
"${zot_lib}"
|
||||
)
|
||||
if(NOT EXISTS "${file}")
|
||||
set(RunCMake_TEST_FAILED
|
||||
"Artifact should exist but is missing:\n ${file}")
|
||||
return()
|
||||
endif()
|
||||
endforeach()
|
||||
foreach(file
|
||||
"${main_exe}"
|
||||
"${bar_lib}"
|
||||
)
|
||||
if(EXISTS "${file}")
|
||||
set(RunCMake_TEST_FAILED
|
||||
"Artifact should be missing but exists:\n ${file}")
|
||||
return()
|
||||
endif()
|
||||
endforeach()
|
||||
else()
|
||||
set(RunCMake_TEST_FAILED "
|
||||
'${RunCMake_TEST_BINARY_DIR}/check-debug.cmake' missing
|
||||
")
|
||||
endif()
|
@ -1,44 +1,35 @@
|
||||
# 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)
|
||||
if(EXISTS ${RunCMake_TEST_BINARY_DIR}/check-debug.cmake)
|
||||
include(${RunCMake_TEST_BINARY_DIR}/check-debug.cmake)
|
||||
if(RunCMake_TEST_FAILED)
|
||||
return()
|
||||
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")
|
||||
foreach(file
|
||||
"${foo_lib}"
|
||||
"${subinc_lib}"
|
||||
"${main_exe}"
|
||||
)
|
||||
if(EXISTS "${file}")
|
||||
# Remove for next step of test.
|
||||
file(REMOVE "${file}")
|
||||
else()
|
||||
set(RunCMake_TEST_FAILED
|
||||
"Artifact should exist but is missing:\n ${file}")
|
||||
return()
|
||||
endif()
|
||||
endforeach()
|
||||
foreach(file
|
||||
"${zot_lib}"
|
||||
"${bar_lib}"
|
||||
)
|
||||
if(EXISTS "${file}")
|
||||
set(RunCMake_TEST_FAILED
|
||||
"Artifact should be missing but exists:\n ${file}")
|
||||
return()
|
||||
endif()
|
||||
endforeach()
|
||||
else()
|
||||
set(RunCMake_TEST_FAILED "
|
||||
'${RunCMake_TEST_BINARY_DIR}/check-debug.cmake' missing
|
||||
")
|
||||
endif()
|
||||
|
@ -0,0 +1,4 @@
|
||||
int subinc()
|
||||
{
|
||||
return 0;
|
||||
}
|
4
Tests/RunCMake/add_subdirectory/ExcludeFromAll/zot.cpp
Normal file
4
Tests/RunCMake/add_subdirectory/ExcludeFromAll/zot.cpp
Normal file
@ -0,0 +1,4 @@
|
||||
int zot()
|
||||
{
|
||||
return 0;
|
||||
}
|
@ -27,14 +27,34 @@ run_cmake_install(CMP0082-OLD -DCMP0082_VALUE=OLD)
|
||||
run_cmake_install(CMP0082-NEW -DCMP0082_VALUE=NEW)
|
||||
|
||||
set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/ExcludeFromAll-build)
|
||||
set(RunCMake_TEST_NO_CLEAN 1)
|
||||
|
||||
file(REMOVE_RECURSE "${RunCMake_TEST_BINARY_DIR}")
|
||||
file(MAKE_DIRECTORY "${RunCMake_TEST_BINARY_DIR}")
|
||||
|
||||
if(NOT RunCMake_GENERATOR_IS_MULTI_CONFIG)
|
||||
set(RunCMake_TEST_OPTIONS -DCMAKE_BUILD_TYPE=Debug)
|
||||
endif()
|
||||
run_cmake(ExcludeFromAll)
|
||||
set(RunCMake_TEST_NO_CLEAN 1)
|
||||
set(RunCMake-check-file ExcludeFromAll/check.cmake)
|
||||
run_cmake_command(ExcludeFromAll-build ${CMAKE_COMMAND} --build .)
|
||||
|
||||
unset(RunCMake_TEST_BINARY_DIR)
|
||||
run_cmake_command(ExcludeFromAll-build ${CMAKE_COMMAND} --build . --config Debug)
|
||||
if(RunCMake_GENERATOR STREQUAL "Ninja")
|
||||
if(WIN32)
|
||||
set(slash [[\]])
|
||||
else()
|
||||
set(slash [[/]])
|
||||
endif()
|
||||
set(RunCMake-check-file ExcludeFromAll/check-sub.cmake)
|
||||
run_cmake_command(ExcludeFromAll-build-sub ${CMAKE_COMMAND} --build . --target "ExcludeFromAll${slash}all")
|
||||
elseif(RunCMake_GENERATOR MATCHES "Make")
|
||||
set(RunCMake-check-file ExcludeFromAll/check-sub.cmake)
|
||||
set(RunCMake_TEST_COMMAND_WORKING_DIRECTORY ${RunCMake_BINARY_DIR}/ExcludeFromAll-build/ExcludeFromAll)
|
||||
run_cmake_command(ExcludeFromAll-build-sub "${RunCMake_MAKE_PROGRAM}")
|
||||
elseif(RunCMake_GENERATOR MATCHES "^Visual Studio [1-9][0-9]")
|
||||
set(RunCMake-check-file ExcludeFromAll/check-sub.cmake)
|
||||
run_cmake_command(ExcludeFromAll-build-sub ${CMAKE_COMMAND} --build ExcludeFromAll --config Debug)
|
||||
elseif(RunCMake_GENERATOR STREQUAL "Xcode")
|
||||
set(RunCMake-check-file ExcludeFromAll/check-sub.cmake)
|
||||
set(RunCMake_TEST_COMMAND_WORKING_DIRECTORY ${RunCMake_BINARY_DIR}/ExcludeFromAll-build/ExcludeFromAll)
|
||||
run_cmake_command(ExcludeFromAll-build-sub xcodebuild -configuration Debug)
|
||||
endif()
|
||||
unset(RunCMake-check-file)
|
||||
unset(RunCMake_TEST_NO_CLEAN)
|
||||
unset(RunCMake_TEST_OPTIONS)
|
||||
unset(RunCMake_TEST_BINARY_DIR)
|
||||
|
Loading…
x
Reference in New Issue
Block a user