mirror of
https://github.com/Kitware/CMake.git
synced 2025-06-22 20:34:08 +08:00

These modules are not meant to be included by user code, they are only an internal implementation detail for CPack. Having them live in the main Modules directory with documentation was misleading, so they have been moved into Modules/Internal/CPack, and their documentation has been stripped following its move into the new "CPack Generators" section. No-op modules which contained only documentation have been removed entirely. The only module that hasn't been moved is CPackIFW, because it contains user-facing macros which would be lost if it were moved. So, the CPackIFW module has been updated with a note explaining what needs to (eventually) happen.
142 lines
4.9 KiB
C++
142 lines
4.9 KiB
C++
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
|
|
file Copyright.txt or https://cmake.org/licensing for details. */
|
|
#include "cmCPackNuGetGenerator.h"
|
|
|
|
#include "cmAlgorithms.h"
|
|
#include "cmCPackComponentGroup.h"
|
|
#include "cmCPackLog.h"
|
|
#include "cmSystemTools.h"
|
|
|
|
#include <algorithm>
|
|
#include <iterator>
|
|
#include <map>
|
|
#include <ostream>
|
|
#include <string>
|
|
#include <utility>
|
|
#include <vector>
|
|
|
|
bool cmCPackNuGetGenerator::SupportsComponentInstallation() const
|
|
{
|
|
return IsOn("CPACK_NUGET_COMPONENT_INSTALL");
|
|
}
|
|
|
|
int cmCPackNuGetGenerator::PackageFiles()
|
|
{
|
|
cmCPackLogger(cmCPackLog::LOG_DEBUG, "Toplevel: " << toplevel << std::endl);
|
|
|
|
/* Reset package file name list it will be populated after the
|
|
* `CPackNuGet.cmake` run */
|
|
packageFileNames.clear();
|
|
|
|
/* Are we in the component packaging case */
|
|
if (WantsComponentInstallation()) {
|
|
if (componentPackageMethod == ONE_PACKAGE) {
|
|
// CASE 1 : COMPONENT ALL-IN-ONE package
|
|
// Meaning that all per-component pre-installed files
|
|
// goes into the single package.
|
|
this->SetOption("CPACK_NUGET_ALL_IN_ONE", "TRUE");
|
|
SetupGroupComponentVariables(true);
|
|
} else {
|
|
// CASE 2 : COMPONENT CLASSICAL package(s) (i.e. not all-in-one)
|
|
// There will be 1 package for each component group
|
|
// however one may require to ignore component group and
|
|
// in this case you'll get 1 package for each component.
|
|
SetupGroupComponentVariables(componentPackageMethod ==
|
|
ONE_PACKAGE_PER_COMPONENT);
|
|
}
|
|
} else {
|
|
// CASE 3 : NON COMPONENT package.
|
|
this->SetOption("CPACK_NUGET_ORDINAL_MONOLITIC", "TRUE");
|
|
}
|
|
|
|
auto retval = this->ReadListFile("Internal/CPack/CPackNuGet.cmake");
|
|
if (retval) {
|
|
AddGeneratedPackageNames();
|
|
} else {
|
|
cmCPackLogger(cmCPackLog::LOG_ERROR,
|
|
"Error while execution CPackNuGet.cmake" << std::endl);
|
|
}
|
|
|
|
return retval;
|
|
}
|
|
|
|
void cmCPackNuGetGenerator::SetupGroupComponentVariables(bool ignoreGroup)
|
|
{
|
|
// The default behavior is to have one package by component group
|
|
// unless CPACK_COMPONENTS_IGNORE_GROUP is specified.
|
|
if (!ignoreGroup) {
|
|
std::vector<std::string> groups;
|
|
for (auto const& compG : this->ComponentGroups) {
|
|
cmCPackLogger(cmCPackLog::LOG_VERBOSE,
|
|
"Packaging component group: " << compG.first << std::endl);
|
|
groups.push_back(compG.first);
|
|
auto compGUp =
|
|
cmSystemTools::UpperCase(cmSystemTools::MakeCidentifier(compG.first));
|
|
|
|
// Collect components for this group
|
|
std::vector<std::string> components;
|
|
std::transform(begin(compG.second.Components),
|
|
end(compG.second.Components),
|
|
std::back_inserter(components),
|
|
[](cmCPackComponent const* comp) { return comp->Name; });
|
|
this->SetOption("CPACK_NUGET_" + compGUp + "_GROUP_COMPONENTS",
|
|
cmJoin(components, ";").c_str());
|
|
}
|
|
if (!groups.empty()) {
|
|
this->SetOption("CPACK_NUGET_GROUPS", cmJoin(groups, ";").c_str());
|
|
}
|
|
|
|
// Handle Orphan components (components not belonging to any groups)
|
|
std::vector<std::string> components;
|
|
for (auto const& comp : this->Components) {
|
|
// Does the component belong to a group?
|
|
if (comp.second.Group == nullptr) {
|
|
cmCPackLogger(
|
|
cmCPackLog::LOG_VERBOSE,
|
|
"Component <"
|
|
<< comp.second.Name
|
|
<< "> does not belong to any group, package it separately."
|
|
<< std::endl);
|
|
components.push_back(comp.first);
|
|
}
|
|
}
|
|
if (!components.empty()) {
|
|
this->SetOption("CPACK_NUGET_COMPONENTS",
|
|
cmJoin(components, ";").c_str());
|
|
}
|
|
|
|
} else {
|
|
std::vector<std::string> components;
|
|
components.reserve(this->Components.size());
|
|
std::transform(begin(this->Components), end(this->Components),
|
|
std::back_inserter(components),
|
|
[](std::pair<std::string, cmCPackComponent> const& comp) {
|
|
return comp.first;
|
|
});
|
|
this->SetOption("CPACK_NUGET_COMPONENTS", cmJoin(components, ";").c_str());
|
|
}
|
|
}
|
|
|
|
void cmCPackNuGetGenerator::AddGeneratedPackageNames()
|
|
{
|
|
const char* const files_list = this->GetOption("GEN_CPACK_OUTPUT_FILES");
|
|
if (!files_list) {
|
|
cmCPackLogger(
|
|
cmCPackLog::LOG_ERROR,
|
|
"Error while execution CPackNuGet.cmake: No NuGet package has generated"
|
|
<< std::endl);
|
|
return;
|
|
}
|
|
// add the generated packages to package file names list
|
|
std::string fileNames{ files_list };
|
|
const char sep = ';';
|
|
std::string::size_type pos1 = 0;
|
|
std::string::size_type pos2 = fileNames.find(sep, pos1 + 1);
|
|
while (pos2 != std::string::npos) {
|
|
packageFileNames.push_back(fileNames.substr(pos1, pos2 - pos1));
|
|
pos1 = pos2 + 1;
|
|
pos2 = fileNames.find(sep, pos1 + 1);
|
|
}
|
|
packageFileNames.push_back(fileNames.substr(pos1, pos2 - pos1));
|
|
}
|