blob: fd8dcdeb58e371e52c819117eb0a47169fc984e2 [file] [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 <iosfwd>
#include <memory>
#include <string>
#include <vector>
#include "cmInstallGenerator.h"
class cmDiagnosticContext;
class cmExportSet;
class cmGeneratorTarget;
class cmInstallSbomBuilder;
class cmLocalGenerator;
class cmSbomArguments;
/** \class cmInstallSbomGenerator
* \brief Generate installation rules for SBOM files.
*
* Thin cmInstallGenerator subclass that owns a cmInstallSbomBuilder.
* At generate time it writes the SBOM into a temporary file in the build tree;
* the cmake_install.cmake script then copies that file to the install
* destination.
*/
class cmInstallSbomGenerator : public cmInstallGenerator
{
public:
cmInstallSbomGenerator(std::vector<cmExportSet*> exportSets,
std::string destination, std::string filePermissions,
std::vector<std::string> const& configurations,
std::string component, MessageLevel message,
bool excludeFromAll, cmSbomArguments args,
cmDiagnosticContext context);
cmInstallSbomGenerator(cmInstallSbomGenerator const&) = delete;
~cmInstallSbomGenerator() override;
cmInstallSbomGenerator& operator=(cmInstallSbomGenerator const&) = delete;
bool Compute(cmLocalGenerator* lg) override;
std::string const& GetInstallFile() const { return this->SbomFilePath; }
/** True if this SBOM directly describes `target`. Used by peer SBOMs to
* attribute cross-references when install(export) provenance is absent. */
bool CoversTarget(cmGeneratorTarget const* target) const;
std::string const& GetPackageName() const;
/** True if `set` is one of the export sets this SBOM was built from.
* Used by the autogen path to skip sets already explicitly tied to an
* install(SBOM). */
bool CoversExportSet(cmExportSet const* set) const;
protected:
void GenerateScript(std::ostream& os) override;
void GenerateScriptActions(std::ostream& os, Indent indent) override;
private:
std::string TempSbomFilePath;
std::string const FilePermissions;
std::string const SbomFileName;
std::string const SbomFilePath;
cmLocalGenerator* LocalGenerator = nullptr;
std::unique_ptr<cmInstallSbomBuilder> Builder;
};