mirror of
https://gitlab.kitware.com/cmake/cmake.git
synced 2026-01-29 12:24:29 +00:00
Extract those values of cmPackageInfoArguments which are inherited from the project into a new base class. This will allow other users (SBOM support, in particular) to leverage the functionality of inheriting these values without duplicating code or needing to share the exact same value set.
104 lines
3.5 KiB
C++
104 lines
3.5 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 <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*);
|