CMake Can Generate SBOMs Natively Now: What It Captures and What It Misses

| Interlynk

CMake natively emitting an SPDX software bill of materials from a layered build, with the deepest layers shadowed to show what it does not capture.

CMake added experimental native SBOM generation in a 2026 release (SPDX 3.0.1, DARPA-funded). Here is how to turn it on, exactly what it records, and where it still needs a build-aware layer for embedded firmware.

The news: CMake now ships an SBOM generator

CMake added experimental support for generating a Software Bill of Materials directly from the build. Kitware announced the release on 21 September 2026. The work was performed with Riverside Research under DARPA Contract HR001124C0489, and the examples target CMake 4.3. For a build system running millions of C and C++ projects, producing a basic SBOM is becoming a native switch inside the existing build process, instead of a separate scanning tool bolted on afterward.

This post covers what the feature does today, how to enable it, what it records well, and where it still stops. For the wider picture of every option, see our comparison of the four ways to generate an SBOM from a CMake build.

What it is and how to turn it on

The feature is gated behind an experimental flag to prevent accidental activation. You set CMAKE_EXPERIMENTAL_GENERATE_SBOM to the specific UUID that matches your CMake version. You select the output format with CMAKE_INSTALL_SBOM_FORMATS=SPDX, and then declare generation in your project with the new install(SBOM) and export(SBOM) commands. CMake builds the document from the same dependency graph it uses to compile and link, and writes the output as SPDX 3.0.1 JSON-LD.

Because the feature is experimental, the flag, the command surface, and the supported CMake version remain in motion. Check the official CMake documentation for the current UUID and syntax before wiring it into a pipeline.

What it captures well

For a project that installs and exports its targets through CMake, the output is genuinely useful. It records package names, versions, dependency relationships, license identifiers, checksums, and the installed targets tied to your install and export sets. The process is fast. It reads CMake's own target graph and produces a clean, standards-based SPDX document with no extra tooling in the loop. For an application built entirely through well-declared CMake targets, that covers a lot of ground on day one.

Where it still stops

Two limits matter, and being clear about them is the point of this post.

  1. The tool describes what CMake knows about. The document is built from your install and export declarations alongside the graph CMake resolves, so components that are not modeled as CMake targets fall outside it: hand-vendored source in the tree, prebuilt static archives fetched into the build, and silicon-vendor SDKs that ship as opaque libraries. In embedded firmware, that is often where the interesting dependencies live, which is the same gap that makes C/C++ SBOMs hard in the first place.

  2. The feature is early. On the current experimental release, a developer testing CMake 4.3.2 reported on the CMake Discourse that a statically linked dependency, the fmt library pulled in through FetchContent, showed up in the SPDX output marked as a shared relationship rather than statically linked. That static-versus-shared distinction is exactly what a vulnerability triage or a compliance reviewer leans on, so verify the output against what actually linked into your binary before relying on it. This is a rough edge of an experimental feature, and it will likely improve, but it is real today.

One thing that is not a limitation, just a scope boundary: the SBOM does not perform vulnerability analysis. It produces structured data for downstream tools to evaluate, which is the correct division of labor.

When native CMake SBOM is enough, and when it falls short

For a pure CMake application whose dependencies are all declared as installed or exported targets, native SBOM generation is a fast, standards-based starting point, and you should turn it on. Embedded and firmware work needs a partner. Real dependencies there often include vendored source, static archives, and vendor SDKs that never appear as clean CMake targets, and auditors need the static-versus-shared and shipped-versus-present distinctions to be right. The build graph alone does not see enough for those cases, and that is where a build-aware generator earns its place.

How Interlynk fits

Interlynk's generator, lynkctl, handles that second case. It runs after your existing build with no rebuild, and reads the actual compiler and linker invocations your build emits, so it captures the vendored code, static archives, and silicon-vendor SDKs that a graph-only view leaves out, and it records per-component evidence, down to the source file, the compile line, and a confidence tier. The two approaches layer cleanly: start with native CMake SBOM for what CMake declares, and add build-aware generation for the firmware layers underneath. See the C/C++ SBOM generator for embedded software, and the full field in our guide to the best SBOM tools.

Frequently asked questions

Can CMake generate an SBOM without extra tools now?

Yes. Through an experimental feature added in a 2026 release of CMake, it emits an SPDX 3.0.1 SBOM from its own build graph once you enable the feature gate and add the install(SBOM) or export(SBOM) commands. Confirm the current flags and CMake version in the official documentation, since the feature is experimental.

What SBOM format does CMake produce?

SPDX 3.0.1 in JSON-LD form, built from the targets and dependencies CMake resolves during configure and install.

Does native CMake SBOM capture statically linked and vendored dependencies?

It captures what your project models as installed or exported CMake targets. Hand-vendored source, prebuilt static archives, and vendor SDKs that are not declared as targets can fall outside it, and on the current experimental release the static-versus-shared labeling of a linked dependency has been reported as unreliable. Verify the output against what actually linked into your binary.

Should I still use a dedicated SBOM generator?

For a pure CMake application, native generation may be enough. For embedded or regulated firmware, pair it with a build-aware generator that reads the real compiler and linker invocations, so vendored code, static archives, and vendor SDKs are captured with evidence. See the four ways to generate an SBOM from a CMake build.

Where to go next

For the full comparison of native CMake SBOM, open-source modules, binary analysis, and build-aware generation, read four ways to generate an SBOM from a CMake build. For the wider category, see our guide to the best SBOM tools.

Trusted by security and compliance teams at 100+ regulated companies

See your SBOM Done Right

Interlynk automates SBOMs, manages open source risks, monitors suppliers, and prepares you for the post-quantum era, all in one trusted platform.

Trusted by security and compliance teams at 100+ regulated companies

Interlynk automates SBOMs, manages open source risks, monitors suppliers, and prepares you for the post-quantum era, all in one trusted platform.

Audit-ready SBOM. With every build.

Trusted by security and compliance teams at 100+ regulated companies

Interlynk automates SBOMs, manages open source risks, monitors suppliers, and prepares you for the post-quantum era, all in one trusted platform.

Audit-ready SBOM. With every build.