1
0
mirror of https://github.com/Kitware/CMake.git synced 2025-10-16 22:37:30 +08:00

Ninja Multi-Config: Make "install" targets depend on default configs

And add an "install:all" target.

Fixes: #20713
This commit is contained in:
Kyle Edwards
2020-05-22 11:59:17 -04:00
parent 0c557a0cab
commit dddb4f02f7
6 changed files with 117 additions and 6 deletions

View File

@@ -415,6 +415,11 @@ public:
std::set<std::string> GetCrossConfigs(const std::string& config) const;
const std::set<std::string>& GetDefaultConfigs() const
{
return this->DefaultConfigs;
}
protected:
void Generate() override;

View File

@@ -97,6 +97,43 @@ void cmLocalNinjaGenerator::Generate()
if (target->Target->IsPerConfig()) {
for (auto const& config : this->GetConfigNames()) {
tg->Generate(config);
if (target->GetType() == cmStateEnums::GLOBAL_TARGET &&
this->GetGlobalGenerator()->IsMultiConfig()) {
cmNinjaBuild phonyAlias("phony");
this->GetGlobalNinjaGenerator()->AppendTargetOutputs(
target.get(), phonyAlias.Outputs, "");
this->GetGlobalNinjaGenerator()->AppendTargetOutputs(
target.get(), phonyAlias.ExplicitDeps, config);
this->GetGlobalNinjaGenerator()->WriteBuild(
*this->GetGlobalNinjaGenerator()->GetConfigFileStream(config),
phonyAlias);
}
}
if (target->GetType() == cmStateEnums::GLOBAL_TARGET &&
this->GetGlobalGenerator()->IsMultiConfig()) {
if (!this->GetGlobalNinjaGenerator()->GetDefaultConfigs().empty()) {
cmNinjaBuild phonyAlias("phony");
this->GetGlobalNinjaGenerator()->AppendTargetOutputs(
target.get(), phonyAlias.Outputs, "");
for (auto const& config :
this->GetGlobalNinjaGenerator()->GetDefaultConfigs()) {
this->GetGlobalNinjaGenerator()->AppendTargetOutputs(
target.get(), phonyAlias.ExplicitDeps, config);
}
this->GetGlobalNinjaGenerator()->WriteBuild(
*this->GetGlobalNinjaGenerator()->GetDefaultFileStream(),
phonyAlias);
}
cmNinjaBuild phonyAlias("phony");
this->GetGlobalNinjaGenerator()->AppendTargetOutputs(
target.get(), phonyAlias.Outputs, "all");
for (auto const& config : this->GetConfigNames()) {
this->GetGlobalNinjaGenerator()->AppendTargetOutputs(
target.get(), phonyAlias.ExplicitDeps, config);
}
this->GetGlobalNinjaGenerator()->WriteBuild(
*this->GetGlobalNinjaGenerator()->GetDefaultFileStream(),
phonyAlias);
}
} else {
tg->Generate("");

View File

@@ -160,10 +160,5 @@ void cmNinjaUtilityTargetGenerator::Generate(const std::string& config)
// be per-directory and have one at the top-level anyway.
if (genTarget->GetType() != cmStateEnums::GLOBAL_TARGET) {
gg->AddTargetAlias(this->GetTargetName(), genTarget, config);
} else if (gg->IsMultiConfig() && genTarget->Target->IsPerConfig()) {
cmNinjaBuild phonyAlias("phony");
gg->AppendTargetOutputs(genTarget, phonyAlias.Outputs, "");
phonyAlias.ExplicitDeps = phonyBuild.Outputs;
gg->WriteBuild(this->GetImplFileStream(config), phonyAlias);
}
}

View File

