mirror of
https://github.com/Kitware/CMake.git
synced 2026-01-07 22:30:13 -06:00
CPS package metadata involves a fair amount of passing around a particular set of values, as well as shared argument handling, which is only going to increase as additional features are added. In order to reduce code duplication (now and going forward), create a helper class to handle the shared argument parsing and to serve as a container to pass metadata values.
116 lines
3.2 KiB
C++
116 lines
3.2 KiB
C++
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
|
|
file LICENSE.rst or https://cmake.org/licensing for details. */
|
|
#include "cmExportBuildPackageInfoGenerator.h"
|
|
|
|
#include <cassert>
|
|
#include <utility>
|
|
#include <vector>
|
|
|
|
#include <cmext/string_view>
|
|
|
|
#include <cm3p/json/value.h>
|
|
|
|
#include "cmGeneratorExpression.h"
|
|
#include "cmPackageInfoArguments.h"
|
|
#include "cmStateTypes.h"
|
|
#include "cmStringAlgorithms.h"
|
|
|
|
cmExportBuildPackageInfoGenerator::cmExportBuildPackageInfoGenerator(
|
|
cmPackageInfoArguments arguments)
|
|
: cmExportPackageInfoGenerator(std::move(arguments))
|
|
{
|
|
this->SetNamespace(cmStrCat(this->GetPackageName(), "::"_s));
|
|
}
|
|
|
|
bool cmExportBuildPackageInfoGenerator::GenerateMainFile(std::ostream& os)
|
|
{
|
|
if (!this->CollectExports([&](cmGeneratorTarget const*) {})) {
|
|
return false;
|
|
}
|
|
|
|
if (!this->CheckDefaultTargets()) {
|
|
return false;
|
|
}
|
|
|
|
Json::Value root = this->GeneratePackageInfo();
|
|
root["cps_path"] = "@prefix@";
|
|
|
|
Json::Value& components = root["components"];
|
|
|
|
// Create all the imported targets.
|
|
for (auto const& exp : this->Exports) {
|
|
cmGeneratorTarget* const target = exp.Target;
|
|
cmStateEnums::TargetType targetType = this->GetExportTargetType(target);
|
|
|
|
Json::Value* const component =
|
|
this->GenerateImportTarget(components, target, targetType);
|
|
if (!component) {
|
|
return false;
|
|
}
|
|
|
|
ImportPropertyMap properties;
|
|
if (!this->PopulateInterfaceProperties(target, properties)) {
|
|
return false;
|
|
}
|
|
this->PopulateInterfaceLinkLibrariesProperty(
|
|
target, cmGeneratorExpression::InstallInterface, properties);
|
|
|
|
if (targetType != cmStateEnums::INTERFACE_LIBRARY) {
|
|
auto configurations = Json::Value{ Json::objectValue };
|
|
|
|
// Add per-configuration properties.
|
|
for (std::string const& c : this->Configurations) {
|
|
this->GenerateInterfacePropertiesConfig(configurations, target, c);
|
|
}
|
|
|
|
if (!configurations.empty()) {
|
|
(*component)["configurations"] = configurations;
|
|
}
|
|
}
|
|
|
|
// Set configuration-agnostic properties for component.
|
|
this->GenerateInterfaceProperties(*component, target, properties);
|
|
}
|
|
|
|
this->GeneratePackageRequires(root);
|
|
|
|
// Write the primary packing information file.
|
|
this->WritePackageInfo(root, os);
|
|
|
|
bool result = true;
|
|
|
|
return result;
|
|
}
|
|
|
|
void cmExportBuildPackageInfoGenerator::GenerateInterfacePropertiesConfig(
|
|
Json::Value& configurations, cmGeneratorTarget* target,
|
|
std::string const& config)
|
|
{
|
|
std::string const& suffix = PropertyConfigSuffix(config);
|
|
|
|
ImportPropertyMap properties;
|
|
|
|
assert(this->GetExportTargetType(target) != cmStateEnums::INTERFACE_LIBRARY);
|
|
this->SetImportLocationProperty(config, suffix, target, properties);
|
|
if (properties.empty()) {
|
|
return;
|
|
}
|
|
|
|
this->SetImportDetailProperties(config, suffix, target, properties);
|
|
|
|
// TODO: PUBLIC_HEADER_LOCATION
|
|
|
|
Json::Value component =
|
|
this->GenerateInterfaceConfigProperties(suffix, properties);
|
|
if (!component.empty()) {
|
|
configurations[config] = std::move(component);
|
|
}
|
|
}
|
|
|
|
std::string cmExportBuildPackageInfoGenerator::GetCxxModulesDirectory() const
|
|
{
|
|
// TODO: Implement a not-CMake-specific mechanism for providing module
|
|
// information.
|
|
return {};
|
|
}
|