| /* 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 <string> |
| |
| #include <cm/string_view> |
| #include <cm/type_traits> |
| #include <cmext/string_view> |
| |
| #include "cmArgumentParser.h" // IWYU pragma: keep |
| #include "cmArgumentParserTypes.h" |
| |
| class cmExecutionStatus; |
| |
| /** \class cmProjectInfoArguments |
| * \brief Convey information about a project. |
| * |
| * This class encapsulates several attributes of project metadata; |
| * specifically, those which can be inherited from the project. It is used as |
| * the base class for classes specific to SBOM and PACKAGE_INFO exports. |
| */ |
| class cmProjectInfoArguments |
| { |
| public: |
| cmProjectInfoArguments(); |
| cmProjectInfoArguments(cmProjectInfoArguments const&) = default; |
| cmProjectInfoArguments& operator=(cmProjectInfoArguments const&) = default; |
| cmProjectInfoArguments(cmProjectInfoArguments&&) = default; |
| cmProjectInfoArguments& operator=(cmProjectInfoArguments&&) = default; |
| |
| virtual ~cmProjectInfoArguments() = default; |
| |
| /// Ensure that no conflicting options were specified. |
| virtual bool Check(cmExecutionStatus& status) const; |
| |
| /// Set metadata (not already specified) from either the specified project, |
| /// or from the project which matches the package name. |
| bool SetMetadataFromProject(cmExecutionStatus& status); |
| |
| ArgumentParser::NonEmpty<std::string> PackageName; |
| ArgumentParser::NonEmpty<std::string> Version; |
| ArgumentParser::NonEmpty<std::string> VersionCompat; |
| ArgumentParser::NonEmpty<std::string> VersionSchema; |
| ArgumentParser::NonEmpty<std::string> License; |
| ArgumentParser::NonEmpty<std::string> Description; |
| ArgumentParser::NonEmpty<std::string> Website; |
| |
| ArgumentParser::NonEmpty<std::string> ProjectName; |
| bool NoProjectDefaults = false; |
| |
| protected: |
| virtual cm::string_view CommandName() const = 0; |
| |
| virtual bool SetEffectiveProject(cmExecutionStatus& status); |
| |
| template <typename T> |
| static void Bind(cmArgumentParser<T>& parser, cmProjectInfoArguments* self) |
| { |
| Bind(self, parser, "VERSION"_s, &cmProjectInfoArguments::Version); |
| Bind(self, parser, "LICENSE"_s, &cmProjectInfoArguments::License); |
| Bind(self, parser, "DESCRIPTION"_s, &cmProjectInfoArguments::Description); |
| Bind(self, parser, "HOMEPAGE_URL"_s, &cmProjectInfoArguments::Website); |
| |
| Bind(self, parser, "PROJECT"_s, &cmProjectInfoArguments::ProjectName); |
| Bind(self, parser, "NO_PROJECT_METADATA"_s, |
| &cmProjectInfoArguments::NoProjectDefaults); |
| } |
| |
| template < |
| typename Self, typename T, typename U, |
| typename = |
| cm::enable_if_t<std::is_base_of<cmProjectInfoArguments, Self>::value>, |
| typename = |
| cm::enable_if_t<std::is_base_of<cmProjectInfoArguments, T>::value>> |
| static void Bind(Self*, cmArgumentParser<T>& parser, |
| cm::static_string_view name, U Self::*member) |
| { |
| parser.Bind(name, member); |
| } |
| |
| template < |
| typename Self, typename T, typename U, |
| typename = |
| cm::enable_if_t<std::is_base_of<cmProjectInfoArguments, Self>::value>, |
| typename = |
| cm::enable_if_t<std::is_base_of<cmProjectInfoArguments, T>::value>> |
| static void Bind(Self* self, cmArgumentParser<void>& parser, |
| cm::static_string_view name, U T::*member) |
| { |
| parser.Bind(name, (self)->*member); |
| } |
| |
| static bool ArgWasSpecified(std::string const& value) |
| { |
| return !value.empty(); |
| } |
| }; |
| |
| extern template void cmProjectInfoArguments::Bind<void>( |
| cmArgumentParser<void>&, cmProjectInfoArguments*); |