cmake/Source/cmProjectInfoArguments.h
Matthew Woehlke 6d6c37c90d cmPackageInfoArguments: Extract common values
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.
2025-12-16 16:18:13 -05:00

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*);