mirror of
https://github.com/Kitware/CMake.git
synced 2025-10-14 02:08:27 +08:00

Rework how we assign imported configurations to only add configurations that are actually imported. This requires a certain amount of cleverness to keep the order consistent with the package's specified default configurations, but doing this is important now that configuration selection (see policies CMP0199 and CMP0200) is more reliant on the IMPORTED_CONFIGURATIONS property being accurate, rather than focusing on whether configuration-specific properties are set.
117 lines
4.2 KiB
C++
117 lines
4.2 KiB
C++
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
|
|
file LICENSE.rst or https://cmake.org/licensing for details. */
|
|
#pragma once
|
|
|
|
#include "cmConfigure.h" // IWYU pragma: keep
|
|
|
|
#include <map>
|
|
#include <memory>
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
#include <cm/optional>
|
|
#include <cm/string_view>
|
|
|
|
#include <cm3p/json/value.h>
|
|
|
|
#include "cmStateTypes.h"
|
|
|
|
class cmExecutionStatus;
|
|
class cmMakefile;
|
|
class cmTarget;
|
|
|
|
struct cmPackageRequirement
|
|
{
|
|
std::string Name;
|
|
std::string Version;
|
|
std::vector<std::string> Components;
|
|
std::vector<std::string> Hints;
|
|
};
|
|
|
|
/** \class cmPackageInfoReader
|
|
* \brief Read and parse CPS files.
|
|
*
|
|
* This class encapsulates the functionality to read package configuration
|
|
* files which use the Common Package Specification, and provides utilities to
|
|
* translate the declarations therein into imported targets.
|
|
*/
|
|
class cmPackageInfoReader
|
|
{
|
|
public:
|
|
static std::unique_ptr<cmPackageInfoReader> Read(
|
|
std::string const& path, cmPackageInfoReader const* parent = nullptr);
|
|
|
|
std::string GetName() const;
|
|
cm::optional<std::string> GetVersion() const;
|
|
cm::optional<std::string> GetCompatVersion() const;
|
|
|
|
// NOTE: The eventual intent is for CPS to support multiple version schemas,
|
|
// and in particular, we expect to want to support "simple", "custom", "rpm",
|
|
// "dpkg" and "pep440". Additionally, we desire to be able to parse each of
|
|
// these to the maximum extent possible; in particular, we want to be able
|
|
// to decompose "simple" and "pep440" versions into components represented
|
|
// as numeric types rather than strings, which is not possible with the "rpm"
|
|
// and "dpkg" schemas. Therefore, we require different data structures to
|
|
// represent different version schemas.
|
|
|
|
struct Pep440Version
|
|
{
|
|
// NOTE: This structure is currently incomplete as we only support the
|
|
// "simple" schema at this time.
|
|
bool Simple; // "simple" can be represented as a subset of "pep440"
|
|
std::vector<unsigned> ReleaseComponents;
|
|
cm::optional<std::string> LocalLabel;
|
|
};
|
|
|
|
// FIXME: Return a sum type (e.g. {cm,std}::variant) of possible versions
|
|
// when we support more than just the "simple" (and possibly "pep440")
|
|
// schema(s).
|
|
/// If the package uses the 'simple' version scheme, parse the provided
|
|
/// version string as a numeric tuple and optional trailing string. Returns
|
|
/// a disengaged optional for other schemes or if no version is specified.
|
|
cm::optional<Pep440Version> ParseVersion(
|
|
cm::optional<std::string> const& version) const;
|
|
|
|
std::vector<cmPackageRequirement> GetRequirements() const;
|
|
std::vector<std::string> GetComponentNames() const;
|
|
|
|
/// Create targets for components specified in the CPS file.
|
|
bool ImportTargets(cmMakefile* makefile, cmExecutionStatus& status);
|
|
|
|
/// Add configuration-specific properties for targets.
|
|
bool ImportTargetConfigurations(cmMakefile* makefile,
|
|
cmExecutionStatus& status) const;
|
|
|
|
private:
|
|
cmPackageInfoReader() = default;
|
|
|
|
cmTarget* AddLibraryComponent(cmMakefile* makefile,
|
|
cmStateEnums::TargetType type,
|
|
std::string const& name,
|
|
Json::Value const& data,
|
|
std::string const& package) const;
|
|
|
|
void AddTargetConfiguration(cmTarget* target,
|
|
cm::string_view configuration) const;
|
|
|
|
void SetTargetProperties(cmMakefile* makefile, cmTarget* target,
|
|
Json::Value const& data, std::string const& package,
|
|
cm::string_view configuration) const;
|
|
void SetImportProperty(cmTarget* target, cm::string_view property,
|
|
cm::string_view configuration,
|
|
Json::Value const& value) const;
|
|
void SetMetaProperty(cmTarget* target, cm::string_view property,
|
|
Json::Value const& value,
|
|
std::string const& defaultValue = {}) const;
|
|
|
|
std::string ResolvePath(std::string path) const;
|
|
|
|
std::string Path;
|
|
Json::Value Data;
|
|
std::string Prefix;
|
|
|
|
std::map<std::string, cmTarget*> ComponentTargets;
|
|
std::vector<std::string> DefaultConfigurations;
|
|
std::string DefaultLicense;
|
|
};
|