/* 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 #include #include #include #include #include #include #include "cmStateTypes.h" class cmExecutionStatus; class cmMakefile; class cmTarget; struct cmPackageRequirement { std::string Name; std::string Version; std::vector Components; std::vector 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 Read( std::string const& path, cmPackageInfoReader const* parent = nullptr); std::string GetName() const; cm::optional GetVersion() const; cm::optional 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 ReleaseComponents; cm::optional 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 ParseVersion( cm::optional const& version) const; std::vector GetRequirements() const; std::vector 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 ComponentTargets; std::vector DefaultConfigurations; std::string DefaultLicense; };