mirror of
https://github.com/Kitware/CMake.git
synced 2025-10-14 02:08:27 +08:00

Add `LICENSE` and `DEFAULT_LICENSE` arguments to the `PACKAGE_INFO` modes of the `install` and `export` commands. If not otherwise specified, the `LICENSE` will be taken from the project's `SPDX_LICENSE`, if available.
121 lines
4.4 KiB
C++
121 lines
4.4 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 <vector>
|
|
|
|
#include <cm/type_traits>
|
|
#include <cmext/string_view>
|
|
|
|
#include "cmArgumentParser.h" // IWYU pragma: keep
|
|
#include "cmArgumentParserTypes.h"
|
|
|
|
class cmExecutionStatus;
|
|
|
|
/** \class cmPackageInfoArguments
|
|
* \brief Convey information about a package.
|
|
*
|
|
* This class encapsulates several attributes of package metadata. It is used
|
|
* both as a convenience container to convey several values in a single
|
|
* container, and also provides utilities to obtain this metadata from commands
|
|
* which produce packages (i.e. export and install).
|
|
*/
|
|
class cmPackageInfoArguments
|
|
{
|
|
public:
|
|
template <typename T,
|
|
typename = cm::enable_if_t<
|
|
std::is_base_of<cmPackageInfoArguments, T>::value>>
|
|
static void Bind(cmArgumentParser<T>& parser)
|
|
{
|
|
cmPackageInfoArguments::Bind(parser, nullptr);
|
|
}
|
|
|
|
void Bind(cmArgumentParser<void>& parser)
|
|
{
|
|
cmPackageInfoArguments::Bind(parser, this);
|
|
}
|
|
|
|
std::string GetNamespace() const;
|
|
std::string GetPackageDirName() const;
|
|
std::string GetPackageFileName() const;
|
|
|
|
/// Ensure that no conflicting options were specified. If \p enable is
|
|
/// \c false, forbid specifying any options whatsoever.
|
|
bool Check(cmExecutionStatus& status, bool enable = true) 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> Appendix;
|
|
ArgumentParser::NonEmpty<std::string> Version;
|
|
ArgumentParser::NonEmpty<std::string> VersionCompat;
|
|
ArgumentParser::NonEmpty<std::string> VersionSchema;
|
|
ArgumentParser::NonEmpty<std::string> License;
|
|
ArgumentParser::NonEmpty<std::string> DefaultLicense;
|
|
ArgumentParser::NonEmpty<std::string> Description;
|
|
ArgumentParser::NonEmpty<std::string> Website;
|
|
ArgumentParser::NonEmpty<std::vector<std::string>> DefaultTargets;
|
|
ArgumentParser::NonEmpty<std::vector<std::string>> DefaultConfigs;
|
|
bool LowerCase = false;
|
|
|
|
ArgumentParser::NonEmpty<std::string> ProjectName;
|
|
bool NoProjectDefaults = false;
|
|
|
|
private:
|
|
bool SetEffectiveProject(cmExecutionStatus& status);
|
|
|
|
template <typename T>
|
|
static void Bind(cmArgumentParser<T>& parser, cmPackageInfoArguments* self)
|
|
{
|
|
Bind(self, parser, "PACKAGE_INFO"_s, &cmPackageInfoArguments::PackageName);
|
|
Bind(self, parser, "LOWER_CASE_FILE"_s,
|
|
&cmPackageInfoArguments::LowerCase);
|
|
Bind(self, parser, "APPENDIX"_s, &cmPackageInfoArguments::Appendix);
|
|
Bind(self, parser, "VERSION"_s, &cmPackageInfoArguments::Version);
|
|
Bind(self, parser, "COMPAT_VERSION"_s,
|
|
&cmPackageInfoArguments::VersionCompat);
|
|
Bind(self, parser, "VERSION_SCHEMA"_s,
|
|
&cmPackageInfoArguments::VersionSchema);
|
|
Bind(self, parser, "DEFAULT_TARGETS"_s,
|
|
&cmPackageInfoArguments::DefaultTargets);
|
|
Bind(self, parser, "DEFAULT_CONFIGURATIONS"_s,
|
|
&cmPackageInfoArguments::DefaultConfigs);
|
|
Bind(self, parser, "LICENSE"_s, &cmPackageInfoArguments::License);
|
|
Bind(self, parser, "DEFAULT_LICENSE"_s,
|
|
&cmPackageInfoArguments::DefaultLicense);
|
|
Bind(self, parser, "DESCRIPTION"_s, &cmPackageInfoArguments::Description);
|
|
Bind(self, parser, "HOMEPAGE_URL"_s, &cmPackageInfoArguments::Website);
|
|
|
|
Bind(self, parser, "PROJECT"_s, &cmPackageInfoArguments::ProjectName);
|
|
Bind(self, parser, "NO_PROJECT_METADATA"_s,
|
|
&cmPackageInfoArguments::NoProjectDefaults);
|
|
}
|
|
|
|
template <typename T, typename U,
|
|
typename = cm::enable_if_t<
|
|
std::is_base_of<cmPackageInfoArguments, T>::value>>
|
|
static void Bind(cmPackageInfoArguments*, cmArgumentParser<T>& parser,
|
|
cm::static_string_view name,
|
|
U cmPackageInfoArguments::*member)
|
|
{
|
|
parser.Bind(name, member);
|
|
}
|
|
|
|
template <typename U>
|
|
static void Bind(cmPackageInfoArguments* self,
|
|
cmArgumentParser<void>& parser, cm::static_string_view name,
|
|
U cmPackageInfoArguments::*member)
|
|
{
|
|
parser.Bind(name, (self)->*member);
|
|
}
|
|
};
|
|
|
|
extern template void cmPackageInfoArguments::Bind<void>(
|
|
cmArgumentParser<void>&, cmPackageInfoArguments*);
|