blob: 9134bc1434f091aabbe9a7c64cd00ca2344efcb9 [file] [log] [blame] [edit]
/* 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*);