cpack: Add CPACK_INSTALL_CMAKE_CONFIGURATIONS variable

For the multi-configuration generators one can specify the list
of configurations to include in the package.

E.g. having a project, where debug libraries have a suffix to
distinct them from the release builds, one can build the package
containing both `Debug` and `Release` binaries.
This commit is contained in:
Alex Turbov
2019-07-10 00:07:55 +03:00
committed by Brad King
parent d4e6b2ae25
commit da5ac4bb60
8 changed files with 82 additions and 20 deletions
+47 -17
View File
@@ -598,8 +598,34 @@ int cmCPackGenerator::InstallProjectViaInstallCMakeProjects(
componentsVector.push_back(project.Component);
}
const char* buildConfigCstr = this->GetOption("CPACK_BUILD_CONFIG");
std::string buildConfig = buildConfigCstr ? buildConfigCstr : "";
std::vector<std::string> buildConfigs;
// Try get configuration names given via `-C` CLI option
{
const char* const buildConfigCstr =
this->GetOption("CPACK_BUILD_CONFIG");
auto buildConfig = buildConfigCstr ? buildConfigCstr : std::string{};
cmExpandList(buildConfig, buildConfigs);
}
// Try get configurations requested by the user explicitly
{
const char* const configsCstr =
this->GetOption("CPACK_INSTALL_CMAKE_CONFIGURATIONS");
auto configs = configsCstr ? configsCstr : std::string{};
cmExpandList(configs, buildConfigs);
}
// Remove duplicates
std::sort(buildConfigs.begin(), buildConfigs.end());
buildConfigs.erase(std::unique(buildConfigs.begin(), buildConfigs.end()),
buildConfigs.end());
// Ensure we have at least one configuration.
if (buildConfigs.empty()) {
buildConfigs.emplace_back();
}
std::unique_ptr<cmGlobalGenerator> globalGenerator(
this->MakefileMap->GetCMakeInstance()->CreateGlobalGenerator(
cmakeGenerator));
@@ -615,25 +641,29 @@ int cmCPackGenerator::InstallProjectViaInstallCMakeProjects(
// on windows.
cmSystemTools::SetForceUnixPaths(globalGenerator->GetForceUnixPaths());
if (!this->RunPreinstallTarget(project.ProjectName, project.Directory,
globalGenerator.get(), buildConfig)) {
return 0;
}
cmCPackLogger(cmCPackLog::LOG_OUTPUT,
"- Install project: " << project.ProjectName << std::endl);
// Run the installation for each component
for (std::string const& component : componentsVector) {
if (!this->InstallCMakeProject(
setDestDir, project.Directory, baseTempInstallDirectory,
default_dir_mode, component, componentInstall,
project.SubDirectory, buildConfig, absoluteDestFiles)) {
// Run the installation for the selected build configurations
for (auto const& buildConfig : buildConfigs) {
if (!this->RunPreinstallTarget(project.ProjectName, project.Directory,
globalGenerator.get(), buildConfig)) {
return 0;
}
cmCPackLogger(cmCPackLog::LOG_OUTPUT,
"- Install project: " << project.ProjectName << " ["
<< buildConfig << ']'
<< std::endl);
// Run the installation for each component
for (std::string const& component : componentsVector) {
if (!this->InstallCMakeProject(
setDestDir, project.Directory, baseTempInstallDirectory,
default_dir_mode, component, componentInstall,
project.SubDirectory, buildConfig, absoluteDestFiles)) {
return 0;
}
}
}
this->CMakeProjects.push_back(project);
this->CMakeProjects.emplace_back(std::move(project));
}
}
this->SetOption("CPACK_ABSOLUTE_DESTINATION_FILES",