1
0
mirror of https://github.com/Kitware/CMake.git synced 2025-10-21 06:10:16 +08:00

CPS: Support additional metadata

Add support for specifying CPS's supplemental `description` and
`website` attributes. Add ability to inherit these from the `project()`,
similar to how version information can be inherited.
This commit is contained in:
Matthew Woehlke
2025-06-03 16:24:13 -04:00
parent f224e131a5
commit da97747dac
18 changed files with 89 additions and 6 deletions

View File

@@ -140,7 +140,9 @@ Exporting Targets to the |CPS|
[COMPAT_VERSION <version>] [COMPAT_VERSION <version>]
[VERSION_SCHEMA <string>]] [VERSION_SCHEMA <string>]]
[DEFAULT_TARGETS <target>...] [DEFAULT_TARGETS <target>...]
[DEFAULT_CONFIGURATIONS <config>...]) [DEFAULT_CONFIGURATIONS <config>...]
[DESCRIPTION <project-description-string>]
[HOMEPAGE_URL <url-string>])
.. versionadded:: 4.1 .. versionadded:: 4.1
.. note:: .. note::

View File

@@ -1001,6 +1001,8 @@ Signatures
[VERSION_SCHEMA <string>]] [VERSION_SCHEMA <string>]]
[DEFAULT_TARGETS <target>...] [DEFAULT_TARGETS <target>...]
[DEFAULT_CONFIGURATIONS <config>...] [DEFAULT_CONFIGURATIONS <config>...]
[DESCRIPTION <project-description-string>]
[HOMEPAGE_URL <url-string>]
[PERMISSIONS <permission>...] [PERMISSIONS <permission>...]
[CONFIGURATIONS <config>...] [CONFIGURATIONS <config>...]
[COMPONENT <component>] [COMPONENT <component>]
@@ -1057,6 +1059,17 @@ Signatures
configurations exists. If not specified, CMake will fall back to the configurations exists. If not specified, CMake will fall back to the
package's available configurations in an unspecified order. package's available configurations in an unspecified order.
``DESCRIPTION <project-description-string>``
.. versionadded:: 4.1
An informational description of the project. It is recommended that this
description is a relatively short string, usually no more than a few words.
``HOMEPAGE_URL <url-string>``
.. versionadded:: 4.1
An informational canonical home URL for the project.
By default, if the specified ``<package-name>`` matches the current CMake By default, if the specified ``<package-name>`` matches the current CMake
:variable:`PROJECT_NAME`, package metadata will be inherited from the :variable:`PROJECT_NAME`, package metadata will be inherited from the
project. The ``PROJECT <project-name>`` option may be used to specify a project. The ``PROJECT <project-name>`` option may be used to specify a

View File

@@ -37,6 +37,8 @@ cmExportPackageInfoGenerator::cmExportPackageInfoGenerator(
, PackageVersion(std::move(arguments.Version)) , PackageVersion(std::move(arguments.Version))
, PackageVersionCompat(std::move(arguments.VersionCompat)) , PackageVersionCompat(std::move(arguments.VersionCompat))
, PackageVersionSchema(std::move(arguments.VersionSchema)) , PackageVersionSchema(std::move(arguments.VersionSchema))
, PackageDescription(std::move(arguments.Description))
, PackageWebsite(std::move(arguments.Website))
, DefaultTargets(std::move(arguments.DefaultTargets)) , DefaultTargets(std::move(arguments.DefaultTargets))
, DefaultConfigurations(std::move(arguments.DefaultConfigs)) , DefaultConfigurations(std::move(arguments.DefaultConfigs))
{ {
@@ -123,7 +125,9 @@ Json::Value cmExportPackageInfoGenerator::GeneratePackageInfo() const
BuildArray(package, "default_components", this->DefaultTargets); BuildArray(package, "default_components", this->DefaultTargets);
BuildArray(package, "configurations", this->DefaultConfigurations); BuildArray(package, "configurations", this->DefaultConfigurations);
// TODO: description, website, license SetProperty(package, "description", this->PackageDescription);
SetProperty(package, "website", this->PackageWebsite);
// TODO: license
return package; return package;
} }

View File

@@ -108,6 +108,8 @@ private:
std::string const PackageVersion; std::string const PackageVersion;
std::string const PackageVersionCompat; std::string const PackageVersionCompat;
std::string const PackageVersionSchema; std::string const PackageVersionSchema;
std::string const PackageDescription;
std::string const PackageWebsite;
std::vector<std::string> DefaultTargets; std::vector<std::string> DefaultTargets;
std::vector<std::string> DefaultConfigurations; std::vector<std::string> DefaultConfigurations;

View File

@@ -136,6 +136,14 @@ bool cmPackageInfoArguments::SetMetadataFromProject(cmExecutionStatus& status)
} }
} }
if (this->Description.empty()) {
mapProjectValue(this->Description, "DESCRIPTION"_s);
}
if (this->Website.empty()) {
mapProjectValue(this->Website, "HOMEPAGE_URL"_s);
}
return true; return true;
} }

