blob: 360ae63fef657a441efbf0e4314b5b12e2c34f0c [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. */
#include "cmExportBuildSbomGenerator.h"
#include <functional>
#include <utility>
#include <vector>
#include <cmext/string_view>
#include "cmGeneratorExpression.h"
#include "cmSbomArguments.h"
#include "cmSbomObject.h"
#include "cmSpdx.h"
#include "cmStringAlgorithms.h"
class cmGeneratorTarget;
cmExportBuildSbomGenerator::cmExportBuildSbomGenerator(cmSbomArguments args)
: cmExportSbomGenerator(args)
{
this->SetNamespace(cmStrCat(this->GetPackageName(), "::"_s));
}
bool cmExportBuildSbomGenerator::GenerateMainFile(std::ostream& os)
{
if (!this->CollectExports([&](cmGeneratorTarget const*) {})) {
return false;
}
cmSbomDocument doc;
doc.Graph.reserve(256);
cmSpdxDocument* project = insert_back(doc.Graph, this->GenerateSbom());
std::vector<TargetProperties> targets;
for (auto const& exp : this->Exports) {
cmGeneratorTarget const* target = exp.Target;
ImportPropertyMap properties;
this->PopulateInterfaceProperties(target, properties);
this->PopulateInterfaceLinkLibrariesProperty(
target, cmGeneratorExpression::BuildInterface, properties);
this->PopulateLinkLibrariesProperty(
target, cmGeneratorExpression::BuildInterface, properties);
targets.push_back(TargetProperties{
insert_back(project->RootElements, this->GenerateImportTarget(target)),
target, std::move(properties) });
}
for (auto const& target : targets) {
this->GenerateProperties(doc, project, target, targets);
}
this->WriteSbom(doc, os);
return true;
}
void cmExportBuildSbomGenerator::HandleMissingTarget(
std::string& /* link_libs */, cmGeneratorTarget const* /* depender */,
cmGeneratorTarget* /* dependee */)
{
}
std::string cmExportBuildSbomGenerator::GetCxxModulesDirectory() const
{
return {};
}
cm::string_view cmExportBuildSbomGenerator::GetImportPrefixWithSlash() const
{
return "";
}
std::string cmExportBuildSbomGenerator::GetCxxModuleFile(
std::string const& /*name*/) const
{
return {};
}
void cmExportBuildSbomGenerator::GenerateCxxModuleConfigInformation(
std::string const& /*name*/, std::ostream& /*os*/) const
{
// TODO
}