@@ -0,0 +1,39 @@
check_files("${RunCMake_TEST_BINARY_DIR}"
INCLUDE
${TARGET_FILE_exe_Debug}
${TARGET_OBJECT_FILES_exe_Debug}
${TARGET_FILE_mylib_Release}
${TARGET_LINKER_FILE_mylib_Debug}
${TARGET_OBJECT_FILES_mylib_Debug}
${RunCMake_TEST_BINARY_DIR}/install/bin/Debug/${TARGET_FILE_NAME_exe_Debug}
${RunCMake_TEST_BINARY_DIR}/install/lib/Debug/${TARGET_FILE_NAME_mylib_Debug}
${RunCMake_TEST_BINARY_DIR}/install/lib/Debug/${TARGET_LINKER_FILE_NAME_mylib_Debug}
${TARGET_FILE_exe_Release}
${TARGET_OBJECT_FILES_exe_Release}
${TARGET_FILE_mylib_Release}
${TARGET_LINKER_FILE_mylib_Release}
${TARGET_OBJECT_FILES_mylib_Release}
${RunCMake_TEST_BINARY_DIR}/install/bin/Release/${TARGET_FILE_NAME_exe_Release}
${RunCMake_TEST_BINARY_DIR}/install/lib/Release/${TARGET_FILE_NAME_mylib_Release}
${RunCMake_TEST_BINARY_DIR}/install/lib/Release/${TARGET_LINKER_FILE_NAME_mylib_Release}
${TARGET_FILE_exe_RelWithDebInfo}
${TARGET_OBJECT_FILES_exe_RelWithDebInfo}
${TARGET_FILE_mylib_RelWithDebInfo}
${TARGET_LINKER_FILE_mylib_RelWithDebInfo}
${TARGET_OBJECT_FILES_mylib_RelWithDebInfo}
${RunCMake_TEST_BINARY_DIR}/install/bin/RelWithDebInfo/${TARGET_FILE_NAME_exe_RelWithDebInfo}
${RunCMake_TEST_BINARY_DIR}/install/lib/RelWithDebInfo/${TARGET_FILE_NAME_mylib_RelWithDebInfo}
${RunCMake_TEST_BINARY_DIR}/install/lib/RelWithDebInfo/${TARGET_LINKER_FILE_NAME_mylib_RelWithDebInfo}
EXCLUDE
${TARGET_OBJECT_FILES_exe_MinSizeRel}
${TARGET_OBJECT_FILES_mylib_MinSizeRel}
)

View File

@@ -0,0 +1,31 @@
check_files("${RunCMake_TEST_BINARY_DIR}"
INCLUDE
${TARGET_FILE_exe_Debug}
${TARGET_OBJECT_FILES_exe_Debug}
${TARGET_FILE_mylib_Release}
${TARGET_LINKER_FILE_mylib_Debug}
${TARGET_OBJECT_FILES_mylib_Debug}
${RunCMake_TEST_BINARY_DIR}/install/bin/Debug/${TARGET_FILE_NAME_exe_Debug}
${RunCMake_TEST_BINARY_DIR}/install/lib/Debug/${TARGET_FILE_NAME_mylib_Debug}
${RunCMake_TEST_BINARY_DIR}/install/lib/Debug/${TARGET_LINKER_FILE_NAME_mylib_Debug}
${TARGET_FILE_exe_Release}
${TARGET_OBJECT_FILES_exe_Release}
${TARGET_FILE_mylib_Release}
${TARGET_LINKER_FILE_mylib_Release}
${TARGET_OBJECT_FILES_mylib_Release}
${RunCMake_TEST_BINARY_DIR}/install/bin/Release/${TARGET_FILE_NAME_exe_Release}
${RunCMake_TEST_BINARY_DIR}/install/lib/Release/${TARGET_FILE_NAME_mylib_Release}
${RunCMake_TEST_BINARY_DIR}/install/lib/Release/${TARGET_LINKER_FILE_NAME_mylib_Release}
EXCLUDE
${TARGET_OBJECT_FILES_exe_MinSizeRel}
${TARGET_OBJECT_FILES_mylib_MinSizeRel}
${TARGET_OBJECT_FILES_exe_RelWithDebInfo}
${TARGET_OBJECT_FILES_mylib_RelWithDebInfo}
)

View File

@@ -263,12 +263,16 @@ run_cmake_build(AdditionalCleanFiles release-clean Release clean)
run_ninja(AdditionalCleanFiles all-clean build-Debug.ninja clean:all)
set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/Install-build)
set(RunCMake_TEST_OPTIONS "-DCMAKE_INSTALL_PREFIX=${RunCMake_TEST_BINARY_DIR}/install;-DCMAKE_CROSS_CONFIGS=all")
set(RunCMake_TEST_OPTIONS "-DCMAKE_INSTALL_PREFIX=${RunCMake_TEST_BINARY_DIR}/install;-DCMAKE_CROSS_CONFIGS=all;-DCMAKE_DEFAULT_CONFIGS=Debug\\;Release")
run_cmake_configure(Install)
unset(RunCMake_TEST_OPTIONS)
include(${RunCMake_TEST_BINARY_DIR}/target_files.cmake)
run_cmake_build(Install release-install Release install)
run_ninja(Install debug-in-release-graph-install build-Release.ninja install:Debug)
file(REMOVE_RECURSE "${RunCMake_TEST_BINARY_DIR}/install")
run_ninja(Install default-install build.ninja install)
file(REMOVE_RECURSE "${RunCMake_TEST_BINARY_DIR}/install")
run_ninja(Install all-install build.ninja install:all)
# FIXME Get this working
#set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/AutoMocExecutable-build)