View File

@@ -56,6 +56,8 @@ public:
ArgumentParser::NonEmpty<std::string> Version; ArgumentParser::NonEmpty<std::string> Version;
ArgumentParser::NonEmpty<std::string> VersionCompat; ArgumentParser::NonEmpty<std::string> VersionCompat;
ArgumentParser::NonEmpty<std::string> VersionSchema; ArgumentParser::NonEmpty<std::string> VersionSchema;
ArgumentParser::NonEmpty<std::string> Description;
ArgumentParser::NonEmpty<std::string> Website;
ArgumentParser::NonEmpty<std::vector<std::string>> DefaultTargets; ArgumentParser::NonEmpty<std::vector<std::string>> DefaultTargets;
ArgumentParser::NonEmpty<std::vector<std::string>> DefaultConfigs; ArgumentParser::NonEmpty<std::vector<std::string>> DefaultConfigs;
bool LowerCase = false; bool LowerCase = false;
@@ -82,6 +84,8 @@ private:
&cmPackageInfoArguments::DefaultTargets); &cmPackageInfoArguments::DefaultTargets);
Bind(self, parser, "DEFAULT_CONFIGURATIONS"_s, Bind(self, parser, "DEFAULT_CONFIGURATIONS"_s,
&cmPackageInfoArguments::DefaultConfigs); &cmPackageInfoArguments::DefaultConfigs);
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, "PROJECT"_s, &cmPackageInfoArguments::ProjectName);
Bind(self, parser, "NO_PROJECT_METADATA"_s, Bind(self, parser, "NO_PROJECT_METADATA"_s,

View File

@@ -14,3 +14,6 @@ expect_value("${content}" "foo" "default_components" 0)
expect_array("${content}" 2 "configurations") expect_array("${content}" 2 "configurations")
expect_value("${content}" "release" "configurations" 0) expect_value("${content}" "release" "configurations" 0)
expect_value("${content}" "debug" "configurations" 1) expect_value("${content}" "debug" "configurations" 1)
expect_value("${content}" "Sample package" "description")
expect_value("${content}" "https://www.example.com/package/foo" "website")

View File

@@ -8,4 +8,6 @@ export(
COMPAT_VERSION 1.2.0 COMPAT_VERSION 1.2.0
DEFAULT_TARGETS foo DEFAULT_TARGETS foo
DEFAULT_CONFIGURATIONS release debug DEFAULT_CONFIGURATIONS release debug
DESCRIPTION "Sample package"
HOMEPAGE_URL "https://www.example.com/package/foo"
) )

View File

@@ -6,3 +6,5 @@ file(READ "${out_dir}/foo.cps" content)
expect_value("${content}" "foo" "name") expect_value("${content}" "foo" "name")
expect_missing("${content}" "version") expect_missing("${content}" "version")
expect_missing("${content}" "compat_version") expect_missing("${content}" "compat_version")
expect_missing("${content}" "description")
expect_missing("${content}" "website")

View File

@@ -1,4 +1,9 @@
project(foo VERSION 1.2.3 COMPAT_VERSION 1.1.0) project(foo
VERSION 1.2.3
COMPAT_VERSION 1.1.0
DESCRIPTION "Sample package"
HOMEPAGE_URL "https://www.example.com/package/foo"
)
add_library(foo INTERFACE) add_library(foo INTERFACE)
install(TARGETS foo EXPORT foo DESTINATION .) install(TARGETS foo EXPORT foo DESTINATION .)

View File

@@ -6,13 +6,19 @@ file(READ "${out_dir}/foo.cps" content)
expect_value("${content}" "foo" "name") expect_value("${content}" "foo" "name")
expect_value("${content}" "1.2.3" "version") expect_value("${content}" "1.2.3" "version")
expect_value("${content}" "1.1.0" "compat_version") expect_value("${content}" "1.1.0" "compat_version")
expect_value("${content}" "Sample package" "description")
expect_value("${content}" "https://www.example.com/package/foo" "website")
file(READ "${out_dir}/test1.cps" content) file(READ "${out_dir}/test1.cps" content)
expect_value("${content}" "test1" "name") expect_value("${content}" "test1" "name")
expect_value("${content}" "1.2.3" "version") expect_value("${content}" "1.2.3" "version")
expect_value("${content}" "1.1.0" "compat_version") expect_value("${content}" "1.1.0" "compat_version")
expect_value("${content}" "Sample package" "description")
expect_value("${content}" "https://www.example.com/package/foo" "website")
file(READ "${out_dir}/test2.cps" content) file(READ "${out_dir}/test2.cps" content)
expect_value("${content}" "test2" "name") expect_value("${content}" "test2" "name")
expect_value("${content}" "1.4.7" "version") expect_value("${content}" "1.4.7" "version")
expect_missing("${content}" "compat_version") expect_missing("${content}" "compat_version")
expect_value("${content}" "Don't inherit" "description")
expect_value("${content}" "https://www.example.com/package/bar" "website")

View File

@@ -1,4 +1,9 @@
project(foo VERSION 1.2.3 COMPAT_VERSION 1.1.0) project(foo
VERSION 1.2.3
COMPAT_VERSION 1.1.0
DESCRIPTION "Sample package"
HOMEPAGE_URL "https://www.example.com/package/foo"
)
add_library(foo INTERFACE) add_library(foo INTERFACE)
install(TARGETS foo EXPORT foo DESTINATION .) install(TARGETS foo EXPORT foo DESTINATION .)
@@ -22,4 +27,6 @@ export(
PROJECT foo PROJECT foo
PACKAGE_INFO test2 PACKAGE_INFO test2
VERSION 1.4.7 VERSION 1.4.7
DESCRIPTION "Don't inherit"
HOMEPAGE_URL "https://www.example.com/package/bar"
) )

