| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 |
- /* 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;
- };
|