/* 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 #include #include #include #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 ::value>> static void Bind(cmArgumentParser& parser) { cmPackageInfoArguments::Bind(parser, nullptr); } void Bind(cmArgumentParser& 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 PackageName; ArgumentParser::NonEmpty Appendix; ArgumentParser::NonEmpty Version; ArgumentParser::NonEmpty VersionCompat; ArgumentParser::NonEmpty VersionSchema; ArgumentParser::NonEmpty License; ArgumentParser::NonEmpty DefaultLicense; ArgumentParser::NonEmpty Description; ArgumentParser::NonEmpty Website; ArgumentParser::NonEmpty> DefaultTargets; ArgumentParser::NonEmpty> DefaultConfigs; bool LowerCase = false; ArgumentParser::NonEmpty ProjectName; bool NoProjectDefaults = false; private: bool SetEffectiveProject(cmExecutionStatus& status); template static void Bind(cmArgumentParser& 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 ::value>> static void Bind(cmPackageInfoArguments*, cmArgumentParser& parser, cm::static_string_view name, U cmPackageInfoArguments::*member) { parser.Bind(name, member); } template static void Bind(cmPackageInfoArguments* self, cmArgumentParser& parser, cm::static_string_view name, U cmPackageInfoArguments::*member) { parser.Bind(name, (self)->*member); } }; extern template void cmPackageInfoArguments::Bind( cmArgumentParser&, cmPackageInfoArguments*);