View File

@@ -14,3 +14,6 @@ expect_value("${content}" "foo" "default_components" 0)
expect_array("${content}" 2 "configurations") expect_array("${content}" 2 "configurations")
expect_value("${content}" "release" "configurations" 0) expect_value("${content}" "release" "configurations" 0)
expect_value("${content}" "debug" "configurations" 1) expect_value("${content}" "debug" "configurations" 1)
expect_value("${content}" "Sample package" "description")
expect_value("${content}" "https://www.example.com/package/foo" "website")

View File

@@ -9,4 +9,6 @@ install(
COMPAT_VERSION 1.2.0 COMPAT_VERSION 1.2.0
DEFAULT_TARGETS foo DEFAULT_TARGETS foo
DEFAULT_CONFIGURATIONS release debug DEFAULT_CONFIGURATIONS release debug
DESCRIPTION "Sample package"
HOMEPAGE_URL "https://www.example.com/package/foo"
) )

View File

@@ -6,3 +6,5 @@ file(READ "${out_dir}/foo.cps" content)
expect_value("${content}" "foo" "name") expect_value("${content}" "foo" "name")
expect_missing("${content}" "version") expect_missing("${content}" "version")
expect_missing("${content}" "compat_version") expect_missing("${content}" "compat_version")
expect_missing("${content}" "description")
expect_missing("${content}" "website")

View File

@@ -1,4 +1,9 @@
project(foo VERSION 1.2.3 COMPAT_VERSION 1.1.0) project(foo
VERSION 1.2.3
COMPAT_VERSION 1.1.0
DESCRIPTION "Sample package"
HOMEPAGE_URL "https://www.example.com/package/foo"
)
add_library(foo INTERFACE) add_library(foo INTERFACE)
install(TARGETS foo EXPORT foo DESTINATION .) install(TARGETS foo EXPORT foo DESTINATION .)

View File

@@ -6,13 +6,19 @@ file(READ "${out_dir}/foo.cps" content)
expect_value("${content}" "foo" "name") expect_value("${content}" "foo" "name")
expect_value("${content}" "1.2.3" "version") expect_value("${content}" "1.2.3" "version")
expect_value("${content}" "1.1.0" "compat_version") expect_value("${content}" "1.1.0" "compat_version")
expect_value("${content}" "Sample package" "description")
expect_value("${content}" "https://www.example.com/package/foo" "website")
file(READ "${out_dir}/test1.cps" content) file(READ "${out_dir}/test1.cps" content)
expect_value("${content}" "test1" "name") expect_value("${content}" "test1" "name")
expect_value("${content}" "1.2.3" "version") expect_value("${content}" "1.2.3" "version")
expect_value("${content}" "1.1.0" "compat_version") expect_value("${content}" "1.1.0" "compat_version")
expect_value("${content}" "Sample package" "description")
expect_value("${content}" "https://www.example.com/package/foo" "website")
file(READ "${out_dir}/test2.cps" content) file(READ "${out_dir}/test2.cps" content)
expect_value("${content}" "test2" "name") expect_value("${content}" "test2" "name")
expect_value("${content}" "1.4.7" "version") expect_value("${content}" "1.4.7" "version")
expect_missing("${content}" "compat_version") expect_missing("${content}" "compat_version")
expect_value("${content}" "Don't inherit" "description")
expect_value("${content}" "https://www.example.com/package/bar" "website")

View File

@@ -1,4 +1,9 @@
project(foo VERSION 1.2.3 COMPAT_VERSION 1.1.0) project(foo
VERSION 1.2.3
COMPAT_VERSION 1.1.0
DESCRIPTION "Sample package"
HOMEPAGE_URL "https://www.example.com/package/foo"
)
add_library(foo INTERFACE) add_library(foo INTERFACE)
install(TARGETS foo EXPORT foo DESTINATION .) install(TARGETS foo EXPORT foo DESTINATION .)
@@ -25,4 +30,6 @@ install(
EXPORT foo EXPORT foo
PROJECT foo PROJECT foo
VERSION 1.4.7 VERSION 1.4.7
DESCRIPTION "Don't inherit"
HOMEPAGE_URL "https://www.example.com/package/bar"
) )