export: Make PACKAGE_INFO, SBOM sub-commands

Change the interface of the `export` command so that `PACKAGE_INFO` and
`SBOM` are proper, first-level sub-commands, rather than being implemented via
`export(EXPORT ... (PACKAGE_INFO|SBOM) ...)`. This brings consistency with the
`install` command and also simplifies argument parsing.

Update the documentation and test cases accordingly. Some of the
argument handling test cases are now rather gratuitous, and are removed,
which also improves consistency with the `install` tests.
This commit is contained in:
Matthew Woehlke
2026-01-12 14:05:27 -05:00
parent a121e5d49e
commit 254916dfc6
59 changed files with 363 additions and 394 deletions

View File

@@ -16,6 +16,8 @@ Synopsis
export(`EXPORT`_ <export-name> [...])
export(`PACKAGE`_ <PackageName>)
export(`SETUP`_ <export-name> [...])
export(`PACKAGE_INFO`_ <package-name> [...])
export(`SBOM`_ <sbom-name> [...])
Exporting Targets
^^^^^^^^^^^^^^^^^
@@ -130,9 +132,12 @@ of the :command:`install(TARGETS)` command.
Exporting Targets to the |CPS|
""""""""""""""""""""""""""""""
.. signature::
export(PACKAGE_INFO <package-name> [...])
.. code-block:: cmake
export(EXPORT <export-name> PACKAGE_INFO <package-name>
export(PACKAGE_INFO <package-name> EXPORT <export-name>
[PROJECT <project-name>|NO_PROJECT_METADATA]
[APPENDIX <appendix-name>]
[LOWER_CASE_FILE]
@@ -146,7 +151,7 @@ Exporting Targets to the |CPS|
[DESCRIPTION <description-string>]
[HOMEPAGE_URL <url-string>])
.. versionadded:: 4.1
.. versionadded:: 4.3
.. note::
Experimental. Gated by ``CMAKE_EXPERIMENTAL_EXPORT_PACKAGE_INFO``.
@@ -165,17 +170,19 @@ See :command:`install(PACKAGE_INFO)` for a description of the other options.
Exporting Software Bill of Materials (SBOM) Documents
"""""""""""""""""""""""""""""""""""""""""""""""""""""
.. signature::
export(SBOM <sbom-name> [...])
.. code-block:: cmake
export(EXPORT <export-name> SBOM <sbom-name>
[PROJECT <project-name>|NO_PROJECT_METADATA]
[DESTINATION <dir>]
[VERSION <major>[.<minor>[.<patch>[.<tweak>]]]]
[LICENSE <license-string>]
[DESCRIPTION <description-string>]
[HOMEPAGE_URL <url-string>]
[PACKAGE_URL <url-string>]
[FORMAT <string>])
export(SBOM <sbom-name> EXPORT <export-name>
[FORMAT <string>]
[PROJECT <project-name>|NO_PROJECT_METADATA]
[VERSION <major>[.<minor>[.<patch>[.<tweak>]]]]
[LICENSE <license-string>]
[DESCRIPTION <description-string>]
[HOMEPAGE_URL <url-string>]
[PACKAGE_URL <url-string>])
.. versionadded:: 4.3
.. note::

View File

@@ -51,6 +51,43 @@
static void StorePackageRegistry(cmMakefile& mf, std::string const& package,
char const* content, char const* hash);
static cm::optional<cmExportSet*> GetExportSet(std::string const& name,
cmGlobalGenerator* generator,
cmExecutionStatus& status)
{
cmExportSetMap& setMap = generator->GetExportSets();
auto const it = setMap.find(name);
if (it == setMap.end()) {
status.SetError(cmStrCat("Export set \""_s, name, "\" not found."_s));
return cm::nullopt;
}
return &it->second;
}
static void AddExportGenerator(
cmMakefile& makefile, cmGlobalGenerator* globalGenerator,
std::unique_ptr<cmExportBuildFileGenerator> exportGenerator,
std::string const& fileName, cmExportSet* exportSet,
std::string const& cxxModulesDirectory)
{
exportGenerator->SetExportFile(fileName.c_str());
exportGenerator->SetCxxModuleDirectory(cxxModulesDirectory);
if (exportSet) {
exportGenerator->SetExportSet(exportSet);
}
std::vector<std::string> configurationTypes =
makefile.GetGeneratorConfigs(cmMakefile::IncludeEmptyConfig);
for (std::string const& ct : configurationTypes) {
exportGenerator->AddConfiguration(ct);
}
if (exportSet) {
globalGenerator->AddBuildExportExportSet(exportGenerator.get());
}
makefile.AddExportBuildFileGenerator(std::move(exportGenerator));
}
static bool HandleTargetsMode(std::vector<std::string> const& args,
cmExecutionStatus& status)
{
@@ -218,8 +255,6 @@ static bool HandleExportMode(std::vector<std::string> const& args,
ArgumentParser::MaybeEmpty<std::string> Namespace;
ArgumentParser::NonEmpty<std::string> Filename;
ArgumentParser::NonEmpty<std::string> CxxModulesDirectory;
cm::optional<cmPackageInfoArguments> PackageInfo;
cm::optional<cmSbomArguments> Sbom;
bool ExportPackageDependencies = false;
};
@@ -237,39 +272,16 @@ static bool HandleExportMode(std::vector<std::string> const& args,
&ExportArguments::ExportPackageDependencies);
}
cmArgumentParser<cmPackageInfoArguments> packageInfoParser;
cmPackageInfoArguments::Bind(packageInfoParser);
if (cmExperimental::HasSupportEnabled(
status.GetMakefile(), cmExperimental::Feature::ExportPackageInfo)) {
parser.BindSubParser("PACKAGE_INFO"_s, packageInfoParser,
&ExportArguments::PackageInfo);
}
cmArgumentParser<cmSbomArguments> sbomParser;
cmSbomArguments::Bind(sbomParser);
if (cmExperimental::HasSupportEnabled(
status.GetMakefile(), cmExperimental::Feature::GenerateSbom)) {
parser.BindSubParser("SBOM"_s, sbomParser, &ExportArguments::Sbom);
}
std::vector<std::string> unknownArgs;
ExportArguments arguments = parser.Parse(args, &unknownArgs);
cmMakefile& mf = status.GetMakefile();
cmGlobalGenerator* gg = mf.GetGlobalGenerator();
if (arguments.PackageInfo && arguments.Sbom) {
status.SetError("PACKAGE_INFO and SBOM are mutually exclusive.");
return false;
}
if (!arguments.Check(args[0], &unknownArgs, status)) {
cmPolicies::PolicyStatus const p =
status.GetMakefile().GetPolicyStatus(cmPolicies::CMP0208);
if (arguments.PackageInfo || arguments.Sbom || !unknownArgs.empty() ||
p == cmPolicies::NEW) {
if (!unknownArgs.empty() || p == cmPolicies::NEW) {
return false;
}
if (p == cmPolicies::WARN) {
@@ -281,48 +293,9 @@ static bool HandleExportMode(std::vector<std::string> const& args,
}
}
if (arguments.PackageInfo) {
if (!arguments.Filename.empty()) {
status.SetError("PACKAGE_INFO and FILE are mutually exclusive.");
return false;
}
if (!arguments.Namespace.empty()) {
status.SetError("PACKAGE_INFO and NAMESPACE are mutually exclusive.");
return false;
}
if (!arguments.PackageInfo->Check(status) ||
!arguments.PackageInfo->SetMetadataFromProject(status)) {
return false;
}
}
if (arguments.Sbom) {
if (arguments.Sbom->PackageName.empty()) {
status.SetError("SBOM missing required value.");
return false;
}
if (!arguments.Filename.empty()) {
status.SetError("SBOM and FILE are mutually exclusive.");
return false;
}
if (!arguments.Namespace.empty()) {
status.SetError("SBOM and NAMESPACE are mutually exclusive.");
return false;
}
if (!arguments.Sbom->Check(status) ||
!arguments.Sbom->SetMetadataFromProject(status)) {
return false;
}
}
std::string fname;
if (arguments.Filename.empty()) {
if (arguments.PackageInfo) {
fname = arguments.PackageInfo->GetPackageFileName();
} else if (arguments.Sbom) {
fname = arguments.Sbom->GetPackageFileName();
} else {
fname = arguments.ExportSetName + ".cmake";
}
fname = arguments.ExportSetName + ".cmake";
} else {
if (cmSystemTools::GetFilenameLastExtension(arguments.Filename) !=
".cmake") {
@@ -349,60 +322,113 @@ static bool HandleExportMode(std::vector<std::string> const& args,
fname = cmStrCat(dir, '/', fname);
}
if (gg->GetExportedTargetsFile(fname)) {
if (arguments.PackageInfo) {
status.SetError(cmStrCat("command already specified for the file "_s,
cmSystemTools::GetFilenameName(fname), '.'));
return false;
}
}
cmExportSet* exportSet = nullptr;
cmExportSetMap& setMap = gg->GetExportSets();
auto const it = setMap.find(arguments.ExportSetName);
if (it == setMap.end()) {
std::ostringstream e;
e << "Export set \"" << arguments.ExportSetName << "\" not found.";
status.SetError(e.str());
cm::optional<cmExportSet*> const exportSet =
GetExportSet(arguments.ExportSetName, gg, status);
if (!exportSet) {
return false;
}
exportSet = &it->second;
// Set up export file generation.
std::unique_ptr<cmExportBuildFileGenerator> ebfg = nullptr;
if (arguments.PackageInfo) {
auto ebpg = cm::make_unique<cmExportBuildPackageInfoGenerator>(
*arguments.PackageInfo);
ebfg = std::move(ebpg);
} else if (arguments.Sbom) {
auto ebsg = cm::make_unique<cmExportBuildSbomGenerator>(*arguments.Sbom);
ebfg = std::move(ebsg);
} else {
auto ebcg = cm::make_unique<cmExportBuildCMakeConfigGenerator>();
ebcg->SetNamespace(arguments.Namespace);
ebcg->SetExportPackageDependencies(arguments.ExportPackageDependencies);
ebfg = std::move(ebcg);
}
auto ebcg = cm::make_unique<cmExportBuildCMakeConfigGenerator>();
ebcg->SetNamespace(arguments.Namespace);
ebcg->SetExportPackageDependencies(arguments.ExportPackageDependencies);
ebfg->SetExportFile(fname.c_str());
ebfg->SetCxxModuleDirectory(arguments.CxxModulesDirectory);
if (exportSet) {
ebfg->SetExportSet(exportSet);
}
std::vector<std::string> configurationTypes =
mf.GetGeneratorConfigs(cmMakefile::IncludeEmptyConfig);
for (std::string const& ct : configurationTypes) {
ebfg->AddConfiguration(ct);
}
if (exportSet) {
gg->AddBuildExportExportSet(ebfg.get());
}
mf.AddExportBuildFileGenerator(std::move(ebfg));
AddExportGenerator(mf, gg, std::move(ebcg), fname, *exportSet,
arguments.CxxModulesDirectory);
return true;
}
template <typename ArgumentsType, typename GeneratorType>
static bool HandleSpecialExportMode(std::vector<std::string> const& args,
cmExecutionStatus& status)
{
struct ExportArguments
: public ArgumentsType
, public ArgumentParser::ParseResult
{
ArgumentParser::NonEmpty<std::string> ExportSetName;
ArgumentParser::NonEmpty<std::string> CxxModulesDirectory;
using ArgumentsType::Check;
using ArgumentParser::ParseResult::Check;
};
auto parser =
cmArgumentParser<ExportArguments>{}
.Bind("EXPORT"_s, &ExportArguments::ExportSetName)
.Bind("CXX_MODULES_DIRECTORY"_s, &ExportArguments::CxxModulesDirectory);
ArgumentsType::Bind(parser);
std::vector<std::string> unknownArgs;
ExportArguments arguments = parser.Parse(args, &unknownArgs);
if (!arguments.Check(args[0], &unknownArgs, status)) {
return false;
}
if (arguments.ExportSetName.empty()) {
status.SetError(cmStrCat(args[0], " missing EXPORT."));
return false;
}
if (!arguments.Check(status) || !arguments.SetMetadataFromProject(status)) {
return false;
}
cmMakefile& mf = status.GetMakefile();
cmGlobalGenerator* gg = mf.GetGlobalGenerator();
std::string const& dir = mf.GetCurrentBinaryDirectory();
std::string const fname = cmStrCat(dir, '/', arguments.GetPackageFileName());
if (gg->GetExportedTargetsFile(fname)) {
status.SetError(cmStrCat("command already specified for the file "_s,
cmSystemTools::GetFilenameName(fname), '.'));
return false;
}
// Look up the export set
cm::optional<cmExportSet*> const exportSet =
GetExportSet(arguments.ExportSetName, gg, status);
if (!exportSet) {
return false;
}
// Create the export build generator
auto ebpg = cm::make_unique<GeneratorType>(arguments);
AddExportGenerator(mf, gg, std::move(ebpg), fname, *exportSet,
arguments.CxxModulesDirectory);
return true;
}
static bool HandlePackageInfoMode(std::vector<std::string> const& args,
cmExecutionStatus& status)
{
if (!cmExperimental::HasSupportEnabled(
status.GetMakefile(), cmExperimental::Feature::ExportPackageInfo)) {
status.SetError("does not recognize sub-command PACKAGE_INFO");
return false;
}
using arg_t = cmPackageInfoArguments;
using gen_t = cmExportBuildPackageInfoGenerator;
return HandleSpecialExportMode<arg_t, gen_t>(args, status);
}
static bool HandleSbomMode(std::vector<std::string> const& args,
cmExecutionStatus& status)
{
if (!cmExperimental::HasSupportEnabled(
status.GetMakefile(), cmExperimental::Feature::GenerateSbom)) {
status.SetError("does not recognize sub-command SBOM");
return false;
}
using arg_t = cmSbomArguments;
using gen_t = cmExportBuildSbomGenerator;
return HandleSpecialExportMode<arg_t, gen_t>(args, status);
}
static bool HandleSetupMode(std::vector<std::string> const& args,
cmExecutionStatus& status)
{
@@ -675,6 +701,8 @@ bool cmExportCommand(std::vector<std::string> const& args,
{ "EXPORT"_s, HandleExportMode },
{ "SETUP"_s, HandleSetupMode },
{ "PACKAGE"_s, HandlePackageMode },
{ "PACKAGE_INFO"_s, HandlePackageInfoMode },
{ "SBOM"_s, HandleSbomMode },
};
return subcommand(args[0], args, status);

View File

@@ -27,7 +27,7 @@ target_sources(libb
target_link_libraries(libb PUBLIC liba)
install(TARGETS liba EXPORT liba FILE_SET HEADERS)
export(EXPORT liba PACKAGE_INFO liba)
export(PACKAGE_INFO liba EXPORT liba)
install(TARGETS libb EXPORT libb FILE_SET HEADERS)
export(EXPORT libb PACKAGE_INFO libb)
export(PACKAGE_INFO libb EXPORT libb)

View File

@@ -6,13 +6,13 @@ install(TARGETS mammal EXPORT mammal DESTINATION .)
install(TARGETS canine EXPORT canine DESTINATION .)
export(
EXPORT mammal
PACKAGE_INFO foo
EXPORT mammal
VERSION 1.0
DEFAULT_LICENSE "LGPL-3.0-or-later")
export(
EXPORT canine
PACKAGE_INFO foo
EXPORT canine
APPENDIX dog
DEFAULT_LICENSE "GPL-3.0-or-later")

View File

@@ -1,5 +1,27 @@
CMake Error at BadArgs0\.cmake:[0-9]+ \(export\):
export EXPORT given invalid argument:
export PACKAGE_INFO given invalid argument:
PACKAGE_INFO: missing required value
Call Stack \(most recent call first\):
CMakeLists\.txt:3 \(include\)
CMake Error at BadArgs0\.cmake:[0-9]+ \(export\):
export PACKAGE_INFO missing EXPORT\.
Call Stack \(most recent call first\):
CMakeLists\.txt:3 \(include\)
CMake Error at BadArgs0\.cmake:[0-9]+ \(export\):
export PACKAGE_INFO given invalid argument:
EXPORT: missing required value
Call Stack \(most recent call first\):
CMakeLists\.txt:3 \(include\)
CMake Error at BadArgs0\.cmake:[0-9]+ \(export\):
export PACKAGE_INFO given invalid argument:
PACKAGE_INFO: missing required value
Call Stack \(most recent call first\):

View File

@@ -1,3 +1,7 @@
export(PACKAGE_INFO)
export(PACKAGE_INFO test)
export(PACKAGE_INFO test EXPORT)
add_library(foo INTERFACE)
install(TARGETS foo EXPORT foo DESTINATION .)
export(EXPORT foo PACKAGE_INFO)
export(PACKAGE_INFO EXPORT foo)

View File

@@ -1,6 +1,6 @@
add_library(foo INTERFACE)
install(TARGETS foo EXPORT foo DESTINATION .)
export(EXPORT foo PACKAGE_INFO foo COMPAT_VERSION 1.0)
export(EXPORT foo PACKAGE_INFO foo VERSION_SCHEMA simple)
export(EXPORT foo PACKAGE_INFO foo PROJECT foo NO_PROJECT_METADATA)
export(EXPORT foo PACKAGE_INFO foo PROJECT bar)
export(PACKAGE_INFO foo EXPORT foo COMPAT_VERSION 1.0)
export(PACKAGE_INFO foo EXPORT foo VERSION_SCHEMA simple)
export(PACKAGE_INFO foo EXPORT foo PROJECT foo NO_PROJECT_METADATA)
export(PACKAGE_INFO foo EXPORT foo PROJECT bar)

View File

@@ -1,6 +1,6 @@
add_library(foo INTERFACE)
install(TARGETS foo EXPORT foo DESTINATION .)
set(args EXPORT foo PACKAGE_INFO foo APPENDIX test)
set(args PACKAGE_INFO foo EXPORT foo APPENDIX test)
export(${args} VERSION 1.0)
export(${args} LICENSE "BSD-3-Clause AND CC-BY-SA-4.0")
export(${args} DESCRIPTION "Test")

View File

@@ -1,10 +1,95 @@
CMake Error at BadArgs3\.cmake:3 \(export\):
export PACKAGE_INFO and FILE are mutually exclusive\.
CMake Error at BadArgs3\.cmake:[0-9]+ \(export\):
export PACKAGE_INFO given invalid argument:
APPENDIX: missing required value
Call Stack \(most recent call first\):
CMakeLists\.txt:3 \(include\)
CMake Error at BadArgs3\.cmake:4 \(export\):
export PACKAGE_INFO and NAMESPACE are mutually exclusive\.
CMake Error at BadArgs3\.cmake:[0-9]+ \(export\):
export PACKAGE_INFO given invalid argument:
VERSION: missing required value
Call Stack \(most recent call first\):
CMakeLists\.txt:3 \(include\)
CMake Error at BadArgs3\.cmake:[0-9]+ \(export\):
export PACKAGE_INFO given invalid argument:
COMPAT_VERSION: missing required value
Call Stack \(most recent call first\):
CMakeLists\.txt:3 \(include\)
CMake Error at BadArgs3\.cmake:[0-9]+ \(export\):
export PACKAGE_INFO given invalid argument:
VERSION_SCHEMA: missing required value
Call Stack \(most recent call first\):
CMakeLists\.txt:3 \(include\)
CMake Error at BadArgs3\.cmake:[0-9]+ \(export\):
export PACKAGE_INFO given invalid argument:
LICENSE: missing required value
Call Stack \(most recent call first\):
CMakeLists\.txt:3 \(include\)
CMake Error at BadArgs3\.cmake:[0-9]+ \(export\):
export PACKAGE_INFO given invalid argument:
DEFAULT_LICENSE: missing required value
Call Stack \(most recent call first\):
CMakeLists\.txt:3 \(include\)
CMake Error at BadArgs3\.cmake:[0-9]+ \(export\):
export PACKAGE_INFO given invalid argument:
DESCRIPTION: missing required value
Call Stack \(most recent call first\):
CMakeLists\.txt:3 \(include\)
CMake Error at BadArgs3\.cmake:[0-9]+ \(export\):
export PACKAGE_INFO given invalid argument:
HOMEPAGE_URL: missing required value
Call Stack \(most recent call first\):
CMakeLists\.txt:3 \(include\)
CMake Error at BadArgs3\.cmake:[0-9]+ \(export\):
export PACKAGE_INFO given invalid argument:
DEFAULT_TARGETS: missing required value
Call Stack \(most recent call first\):
CMakeLists\.txt:3 \(include\)
CMake Error at BadArgs3\.cmake:[0-9]+ \(export\):
export PACKAGE_INFO given invalid argument:
DEFAULT_CONFIGURATIONS: missing required value
Call Stack \(most recent call first\):
CMakeLists\.txt:3 \(include\)
CMake Error at BadArgs3\.cmake:[0-9]+ \(export\):
export PACKAGE_INFO given invalid argument:
PROJECT: missing required value
Call Stack \(most recent call first\):
CMakeLists\.txt:3 \(include\)
CMake Error at BadArgs3\.cmake:[0-9]+ \(export\):
export PACKAGE_INFO given invalid arguments:
DEFAULT_LICENSE: empty string not allowed
LICENSE: empty string not allowed
Call Stack \(most recent call first\):
CMakeLists\.txt:3 \(include\)

View File

@@ -1,4 +1,15 @@
add_library(foo INTERFACE)
install(TARGETS foo EXPORT foo DESTINATION .)
export(EXPORT foo PACKAGE_INFO foo FILE foo.cps)
export(EXPORT foo PACKAGE_INFO foo NAMESPACE foo::)
set(args PACKAGE_INFO foo EXPORT foo)
export(${args} APPENDIX)
export(${args} VERSION)
export(${args} COMPAT_VERSION)
export(${args} VERSION_SCHEMA)
export(${args} LICENSE)
export(${args} DEFAULT_LICENSE)
export(${args} DESCRIPTION)
export(${args} HOMEPAGE_URL)
export(${args} DEFAULT_TARGETS)
export(${args} DEFAULT_CONFIGURATIONS)
export(${args} PROJECT)
export(${args} LICENSE "" DEFAULT_LICENSE "")

View File

@@ -1,64 +0,0 @@
CMake Error at BadArgs4\.cmake:[0-9]+ \(export\):
export EXPORT given unknown argument: "LOWER_CASE_FILE"\.
Call Stack \(most recent call first\):
CMakeLists\.txt:3 \(include\)
CMake Error at BadArgs4\.cmake:[0-9]+ \(export\):
export EXPORT given unknown argument: "APPENDIX"\.
Call Stack \(most recent call first\):
CMakeLists\.txt:3 \(include\)
CMake Error at BadArgs4\.cmake:[0-9]+ \(export\):
export EXPORT given unknown argument: "VERSION"\.
Call Stack \(most recent call first\):
CMakeLists\.txt:3 \(include\)
CMake Error at BadArgs4\.cmake:[0-9]+ \(export\):
export EXPORT given unknown argument: "LICENSE"\.
Call Stack \(most recent call first\):
CMakeLists\.txt:3 \(include\)
CMake Error at BadArgs4\.cmake:[0-9]+ \(export\):
export EXPORT given unknown argument: "DEFAULT_LICENSE"\.
Call Stack \(most recent call first\):
CMakeLists\.txt:3 \(include\)
CMake Error at BadArgs4\.cmake:[0-9]+ \(export\):
export EXPORT given unknown argument: "DESCRIPTION"\.
Call Stack \(most recent call first\):
CMakeLists\.txt:3 \(include\)
CMake Error at BadArgs4\.cmake:[0-9]+ \(export\):
export EXPORT given unknown argument: "HOMEPAGE_URL"\.
Call Stack \(most recent call first\):
CMakeLists\.txt:3 \(include\)
CMake Error at BadArgs4\.cmake:[0-9]+ \(export\):
export EXPORT given unknown argument: "DEFAULT_TARGETS"\.
Call Stack \(most recent call first\):
CMakeLists\.txt:3 \(include\)
CMake Error at BadArgs4\.cmake:[0-9]+ \(export\):
export EXPORT given unknown argument: "DEFAULT_CONFIGURATIONS"\.
Call Stack \(most recent call first\):
CMakeLists\.txt:3 \(include\)
CMake Error at BadArgs4\.cmake:[0-9]+ \(export\):
export EXPORT given unknown argument: "PROJECT"\.
Call Stack \(most recent call first\):
CMakeLists\.txt:3 \(include\)
CMake Error at BadArgs4\.cmake:[0-9]+ \(export\):
export EXPORT given unknown argument: "NO_PROJECT_METADATA"\.
Call Stack \(most recent call first\):
CMakeLists\.txt:3 \(include\)

View File

@@ -1,14 +0,0 @@
add_library(foo INTERFACE)
install(TARGETS foo EXPORT foo DESTINATION .)
set(args EXPORT foo)
export(${args} LOWER_CASE_FILE)
export(${args} APPENDIX test)
export(${args} VERSION 1.0)
export(${args} LICENSE "BSD-3-Clause AND CC-BY-SA-4.0")
export(${args} DEFAULT_LICENSE "BSD-3-Clause")
export(${args} DESCRIPTION "Test")
export(${args} HOMEPAGE_URL "example.com")
export(${args} DEFAULT_TARGETS foo)
export(${args} DEFAULT_CONFIGURATIONS Release)
export(${args} PROJECT foo)
export(${args} NO_PROJECT_METADATA)

View File

@@ -1,95 +0,0 @@
CMake Error at BadArgs5\.cmake:[0-9]+ \(export\):
export EXPORT given invalid argument:
APPENDIX: missing required value
Call Stack \(most recent call first\):
CMakeLists\.txt:3 \(include\)
CMake Error at BadArgs5\.cmake:[0-9]+ \(export\):
export EXPORT given invalid argument:
VERSION: missing required value
Call Stack \(most recent call first\):
CMakeLists\.txt:3 \(include\)
CMake Error at BadArgs5\.cmake:[0-9]+ \(export\):
export EXPORT given invalid argument:
COMPAT_VERSION: missing required value
Call Stack \(most recent call first\):
CMakeLists\.txt:3 \(include\)
CMake Error at BadArgs5\.cmake:[0-9]+ \(export\):
export EXPORT given invalid argument:
VERSION_SCHEMA: missing required value
Call Stack \(most recent call first\):
CMakeLists\.txt:3 \(include\)
CMake Error at BadArgs5\.cmake:[0-9]+ \(export\):
export EXPORT given invalid argument:
LICENSE: missing required value
Call Stack \(most recent call first\):
CMakeLists\.txt:3 \(include\)
CMake Error at BadArgs5\.cmake:[0-9]+ \(export\):
export EXPORT given invalid argument:
DEFAULT_LICENSE: missing required value
Call Stack \(most recent call first\):
CMakeLists\.txt:3 \(include\)
CMake Error at BadArgs5\.cmake:[0-9]+ \(export\):
export EXPORT given invalid argument:
DESCRIPTION: missing required value
Call Stack \(most recent call first\):
CMakeLists\.txt:3 \(include\)
CMake Error at BadArgs5\.cmake:[0-9]+ \(export\):
export EXPORT given invalid argument:
HOMEPAGE_URL: missing required value
Call Stack \(most recent call first\):
CMakeLists\.txt:3 \(include\)
CMake Error at BadArgs5\.cmake:[0-9]+ \(export\):
export EXPORT given invalid argument:
DEFAULT_TARGETS: missing required value
Call Stack \(most recent call first\):
CMakeLists\.txt:3 \(include\)
CMake Error at BadArgs5\.cmake:[0-9]+ \(export\):
export EXPORT given invalid argument:
DEFAULT_CONFIGURATIONS: missing required value
Call Stack \(most recent call first\):
CMakeLists\.txt:3 \(include\)
CMake Error at BadArgs5\.cmake:[0-9]+ \(export\):
export EXPORT given invalid argument:
PROJECT: missing required value
Call Stack \(most recent call first\):
CMakeLists\.txt:3 \(include\)
CMake Error at BadArgs5\.cmake:[0-9]+ \(export\):
export EXPORT given invalid arguments:
DEFAULT_LICENSE: empty string not allowed
LICENSE: empty string not allowed
Call Stack \(most recent call first\):
CMakeLists\.txt:3 \(include\)

View File

@@ -1,15 +0,0 @@
add_library(foo INTERFACE)
install(TARGETS foo EXPORT foo DESTINATION .)
set(args EXPORT foo PACKAGE_INFO foo)
export(${args} APPENDIX)
export(${args} VERSION)
export(${args} COMPAT_VERSION)
export(${args} VERSION_SCHEMA)
export(${args} LICENSE)
export(${args} DEFAULT_LICENSE)
export(${args} DESCRIPTION)
export(${args} HOMEPAGE_URL)
export(${args} DEFAULT_TARGETS)
export(${args} DEFAULT_CONFIGURATIONS)
export(${args} PROJECT)
export(${args} LICENSE "" DEFAULT_LICENSE "")

View File

@@ -2,4 +2,4 @@ add_library(foo INTERFACE)
add_library(dog INTERFACE)
install(TARGETS foo EXPORT foo DESTINATION .)
install(TARGETS dog EXPORT dog DESTINATION .)
export(EXPORT foo PACKAGE_INFO test DEFAULT_TARGETS dog cat)
export(PACKAGE_INFO test EXPORT foo DEFAULT_TARGETS dog cat)

View File

@@ -1,3 +1,3 @@
add_library(foo INTERFACE)
install(TARGETS foo EXPORT foo DESTINATION .)
export(EXPORT foo PACKAGE_INFO "%foo")
export(PACKAGE_INFO "%foo" EXPORT foo)

View File

@@ -7,7 +7,7 @@ add_library(bar foo.cxx)
target_link_libraries(bar $<COMPILE_ONLY:linkOnlyOne> $<COMPILE_ONLY:linkOnlyTwo> foo)
install(TARGETS foo linkOnlyOne linkOnlyTwo EXPORT foo)
export(EXPORT foo PACKAGE_INFO foo)
export(PACKAGE_INFO foo EXPORT foo)
install(TARGETS bar EXPORT bar)
export(EXPORT bar PACKAGE_INFO bar)
export(PACKAGE_INFO bar EXPORT bar)

View File

@@ -5,7 +5,7 @@ add_library(bar foo.cxx)
target_link_libraries(bar $<COMPILE_ONLY:$<COMPILE_ONLY:foo>>)
install(TARGETS foo EXPORT foo)
export(EXPORT foo PACKAGE_INFO foo)
export(PACKAGE_INFO foo EXPORT foo)
install(TARGETS bar EXPORT bar)
export(EXPORT bar PACKAGE_INFO bar)
export(PACKAGE_INFO bar EXPORT bar)

View File

@@ -10,4 +10,4 @@ endif()
add_library(foo foo.cxx)
install(TARGETS foo EXPORT foo)
export(EXPORT foo PACKAGE_INFO foo)
export(PACKAGE_INFO foo EXPORT foo)

View File

@@ -8,4 +8,4 @@ add_library(foo INTERFACE)
target_link_libraries(foo INTERFACE bar::bar)
install(TARGETS foo EXPORT foo DESTINATION .)
export(EXPORT foo PACKAGE_INFO foo)
export(PACKAGE_INFO foo EXPORT foo)

View File

@@ -8,4 +8,4 @@ add_library(foo INTERFACE)
target_link_libraries(foo INTERFACE baz::baz)
install(TARGETS foo EXPORT foo DESTINATION .)
export(EXPORT foo PACKAGE_INFO foo)
export(PACKAGE_INFO foo EXPORT foo)

View File

@@ -4,8 +4,8 @@ target_link_libraries(bar foo)
install(TARGETS foo EXPORT foo)
export(EXPORT foo NAMESPACE "${NAMESPACE}")
export(EXPORT foo PACKAGE_INFO foo)
export(PACKAGE_INFO foo EXPORT foo)
install(TARGETS bar EXPORT bar)
export(EXPORT bar)
export(EXPORT bar PACKAGE_INFO bar)
export(PACKAGE_INFO bar EXPORT bar)

View File

@@ -1,4 +1,4 @@
add_library(foo INTERFACE)
install(TARGETS foo EXPORT foo DESTINATION .)
export(EXPORT foo PACKAGE_INFO foo)
export(EXPORT foo PACKAGE_INFO foo)
export(PACKAGE_INFO foo EXPORT foo)
export(PACKAGE_INFO foo EXPORT foo)

View File

@@ -6,4 +6,4 @@ set(CMAKE_CONFIGURATION_TYPES "" CACHE STRING "" FORCE)
add_library(foo foo.cxx)
install(TARGETS foo EXPORT foo)
export(EXPORT foo PACKAGE_INFO foo)
export(PACKAGE_INFO foo EXPORT foo)

View File

@@ -1,2 +1,2 @@
CMake Error at ExperimentalGate\.cmake:5 \(export\):
export EXPORT given unknown argument: "PACKAGE_INFO"\.
export does not recognize sub-command PACKAGE_INFO

View File

@@ -2,4 +2,4 @@ unset(CMAKE_EXPERIMENTAL_EXPORT_PACKAGE_INFO)
add_library(foo INTERFACE)
install(TARGETS foo EXPORT foo DESTINATION .)
export(EXPORT foo PACKAGE_INFO foo)
export(PACKAGE_INFO foo EXPORT foo)

View File

@@ -5,4 +5,4 @@ set(
add_library(foo INTERFACE)
install(TARGETS foo EXPORT foo DESTINATION .)
export(EXPORT foo PACKAGE_INFO foo)
export(PACKAGE_INFO foo EXPORT foo)

View File

@@ -1,4 +1,4 @@
add_library(foo INTERFACE SYMBOLIC)
install(TARGETS foo EXPORT foo DESTINATION .)
export(EXPORT foo PACKAGE_INFO foo)
export(PACKAGE_INFO foo EXPORT foo)

View File

@@ -26,4 +26,4 @@ install(
FILE_SET genex
DESTINATION $<$<CONFIG:FAKE_CONFIG>:FAKE_DEST>genex
)
export(EXPORT foo PACKAGE_INFO foo)
export(PACKAGE_INFO foo EXPORT foo)

View File

@@ -13,4 +13,4 @@ target_link_libraries(foo INTERFACE /usr/lib/libm.so)
set_property(TARGET foo PROPERTY SPDX_LICENSE "BSD-3-Clause")
install(TARGETS foo EXPORT foo DESTINATION .)
export(EXPORT foo PACKAGE_INFO foo)
export(PACKAGE_INFO foo EXPORT foo)

View File

@@ -5,7 +5,7 @@ add_library(bar foo.cxx)
target_link_libraries(bar $<1:foo> $<1:$<CONFIG>>)
install(TARGETS foo EXPORT foo)
export(EXPORT foo PACKAGE_INFO foo)
export(PACKAGE_INFO foo EXPORT foo)
install(TARGETS bar EXPORT bar)
export(EXPORT bar PACKAGE_INFO bar)
export(PACKAGE_INFO bar EXPORT bar)

View File

@@ -7,7 +7,7 @@ add_library(bar foo.cxx)
target_link_libraries(bar $<LINK_ONLY:linkOnlyOne> $<LINK_ONLY:linkOnlyTwo> foo)
install(TARGETS foo linkOnlyOne linkOnlyTwo EXPORT foo)
export(EXPORT foo PACKAGE_INFO foo)
export(PACKAGE_INFO foo EXPORT foo)
install(TARGETS bar EXPORT bar)
export(EXPORT bar PACKAGE_INFO bar)
export(PACKAGE_INFO bar EXPORT bar)

View File

@@ -5,7 +5,7 @@ add_library(bar foo.cxx)
target_link_libraries(bar $<LINK_ONLY:$<LINK_ONLY:foo>>)
install(TARGETS foo EXPORT foo)
export(EXPORT foo PACKAGE_INFO foo)
export(PACKAGE_INFO foo EXPORT foo)
install(TARGETS bar EXPORT bar)
export(EXPORT bar PACKAGE_INFO bar)
export(PACKAGE_INFO bar EXPORT bar)

View File

@@ -1,4 +1,4 @@
add_library(foo INTERFACE)
install(TARGETS foo EXPORT foo DESTINATION .)
export(EXPORT foo PACKAGE_INFO LowerCase LOWER_CASE_FILE)
export(EXPORT foo PACKAGE_INFO PreserveCase)
export(PACKAGE_INFO LowerCase EXPORT foo LOWER_CASE_FILE)
export(PACKAGE_INFO PreserveCase EXPORT foo)

View File

@@ -1,8 +1,8 @@
add_library(foo INTERFACE)
install(TARGETS foo EXPORT foo DESTINATION .)
export(
EXPORT foo
PACKAGE_INFO foo
EXPORT foo
VERSION 1.2.3
VERSION_SCHEMA simple
COMPAT_VERSION 1.2.0

View File

@@ -1,3 +1,3 @@
add_library(foo INTERFACE)
install(TARGETS foo EXPORT foo DESTINATION .)
export(EXPORT foo PACKAGE_INFO foo)
export(PACKAGE_INFO foo EXPORT foo)

View File

@@ -1,16 +1,19 @@
add_library(foo INTERFACE)
install(TARGETS foo EXPORT foo DESTINATION .)
export(EXPORT foo
export(
PACKAGE_INFO foo1
EXPORT foo
VERSION 1.0)
export(EXPORT foo
export(
PACKAGE_INFO foo2
EXPORT foo
VERSION 1.5
COMPAT_VERSION 1.0)
export(EXPORT foo
export(
PACKAGE_INFO foo3
EXPORT foo
VERSION 1.0
VERSION_SCHEMA simple)

View File

@@ -9,7 +9,7 @@ add_library(foo INTERFACE)
install(TARGETS foo EXPORT foo DESTINATION .)
export(
EXPORT foo
PACKAGE_INFO foo
EXPORT foo
NO_PROJECT_METADATA
)

View File

@@ -11,20 +11,21 @@ install(TARGETS foo EXPORT foo DESTINATION .)
# Test inheriting from project matching package name.
export(
EXPORT foo
PACKAGE_INFO foo
EXPORT foo
)
# Test inheriting from a specified project.
export(
PACKAGE_INFO test1
EXPORT foo
PACKAGE_INFO test1 PROJECT foo
PROJECT foo
)
# Test that inheriting doesn't override explicitly specified metadata.
export(
EXPORT foo
PACKAGE_INFO test2
EXPORT foo
PROJECT foo
VERSION 1.4.7
LICENSE "Apache-2.0"

View File

@@ -3,4 +3,4 @@ add_library(canine INTERFACE)
target_link_libraries(canine INTERFACE mammal)
install(TARGETS canine EXPORT dog DESTINATION .)
export(EXPORT dog PACKAGE_INFO dog)
export(PACKAGE_INFO dog EXPORT dog)

View File

@@ -11,4 +11,4 @@ export(EXPORT foo)
export(EXPORT bar NAMESPACE bar_)
install(TARGETS test EXPORT test DESTINATION .)
export(EXPORT test PACKAGE_INFO test)
export(PACKAGE_INFO test EXPORT test)

View File

@@ -4,4 +4,4 @@ add_library(foo INTERFACE)
target_link_libraries(foo INTERFACE bar)
install(TARGETS foo EXPORT foo DESTINATION .)
export(EXPORT foo PACKAGE_INFO foo)
export(PACKAGE_INFO foo EXPORT foo)

View File

@@ -8,4 +8,4 @@ add_library(foo INTERFACE)
target_link_libraries(foo INTERFACE wrong::lib)
install(TARGETS foo EXPORT foo DESTINATION .)
export(EXPORT foo PACKAGE_INFO foo)
export(PACKAGE_INFO foo EXPORT foo)

View File

@@ -14,7 +14,7 @@ add_library(bar ALIAS libc)
target_link_libraries(libd INTERFACE test::liba foo bar)
install(TARGETS libb EXPORT foo DESTINATION .)
export(EXPORT foo PACKAGE_INFO foo)
export(PACKAGE_INFO foo EXPORT foo)
install(TARGETS libc libd EXPORT bar DESTINATION .)
export(EXPORT bar PACKAGE_INFO bar)
export(PACKAGE_INFO bar EXPORT bar)

View File

@@ -20,8 +20,6 @@ run_cmake(BadArgs0)
run_cmake(BadArgs1)
run_cmake(BadArgs2)
run_cmake(BadArgs3)
run_cmake(BadArgs4)
run_cmake(BadArgs5)
run_cmake(BadName)
run_cmake(DuplicateOutput)
run_cmake(BadDefaultTarget)

View File

@@ -17,4 +17,4 @@ install(
DESTINATION .
)
export(EXPORT foo PACKAGE_INFO foo)
export(PACKAGE_INFO foo EXPORT foo)

View File

@@ -11,4 +11,4 @@ find_package(Symbolic REQUIRED CONFIG
target_link_libraries(bar INTERFACE Symbolic::test)
install(TARGETS bar EXPORT bar DESTINATION .)
export(EXPORT bar PACKAGE_INFO bar)
export(PACKAGE_INFO bar EXPORT bar)

View File

@@ -2,37 +2,37 @@ add_library(foo INTERFACE)
install(TARGETS foo EXPORT foo DESTINATION .)
# Try exporting a 'properly' simple version.
export(EXPORT foo PACKAGE_INFO foo1 VERSION 1.2.3)
export(PACKAGE_INFO foo1 EXPORT foo VERSION 1.2.3)
# Try exporting a version with many components.
export(EXPORT foo PACKAGE_INFO foo2 VERSION 1.21.23.33.37.42.9.0.12)
export(PACKAGE_INFO foo2 EXPORT foo VERSION 1.21.23.33.37.42.9.0.12)
# Try exporting a version with a label.
export(EXPORT foo PACKAGE_INFO foo3 VERSION "1.2.3+git1234abcd")
export(PACKAGE_INFO foo3 EXPORT foo VERSION "1.2.3+git1234abcd")
# Try exporting a version with a different label.
export(EXPORT foo PACKAGE_INFO foo4 VERSION "1.2.3-0.example")
export(PACKAGE_INFO foo4 EXPORT foo VERSION "1.2.3-0.example")
# Try exporting with the schema explicitly specified.
export(
EXPORT foo
PACKAGE_INFO foo5
EXPORT foo
VERSION "1.2.3-0.example"
VERSION_SCHEMA "simple"
)
# Try exporting with a custom-schema version.
export(
EXPORT foo
PACKAGE_INFO foo6
EXPORT foo
VERSION "foo!test"
VERSION_SCHEMA "custom"
)
# Try exporting with a recognized but not-checked schema.
export(
EXPORT foo
PACKAGE_INFO foo7
EXPORT foo
VERSION "invalid"
VERSION_SCHEMA "pep440"
)

View File

@@ -2,4 +2,4 @@ add_library(foo INTERFACE)
install(TARGETS foo EXPORT foo DESTINATION .)
# Try exporting a non-conforming version.
export(EXPORT foo PACKAGE_INFO foo VERSION "1.2.3rc1")
export(PACKAGE_INFO foo EXPORT foo VERSION "1.2.3rc1")

View File

@@ -8,8 +8,8 @@ install(TARGETS foo EXPORT foo DESTINATION .)
# Try exporting with an unrecognized schema.
export(
EXPORT foo
PACKAGE_INFO foo
EXPORT foo
VERSION "irrelevant"
VERSION_SCHEMA "unrecognized"
)

View File

@@ -1,7 +1,7 @@
include(${CMAKE_CURRENT_LIST_DIR}/../Sbom/ApplicationTarget.cmake)
export(
EXPORT application_targets
SBOM application_targets
EXPORT application_targets
FORMAT "spdx-3.0+json"
)

View File

@@ -1,6 +1,6 @@
include(${CMAKE_CURRENT_LIST_DIR}/../Sbom/InterfaceTarget.cmake)
export(
EXPORT interface_targets
SBOM interface_targets
EXPORT interface_targets
)

View File

@@ -1,7 +1,7 @@
include(${CMAKE_CURRENT_LIST_DIR}/../Sbom/MissingPackageNamespace.cmake)
export(
EXPORT test_targets
SBOM interface_targets
EXPORT test_targets
VERSION 1.0.2
)

View File

@@ -1,8 +1,8 @@
include(${CMAKE_CURRENT_LIST_DIR}/../Sbom/ProjectMetadata.cmake)
export(
EXPORT test_targets
SBOM test_targets
EXPORT test_targets
DESCRIPTION "An eloquent description"
LICENSE "BSD-3"
HOMEPAGE_URL "www.example.com"

View File

@@ -1,3 +1,3 @@
include(${CMAKE_CURRENT_LIST_DIR}/../Sbom/ReferencesNonExportedTarget.cmake)
export(EXPORT dog SBOM dog)
export(SBOM dog EXPORT dog)

View File

@@ -1,4 +1,4 @@
include(${CMAKE_CURRENT_LIST_DIR}/../Sbom/Requirements.cmake)
export(EXPORT foo SBOM foo)
export(EXPORT bar SBOM bar)
export(SBOM foo EXPORT foo)
export(SBOM bar EXPORT bar)

View File

@@ -1,6 +1,6 @@
include(${CMAKE_CURRENT_LIST_DIR}/../Sbom/SharedTarget.cmake)
export(
EXPORT shared_targets
SBOM shared_targets
EXPORT shared_targets
)