diff --git a/.bazelrc b/.bazelrc index d4464a2af2e..908aba11c9f 100644 --- a/.bazelrc +++ b/.bazelrc @@ -68,6 +68,12 @@ build:qnx-aarch64 --extra_toolchains=@score_qnx_aarch64_ifs_toolchain//:ifs-aarc build:linux-x86_64 --config=_common build:linux-x86_64 --config=unified +build:linux-aarch64 --config=_common +build:linux-aarch64 --extra_toolchains=@score_gcc_aarch64_toolchain//:aarch64-linux-gcc_12.2.0 +build:linux-aarch64 --extra_toolchains=@ferrocene_aarch64_ebclfsa//:rust_ferrocene_toolchain +build:linux-aarch64 --platforms=@score_bazel_platforms//:aarch64-linux-gcc_12.2.0-posix +build:linux-aarch64 --action_env=BINDGEN_EXTRA_CLANG_ARGS_aarch64_unknown_linux_gnu=--sysroot=external/score_bazel_cpp_toolchains++gcc+score_gcc_aarch64_toolchain_pkg/aarch64-unknown-linux-gnu/sysroot + build:eb-aarch64 --config=_common build:eb-aarch64 --extra_toolchains=@score_ebclfsa_toolchain//:aarch64-linux-sdk_2.0.0-beta2-ebclfsa build:eb-aarch64 --extra_toolchains=@ferrocene_aarch64_ebclfsa//:rust_ferrocene_toolchain diff --git a/.github/workflows/build_tck.yml b/.github/workflows/build_tck.yml new file mode 100644 index 00000000000..0eb93891483 --- /dev/null +++ b/.github/workflows/build_tck.yml @@ -0,0 +1,126 @@ +# ******************************************************************************* +# Copyright (c) 2026 Contributors to the Eclipse Foundation +# +# See the NOTICE file(s) distributed with this work for additional +# information regarding copyright ownership. +# +# This program and the accompanying materials are made available under the +# terms of the Apache License Version 2.0 which is available at +# https://www.apache.org/licenses/LICENSE-2.0 +# +# SPDX-License-Identifier: Apache-2.0 +# ******************************************************************************* +name: Build TCK Binary +on: + workflow_dispatch: + pull_request: + paths: + - 'tck/**' + push: + branches: + - main + paths: + - 'tck/**' + release: + types: [created] +permissions: + contents: read +jobs: + build: + name: Build score-tck binary + runs-on: ubuntu-latest + permissions: + contents: read + steps: + - name: Checkout repository + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + - name: Setup Bazel + uses: bazel-contrib/setup-bazel@0.18.0 + with: + bazelisk-cache: true + disk-cache: tck-build + repository-cache: true + cache-save: ${{ github.event_name == 'push' && github.ref_name == 'main' }} + - name: Build product SBOM (golden reference) + run: | + bazel build --lockfile_mode=error //:sbom + - name: Build TCK binary + run: | + bazel build --lockfile_mode=error //tck:score-tck + # Copy to temp location to avoid conflict with bundle directory + cp bazel-bin/tck/score-tck /tmp/score-tck-bin + chmod +x /tmp/score-tck-bin + - name: Test TCK binary + run: | + /tmp/score-tck-bin version + echo "" + echo "Testing with golden SBOM..." + cat > /tmp/test-dist.toml << 'EOF' + [dist] + name = "test-dist" + version = "0.9.0" + platform_version = "0.9.0" + arch = "x86_64-linux" + + [dist.paths] + sbom_file = "bazel-bin/sbom.spdx.json" + EOF + /tmp/score-tck-bin run --config /tmp/test-dist.toml --report /tmp/tck-test-report + echo "" + echo "Report summary:" + head -20 /tmp/tck-test-report/summary.md + - name: Bundle TCK package + run: | + VERSION="${{ github.event.release.tag_name || '0.1.0' }}" + # Create bundle directory structure + mkdir -p score-tck-bundle/bin + mkdir -p score-tck-bundle/reference/policy + mkdir -p score-tck-bundle/tests + mkdir -p score-tck-bundle/docs + + # Copy binary + cp /tmp/score-tck-bin score-tck-bundle/bin/score-tck + + # Copy golden SBOM + cp bazel-bin/sbom.spdx.json score-tck-bundle/reference/ + + # Copy policy + cp tck/reference/policy/requirements.toml score-tck-bundle/reference/policy/ + + # Copy test definitions + cp tck/tests/behavioral.toml score-tck-bundle/tests/ + cp tck/tests/api_signatures.toml score-tck-bundle/tests/ + + # Copy config example + cp tck/tck.config.example.toml score-tck-bundle/ + + # Copy README + cp tck/README.md score-tck-bundle/ + + # Create tarball + tar -czvf score-tck-${VERSION}-linux-x86_64.tar.gz score-tck-bundle/ + echo "Created bundle: score-tck-${VERSION}-linux-x86_64.tar.gz" + ls -la score-tck-*.tar.gz + - name: Upload TCK bundle artifact + uses: actions/upload-artifact@604373da6381bf24206979c74d06a550515601b9 # v4.4.1 + with: + name: score-tck-bundle-linux-x86_64 + path: score-tck-*.tar.gz + retention-days: 30 + release: + if: github.event_name == 'release' + needs: build + runs-on: ubuntu-latest + permissions: + contents: write + steps: + - name: Download TCK bundle artifact + uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2 + with: + name: score-tck-bundle-linux-x86_64 + - name: Attach bundle to release + uses: softprops/action-gh-release@v2.5.0 + with: + files: score-tck-*.tar.gz + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/BUILD b/BUILD index 8764a908739..23df139afae 100644 --- a/BUILD +++ b/BUILD @@ -72,6 +72,7 @@ sbom( "@score_kyron//examples:main_macro", "@score_kyron//examples:safety_task", "@score_kyron//examples:select", + "@score_lifecycle//examples/cpp_lifecycle_app:cpp_lifecycle_app", "@score_logging//score/test/component/dlt_generator_app:dlt_generator", "@score_logging//score/test/component/logging_app:logging_app", "@score_time//examples/time/high_res_steady_time", diff --git a/MODULE.bazel.lock b/MODULE.bazel.lock index 2e2835f4fe3..a6985aa3662 100644 --- a/MODULE.bazel.lock +++ b/MODULE.bazel.lock @@ -85,6 +85,8 @@ "https://bcr.bazel.build/modules/bazel_features/1.38.0/MODULE.bazel": "f9b8a9c890ebd216b4049fd12a31d3c2602e3403c7af636b04fbbd7453edc9c9", "https://bcr.bazel.build/modules/bazel_features/1.39.0/MODULE.bazel": "28739425c1fc283c91931619749c832b555e60bcd1010b40d8441ce0a5cf726d", "https://bcr.bazel.build/modules/bazel_features/1.4.1/MODULE.bazel": "e45b6bb2350aff3e442ae1111c555e27eac1d915e77775f6fdc4b351b758b5d7", + "https://bcr.bazel.build/modules/bazel_features/1.43.0/MODULE.bazel": "defa2226f06ba20550d6548c3a2ea2a7929634437a52973869c20c225450eb91", + "https://bcr.bazel.build/modules/bazel_features/1.47.1/MODULE.bazel": "e6be691539341681678a68c2076771f6a73fcdc9823c5b6bf280d2e916d1ad80", "https://bcr.bazel.build/modules/bazel_features/1.50.0/MODULE.bazel": "2083ef9c7a469f520890483ccf8e0189d6e71e2117e7752e15e6554433d5ae3e", "https://bcr.bazel.build/modules/bazel_features/1.50.0/source.json": "e0ee3debde2789ff56e4452e612d126925ba9ab64d4bde79c67f099d2902df9b", "https://bcr.bazel.build/modules/bazel_features/1.9.0/MODULE.bazel": "885151d58d90d8d9c811eb75e3288c11f850e1d6b481a8c9f766adee4712358b", @@ -247,7 +249,8 @@ "https://bcr.bazel.build/modules/flatbuffers/25.9.23/MODULE.bazel": "32753ba60bf3bacfe7737c0f3e8e3e55624b19af5d398c485580d57492d145d8", "https://bcr.bazel.build/modules/gawk/5.3.2.bcr.1/MODULE.bazel": "cdf8cbe5ee750db04b78878c9633cc76e80dcf4416cbe982ac3a9222f80713c8", "https://bcr.bazel.build/modules/gawk/5.3.2.bcr.3/MODULE.bazel": "f1b7bb2dd53e8f2ef984b39485ec8a44e9076dda5c4b8efd2fb4c6a6e856a31d", - "https://bcr.bazel.build/modules/gawk/5.3.2.bcr.3/source.json": "ebe931bfe362e4b41e59ee00a528db6074157ff2ced92eb9e970acab2e1089c9", + "https://bcr.bazel.build/modules/gawk/5.4.0.bcr.1/MODULE.bazel": "51ae3c639651862f83e0e1e75019a136e818059dbf37f252a26c577aa2250ec4", + "https://bcr.bazel.build/modules/gawk/5.4.0.bcr.1/source.json": "b191c524463b72f1117000e01a3caa7bc95e7a6479c4ac001b7eb66a862d7dc8", "https://bcr.bazel.build/modules/gazelle/0.27.0/MODULE.bazel": "3446abd608295de6d90b4a8a118ed64a9ce11dcb3dda2dc3290a22056bd20996", "https://bcr.bazel.build/modules/gazelle/0.30.0/MODULE.bazel": "f888a1effe338491f35f0e0e85003b47bb9d8295ccba73c37e07702d8d31c65b", "https://bcr.bazel.build/modules/gazelle/0.32.0/MODULE.bazel": "b499f58a5d0d3537f3cf5b76d8ada18242f64ec474d8391247438bf04f58c7b8", @@ -300,8 +303,9 @@ "https://bcr.bazel.build/modules/mbedtls/3.6.0/MODULE.bazel": "8e380e4698107c5f8766264d4df92e36766248447858db28187151d884995a09", "https://bcr.bazel.build/modules/mbedtls/3.6.0/source.json": "1dbe7eb5258050afcc3806b9d43050f71c6f539ce0175535c670df606790b30c", "https://bcr.bazel.build/modules/nlohmann_json/3.11.3/MODULE.bazel": "87023db2f55fc3a9949c7b08dc711fae4d4be339a80a99d04453c4bb3998eefc", + "https://bcr.bazel.build/modules/nlohmann_json/3.12.0.bcr.1/MODULE.bazel": "a1c8bb07b5b91d971727c635f449d05623ac9608f6fe4f5f04254ea12f08e349", + "https://bcr.bazel.build/modules/nlohmann_json/3.12.0.bcr.1/source.json": "93f82a5ae985eb935c539bfee95e04767187818189241ac956f3ccadbdb8fb02", "https://bcr.bazel.build/modules/nlohmann_json/3.12.0/MODULE.bazel": "21f19a4479e994c1546cf6f10c65d2fa464cd95f49eebad98dc5bac49c801dab", - "https://bcr.bazel.build/modules/nlohmann_json/3.12.0/source.json": "6bf17b358c467effad70c02ab43e2d65939d740f667157397f583435909cfae1", "https://bcr.bazel.build/modules/nlohmann_json/3.6.1/MODULE.bazel": "6f7b417dcc794d9add9e556673ad25cb3ba835224290f4f848f8e2db1e1fca74", "https://bcr.bazel.build/modules/opencensus-cpp/0.0.0-20230502-50eb5de/MODULE.bazel": "02201d2921dadb4ec90c4980eca4b2a02904eddcf6fa02f3da7594fb7b0d821c", "https://bcr.bazel.build/modules/opencensus-cpp/0.0.0-20230502-50eb5de/source.json": "f50efc07822f5425bd1d3e40e977484f9c0142463052717d40ec85cd6744243e", @@ -404,10 +408,13 @@ "https://bcr.bazel.build/modules/rules_cc/0.2.14/MODULE.bazel": "353c99ed148887ee89c54a17d4100ae7e7e436593d104b668476019023b58df8", "https://bcr.bazel.build/modules/rules_cc/0.2.16/MODULE.bazel": "9242fa89f950c6ef7702801ab53922e99c69b02310c39fb6e62b2bd30df2a1d4", "https://bcr.bazel.build/modules/rules_cc/0.2.17/MODULE.bazel": "1849602c86cb60da8613d2de887f9566a6d354a6df6d7009f9d04a14402f9a84", + "https://bcr.bazel.build/modules/rules_cc/0.2.18/MODULE.bazel": "4460ec36adc8f722a6a2a4ac9374cb91f2acebadaa93fc37966129afb3dece87", "https://bcr.bazel.build/modules/rules_cc/0.2.22/MODULE.bazel": "94df4328edef9e44d38de5e73b037cd348e75e7ae55f4e21bf07878c41a31ebb", "https://bcr.bazel.build/modules/rules_cc/0.2.22/source.json": "b2d6d6f9c332ce269ad75b89c6f3168d809a66173c9040210fb9bcc733ab42fa", "https://bcr.bazel.build/modules/rules_cc/0.2.4/MODULE.bazel": "1ff1223dfd24f3ecf8f028446d4a27608aa43c3f41e346d22838a4223980b8cc", "https://bcr.bazel.build/modules/rules_cc/0.2.8/MODULE.bazel": "f1df20f0bf22c28192a794f29b501ee2018fa37a3862a1a2132ae2940a23a642", + "https://bcr.bazel.build/modules/rules_cc_autoconf/0.13.2/MODULE.bazel": "3ec13b93183a28b7088563e0fef1a51835dde06c272a1dabc5900e8bc26b2188", + "https://bcr.bazel.build/modules/rules_cc_autoconf/0.13.2/source.json": "e56c70d9525a6512263c562962d9087091da968945a0196f568d61866f23667a", "https://bcr.bazel.build/modules/rules_diff/1.0.0/MODULE.bazel": "1739509d8db9a6cd7d3584822340d3dfe1f9f27e62462fbca60aa061d88741b2", "https://bcr.bazel.build/modules/rules_distroless/0.8.0/MODULE.bazel": "a3e473943b685190e20668f5149f62a116fdcbeba66c7b9778f71d2aed4533c1", "https://bcr.bazel.build/modules/rules_distroless/0.8.0/source.json": "a6931e20d97a13675693adb8b6cd3a0e6eb5218db43dfc83b75566ddc4158efc", @@ -539,7 +546,8 @@ "https://bcr.bazel.build/modules/rules_shell/0.5.0/MODULE.bazel": "8c8447370594d45539f66858b602b0bb2cb2d3401a4ebb9ad25830c59c0f366d", "https://bcr.bazel.build/modules/rules_shell/0.6.0/MODULE.bazel": "c65e3ab217f64c3960e3ab55a53b430babcac6f0870fe79192812ae68a596a81", "https://bcr.bazel.build/modules/rules_shell/0.6.1/MODULE.bazel": "72e76b0eea4e81611ef5452aa82b3da34caca0c8b7b5c0c9584338aa93bae26b", - "https://bcr.bazel.build/modules/rules_shell/0.6.1/source.json": "20ec05cd5e592055e214b2da8ccb283c7f2a421ea0dc2acbf1aa792e11c03d0c", + "https://bcr.bazel.build/modules/rules_shell/0.8.0/MODULE.bazel": "f6a89f1d6a669a26f28fe814503857055d76306b79cfc11d12399af08d0b80ae", + "https://bcr.bazel.build/modules/rules_shell/0.8.0/source.json": "eb53cc815bc503c6683c5fe12d943f98883f81fc22f51403ec8a95610cba4195", "https://bcr.bazel.build/modules/rules_swift/1.16.0/MODULE.bazel": "4a09f199545a60d09895e8281362b1ff3bb08bbde69c6fc87aff5b92fcc916ca", "https://bcr.bazel.build/modules/rules_swift/1.18.0/MODULE.bazel": "a6aba73625d0dc64c7b4a1e831549b6e375fbddb9d2dde9d80c9de6ec45b24c9", "https://bcr.bazel.build/modules/rules_swift/2.1.1/MODULE.bazel": "494900a80f944fc7aa61500c2073d9729dff0b764f0e89b824eb746959bc1046", @@ -662,6 +670,8 @@ "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/bazel_features/1.38.0/MODULE.bazel": "not found", "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/bazel_features/1.39.0/MODULE.bazel": "not found", "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/bazel_features/1.4.1/MODULE.bazel": "not found", + "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/bazel_features/1.43.0/MODULE.bazel": "not found", + "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/bazel_features/1.47.1/MODULE.bazel": "not found", "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/bazel_features/1.50.0/MODULE.bazel": "not found", "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/bazel_features/1.9.0/MODULE.bazel": "not found", "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/bazel_features/1.9.1/MODULE.bazel": "not found", @@ -760,6 +770,7 @@ "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/flatbuffers/25.9.23/MODULE.bazel": "not found", "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/gawk/5.3.2.bcr.1/MODULE.bazel": "not found", "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/gawk/5.3.2.bcr.3/MODULE.bazel": "not found", + "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/gawk/5.4.0.bcr.1/MODULE.bazel": "not found", "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/gazelle/0.27.0/MODULE.bazel": "not found", "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/gazelle/0.30.0/MODULE.bazel": "not found", "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/gazelle/0.32.0/MODULE.bazel": "not found", @@ -800,6 +811,7 @@ "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/libpfm/4.11.0/MODULE.bazel": "not found", "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/mbedtls/3.6.0/MODULE.bazel": "not found", "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/nlohmann_json/3.11.3/MODULE.bazel": "not found", + "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/nlohmann_json/3.12.0.bcr.1/MODULE.bazel": "not found", "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/nlohmann_json/3.12.0/MODULE.bazel": "not found", "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/nlohmann_json/3.6.1/MODULE.bazel": "not found", "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/opencensus-cpp/0.0.0-20230502-50eb5de/MODULE.bazel": "not found", @@ -885,9 +897,11 @@ "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_cc/0.2.14/MODULE.bazel": "not found", "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_cc/0.2.16/MODULE.bazel": "not found", "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_cc/0.2.17/MODULE.bazel": "not found", + "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_cc/0.2.18/MODULE.bazel": "not found", "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_cc/0.2.22/MODULE.bazel": "not found", "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_cc/0.2.4/MODULE.bazel": "not found", "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_cc/0.2.8/MODULE.bazel": "not found", + "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_cc_autoconf/0.13.2/MODULE.bazel": "not found", "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_diff/1.0.0/MODULE.bazel": "not found", "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_distroless/0.8.0/MODULE.bazel": "not found", "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_foreign_cc/0.10.1/MODULE.bazel": "not found", @@ -1006,6 +1020,7 @@ "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_shell/0.5.0/MODULE.bazel": "not found", "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_shell/0.6.0/MODULE.bazel": "not found", "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_shell/0.6.1/MODULE.bazel": "not found", + "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_shell/0.8.0/MODULE.bazel": "not found", "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_swift/1.16.0/MODULE.bazel": "not found", "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_swift/1.18.0/MODULE.bazel": "not found", "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_swift/2.1.1/MODULE.bazel": "not found", @@ -1017,9 +1032,6 @@ "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/score_process/2.0.2/source.json": "5ae55f0dabcddeb5bfae16ce480e2c065f907d2b0ed6a8e4ed7409b259b004ee", "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/score_qnx_unit_tests/0.2.0/MODULE.bazel": "aaffff67916dd058737aac8e04368f12b214e7646ff58adbab48e6429d1a5410", "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/score_qnx_unit_tests/0.2.0/source.json": "c40a614fd88beab7cb65b8640debd44eff3fbc32a7839734ef1112f265d2eeef", - "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/score_rules_imagefs/0.0.3/MODULE.bazel": "d87fcd3485438284fa96d6a5a81923d6b6672468947423517cc43c4d7692ca6a", - "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/score_rules_imagefs/0.1.0/MODULE.bazel": "7964f78b6a92aebc38916dedbfb5f011d4fa4c385d86f7612c39c7a423b012cc", - "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/score_rules_imagefs/0.1.0/source.json": "8aa1214aec6645a9cbbfec86b855402de2f0c42b9aa37224279a64788350a58e", "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/score_rust_policies/0.0.2/MODULE.bazel": "ade2bad4a331b02d9b7e7d9842e8de8c6fded6186486e02c4f7db5cd4b71d34d", "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/score_rust_policies/0.0.5/MODULE.bazel": "7de02547bdf121d3dedf5141b97f0fd9a545bd255ff5c7b699056b35816ffad9", "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/score_rust_policies/0.0.5/source.json": "22c8bf0a5cbf7c7b06f774f3f66498e0bc14346a8b2208f7427a8fbb78a42547", @@ -11465,7 +11477,7 @@ "@@score_bazel_cpp_toolchains+//extensions:gcc.bzl%gcc": { "general": { "bzlTransitiveDigest": "4I0YNPbDgLY5CojGj/bUi9kZkZnU0EDjGFyT8XcfAc4=", - "usagesDigest": "ezffglGbopGEOOUlKRbjWL5XQdlJjREiAeTq9QXnwqQ=", + "usagesDigest": "foeugKIMDbZ0Pa+exueYudmiw2Xs0hxjEUbtcwT9Te8=", "recordedFileInputs": {}, "recordedDirentsInputs": {}, "envVariables": {}, @@ -11482,6 +11494,30 @@ "strip_prefix": "x86_64-unknown-linux-gnu" } }, + "score_gcc_x86_64_toolchain_pkg": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "urls": [ + "https://github.com/eclipse-score/toolchains_gcc_packages/releases/download/v0.0.4/x86_64-unknown-linux-gnu_gcc12.tar.gz" + ], + "build_file": "@@score_bazel_cpp_toolchains+//packages/linux/x86_64/gcc/12.2.0:gcc.BUILD", + "patch_cmds": [], + "sha256": "e9b9a7a63a5f8271b76d6e2057906b95c7a244e4931a8e10edeaa241e9f7c11e", + "strip_prefix": "x86_64-unknown-linux-gnu" + } + }, + "score_gcc_aarch64_toolchain_pkg": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "urls": [ + "https://github.com/eclipse-score/toolchains_gcc_packages/releases/download/v0.0.4/aarch64-unknown-linux-gnu_gcc12.tar.gz" + ], + "build_file": "@@score_bazel_cpp_toolchains+//packages/linux/aarch64/gcc/12.2.0:gcc.BUILD", + "patch_cmds": [], + "sha256": "7279b1adb50361b21f5266b001980b6febb35fa8d83170901196b9edae3f06d9", + "strip_prefix": "aarch64-unknown-linux-gnu" + } + }, "score_ebclfsa_toolchain_pkg": { "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", "attributes": { @@ -11559,6 +11595,60 @@ "use_base_constraints_only": false } }, + "score_gcc_x86_64_toolchain": { + "repoRuleId": "@@score_bazel_cpp_toolchains+//rules:gcc.bzl%gcc_toolchain", + "attributes": { + "extra_compile_flags": [], + "extra_c_compile_flags": [], + "extra_cxx_compile_flags": [], + "extra_known_features": [], + "extra_enabled_features": [], + "extra_link_flags": [], + "license_info_variable": "", + "license_info_value": "", + "license_path": "/opt/score_qnx/license/licenses", + "sdk_version": "", + "sdp_version": "", + "tc_compiler_library_search_paths": [], + "tc_cpu": "x86_64", + "tc_identifier": "gcc_12.2.0", + "tc_os": "linux", + "tc_pkg_repo": "score_gcc_x86_64_toolchain_pkg", + "tc_system_toolchain": false, + "tc_runtime_ecosystem": "", + "gcc_version": "12.2.0", + "cc_toolchain_config": "@@score_bazel_cpp_toolchains+//templates/linux:cc_toolchain_config.bzl.template", + "cc_toolchain_flags": "@@score_bazel_cpp_toolchains+//templates/linux:cc_toolchain_flags.bzl.template", + "use_base_constraints_only": false + } + }, + "score_gcc_aarch64_toolchain": { + "repoRuleId": "@@score_bazel_cpp_toolchains+//rules:gcc.bzl%gcc_toolchain", + "attributes": { + "extra_compile_flags": [], + "extra_c_compile_flags": [], + "extra_cxx_compile_flags": [], + "extra_known_features": [], + "extra_enabled_features": [], + "extra_link_flags": [], + "license_info_variable": "", + "license_info_value": "", + "license_path": "/opt/score_qnx/license/licenses", + "sdk_version": "", + "sdp_version": "", + "tc_compiler_library_search_paths": [], + "tc_cpu": "aarch64", + "tc_identifier": "gcc_12.2.0", + "tc_os": "linux", + "tc_pkg_repo": "score_gcc_aarch64_toolchain_pkg", + "tc_system_toolchain": false, + "tc_runtime_ecosystem": "", + "gcc_version": "12.2.0", + "cc_toolchain_config": "@@score_bazel_cpp_toolchains+//templates/linux:cc_toolchain_config.bzl.template", + "cc_toolchain_flags": "@@score_bazel_cpp_toolchains+//templates/linux:cc_toolchain_flags.bzl.template", + "use_base_constraints_only": false + } + }, "score_ebclfsa_toolchain": { "repoRuleId": "@@score_bazel_cpp_toolchains+//rules:gcc.bzl%gcc_toolchain", "attributes": { @@ -11778,7 +11868,7 @@ }, "@@score_rules_imagefs+//extensions:imagefs.bzl%imagefs": { "general": { - "bzlTransitiveDigest": "AhldzzceHQweCskTyocFKGDFKZfW2t5IdpfsFJV4S9g=", + "bzlTransitiveDigest": "LURGmZBTVmnBnO8WTQk69DmKJyA039+DhA3r1RihzhM=", "usagesDigest": "/TmbRDKbrKvzgUh1kgwmBgikEuIonP0fOz164yCxbIw=", "recordedFileInputs": {}, "recordedDirentsInputs": {}, @@ -11791,8 +11881,7 @@ "tc_os": "qnx", "tc_pkg_repo": "'@@score_bazel_cpp_toolchains++gcc+score_qcc_x86_64_toolchain_pkg'", "sdp_version": "8.0.0", - "tc_type": "ifs", - "coreutils_pkg_repo": "" + "tc_type": "ifs" } }, "score_qnx_aarch64_ifs_toolchain": { @@ -11802,8 +11891,7 @@ "tc_os": "qnx", "tc_pkg_repo": "'@@score_bazel_cpp_toolchains++gcc+score_qcc_aarch64_toolchain_pkg'", "sdp_version": "8.0.0", - "tc_type": "ifs", - "coreutils_pkg_repo": "" + "tc_type": "ifs" } } }, diff --git a/bazel_common/score_gcc_toolchains.MODULE.bazel b/bazel_common/score_gcc_toolchains.MODULE.bazel index e946214ae01..0e42a18d4fb 100644 --- a/bazel_common/score_gcc_toolchains.MODULE.bazel +++ b/bazel_common/score_gcc_toolchains.MODULE.bazel @@ -12,6 +12,20 @@ # ******************************************************************************* gcc = use_extension("@score_bazel_cpp_toolchains//extensions:gcc.bzl", "gcc", dev_dependency = True) +gcc.toolchain( + name = "score_gcc_x86_64_toolchain", + target_cpu = "x86_64", + target_os = "linux", + use_default_package = True, + version = "12.2.0", +) +gcc.toolchain( + name = "score_gcc_aarch64_toolchain", + target_cpu = "aarch64", + target_os = "linux", + use_default_package = True, + version = "12.2.0", +) gcc.toolchain( name = "score_ebclfsa_toolchain", runtime_ecosystem = "ebclfsa", @@ -33,4 +47,6 @@ use_repo( gcc, "score_autosd10_x86_64_toolchain", "score_ebclfsa_toolchain", + "score_gcc_aarch64_toolchain", + "score_gcc_x86_64_toolchain", ) diff --git a/bazel_common/score_images.MODULE.bazel b/bazel_common/score_images.MODULE.bazel index 0afa2993523..1b9280daa05 100644 --- a/bazel_common/score_images.MODULE.bazel +++ b/bazel_common/score_images.MODULE.bazel @@ -52,6 +52,14 @@ http_file( bazel_dep(name = "score_rules_imagefs", version = "0.1.0") +# Use PR branch with ext4 overlay injection support +# TODO: Remove after eclipse-score/rules_imagefs#33 is merged +git_override( + module_name = "score_rules_imagefs", + commit = "75ce3bf26b9533e253159e89c967ddaf1abebd62", + remote = "https://github.com/eclipse-score/rules_imagefs.git", +) + imagefs = use_extension("@score_rules_imagefs//extensions:imagefs.bzl", "imagefs", dev_dependency = True) imagefs.toolchain( name = "score_qnx_x86_64_ifs_toolchain", diff --git a/tck/BUILD b/tck/BUILD new file mode 100644 index 00000000000..8f6eb6377c6 --- /dev/null +++ b/tck/BUILD @@ -0,0 +1,70 @@ +# ******************************************************************************* +# Copyright (c) 2026 Contributors to the Eclipse Foundation +# +# See the NOTICE file(s) distributed with this work for additional +# information regarding copyright ownership. +# +# This program and the accompanying materials are made available under the +# terms of the Apache License Version 2.0 which is available at +# https://www.apache.org/licenses/LICENSE-2.0 +# +# SPDX-License-Identifier: Apache-2.0 +# ******************************************************************************* +"""TCK packaging rules. + +Builds the score-tck binary (Rust) and packages it with golden reference data. + +Usage: + bazel build //tck:score-tck + ./bazel-bin/tck/score-tck --help +""" + +load("@rules_rust//rust:defs.bzl", "rust_binary", "rust_test") + +# Golden SBOM - copy from root product SBOM (built separately) +# The runner expects the SBOM at tck/reference/sbom.spdx.json +filegroup( + name = "golden_sbom", + srcs = ["reference/sbom.spdx.json"], + visibility = ["//visibility:public"], +) + +# Rust TCK runner binary +rust_binary( + name = "score-tck", + srcs = glob([ + "runner/src/**/*.rs", + ]), + crate_root = "runner/src/main.rs", + visibility = ["//visibility:public"], + deps = [ + "@score_crates//:anyhow", + "@score_crates//:clap", + "@score_crates//:serde", + "@score_crates//:serde_json", + ], +) + +# Rust TCK unit tests +rust_test( + name = "score-tck-tests", + srcs = glob([ + "runner/src/**/*.rs", + ]), + crate_root = "runner/src/lib.rs", + visibility = ["//visibility:public"], + deps = [ + "@score_crates//:anyhow", + "@score_crates//:clap", + "@score_crates//:serde", + "@score_crates//:serde_json", + "@score_crates//:tempfile", + ], +) + +# Distribution config example +filegroup( + name = "config_example", + srcs = ["tck.config.example.toml"], + visibility = ["//visibility:public"], +) diff --git a/tck/README.md b/tck/README.md new file mode 100644 index 00000000000..0434119becf --- /dev/null +++ b/tck/README.md @@ -0,0 +1,146 @@ +# s-core Test Compatibility Kit (TCK) + +A portable test kit for verifying SCORE distribution compatibility with platform requirements. + +## Overview + +The TCK verifies whether a SCORE distribution is compatible with the main platform requirements: + +| Check Family | Purpose | Status | +|--------------|---------|--------| +| **SBOM** | Required components, license policy, drift from golden | ✅ Implemented | +| **Version** | Platform version compatibility | ✅ Implemented | +| **Runtime** | Toolchain, libraries, architecture | ✅ Implemented | +| **Behavioral** | Run integration tests against distribution | 🔧 Test definitions ready | +| **API** | Header/symbol validation | 🔧 Definitions ready | + +## Quick Start + +```bash +# Build the TCK +bazel build //tck:score-tck + +# Run against a distribution +./bazel-bin/tck/score-tck run --config my-dist.toml --report ./report + +# View results +cat ./report/summary.md +``` + +## Distribution Configuration + +Create a `tck.config.toml` for your distribution: + +```toml +[dist] +name = "my-score-dist" +version = "1.0.0" +platform_version = "0.9.0" # Must be compatible with TCK platform version +arch = "x86_64-linux" +profile = "full" + +[dist.paths] +sbom_file = "./dist/sbom.spdx.json" +headers_dir = "./dist/include" +``` + +## Check Details + +### SBOM Check + +Verifies: +- All required components from `requirements.toml` are present +- No forbidden components are included +- All licenses are in the approved list +- No drift from golden SBOM (optional) + +### Version Check + +Ensures the distribution's declared `platform_version` is compatible with the TCK's minimum required version using semver comparison. + +### Runtime Check + +Validates: +- Target architecture is supported (x86_64-linux, aarch64-linux, qnx-aarch64) +- Toolchain availability (GCC 11+ or Clang 14+) +- Required system libraries (pthread, dl, rt) +- Test harness adapter configuration + +## Test Definitions + +Behavioral tests reference the existing `feature_integration_tests/`: + +```bash +tck/tests/ +├── behavioral.toml # Pytest test mappings +└── api_signatures.toml # Required header definitions +``` + +## Requirements Policy + +The `tck/reference/policy/requirements.toml` defines: + +- **Mandatory SBOM components**: score_baselibs, score_communication, score_persistency, etc. +- **Allowed licenses**: Apache-2.0, MIT, BSD-2-Clause, BSD-3-Clause, etc. +- **Version requirements**: Platform version compatibility rules + +## Output + +The TCK produces: + +- `report.json` - Machine-readable JSON report +- `summary.md` - Human-readable markdown summary + +### Verdicts + +| Verdict | Meaning | +|---------|---------| +| `CONFORMANT` | All required checks passed | +| `CONFORMANT-WITH-WARNINGS` | Required checks passed, some warnings | +| `NON-CONFORMANT` | One or more required checks failed | + +## Architecture + +``` +tck/ +├── runner/ # Rust TCK binary +│ ├── src/ +│ │ ├── main.rs # CLI entry point +│ │ ├── sbom.rs # SBOM check +│ │ ├── version.rs # Version check +│ │ ├── runtime.rs # Runtime check + test harness adapter +│ │ ├── config.rs # Distribution config parsing +│ │ └── report.rs # Report generation +│ └── Cargo.toml +├── reference/ # Golden references +│ ├── sbom.spdx.json # Golden SBOM (162 packages) +│ └── policy/ +│ └── requirements.toml # Platform requirements +├── tests/ # Test definitions +│ ├── behavioral.toml # Behavioral test mappings +│ └── api_signatures.toml # API header requirements +└── BUILD # Bazel target +``` + +## Porting Package Concept + +Inspired by Jakarta EE TCK, vendors configure a **test harness adapter** that tells the TCK how to run tests against their distribution. This is configured in `runtime.rs`: + +```rust +pub struct TestHarnessAdapter { + pub build_command: Option, + pub run_command: Option, + pub showcase_cli_path: Option, + // ... +} +``` + +This ensures the same runtime configuration used in production is used during testing. + +## CI Integration + +The TCK is built and bundled in `.github/workflows/build_tck.yml`: + +- Builds on PR and push to main +- Bundles binary with reference files +- Attaches to releases on tag diff --git a/tck/reference/policy/requirements.toml b/tck/reference/policy/requirements.toml new file mode 100644 index 00000000000..5799ce4c9a1 --- /dev/null +++ b/tck/reference/policy/requirements.toml @@ -0,0 +1,142 @@ +# ******************************************************************************* +# Copyright (c) 2026 Contributors to the Eclipse Foundation +# +# See the NOTICE file(s) distributed with this work for additional +# information regarding copyright ownership. +# +# This program and the accompanying materials are made available under the +# terms of the Apache License Version 2.0 which is available at +# https://www.apache.org/licenses/LICENSE-2.0 +# +# SPDX-License-Identifier: Apache-2.0 +# ******************************************************************************* +# Platform Conformance Requirements for s-core TCK +# +# This file defines the mandatory requirements a SCORE distribution must satisfy +# to be considered conformant with the platform specification. + +# ============================================================================== +# VERSION REQUIREMENTS +# ============================================================================== +# The distribution must declare a platform version compatible with these requirements. + +[version] +# Platform version this TCK validates against +platform_version = "0.9.0" + +# Minimum compatible versions (distributions must declare >= these) +min_platform_version = "0.9.0" + +# TCK version +tck_version = "0.1.0" + +# Version check policy: +# - "exact": Distribution platform_version must match exactly +# - "compatible": Distribution platform_version must be >= min_platform_version +# - "any": No version check performed +version_policy = "compatible" + +# ============================================================================== +# MANDATORY SBOM ENTRIES +# ============================================================================== +# All SCORE platform distributions MUST include these components in their SBOM. +# These are the core modules tracked in known_good.json's sbom.tracked_modules. + +[sbom.required_components] +# Core middleware modules +score_baselibs = { description = "SCORE base libraries (core types, utilities)", critical = true } +score_communication = { description = "Inter-process communication middleware", critical = true } +score_persistency = { description = "Data persistency layer", critical = true } +score_kyron = { description = "Async runtime and execution framework", critical = true } +score_lifecycle = { description = "Lifecycle management", critical = true } +score_logging = { description = "Logging infrastructure (console, DLT, file)", critical = true } +score_time = { description = "Time services (system, steady, vehicle time)", critical = true } + +# ============================================================================== +# LICENSE POLICY +# ============================================================================== +# Licenses allowed in SCORE platform distributions. +# Any component with a license NOT in this list will be flagged. + +[sbom.allowed_licenses] +# Permissive open-source licenses +Apache-2.0 = { category = "permissive", approved = true } +MIT = { category = "permissive", approved = true } +BSD-2-Clause = { category = "permissive", approved = true } +BSD-3-Clause = { category = "permissive", approved = true } +0BSD = { category = "permissive", approved = true } +ISC = { category = "permissive", approved = true } +Zlib = { category = "permissive", approved = true } +CC0-1.0 = { category = "permissive", approved = true } +Unicode-3.0 = { category = "permissive", approved = true } + +# Boost Software License (permissive with source-offer requirement) +BSL-1.0 = { category = "permissive", approved = true, note = "Requires source offer for compiled works" } + +# Special marker for unresolved licenses +NOASSERTION = { category = "unknown", approved = false, note = "License could not be determined - requires manual review" } + +# ============================================================================== +# FORBIDDEN COMPONENTS +# ============================================================================== +# Components that MUST NOT appear in a SCORE platform distribution. +# This catches unintended third-party dependencies. + +[sbom.forbidden_components] +# Example: dependency versions with known vulnerabilities +# openssl@1.1.1 = { reason = "Known vulnerabilities, use 3.x instead" } + +# Placeholder - no forbidden components yet +_placeholder = { reason = "No forbidden components defined yet" } + +# ============================================================================== +# BEHAVIORAL CONFORMANCE REQUIREMENTS +# ============================================================================== +# These requirements map to platform integration tests that verify +# the distribution behaves correctly. + +[behavioral.requirements] +# Logging support +stkh_req__dev_experience__logging_support = { + module = "score_logging", + test = "platform_integration_tests/logging/test_logging_showcase.py", + description = "Logging infrastructure works with console, DLT, and file backends" +} + +# Communication +stkh_req__communication__inter_process = { + module = "score_communication", + test = "platform_integration_tests/communication/test_communication_showcase.py", + description = "Inter-process communication works correctly" +} + +# Lifecycle +stkh_req__dependability__safety_features_1 = { + module = "score_lifecycle", + test = "platform_integration_tests/lifecycle/test_lifecycle_showcase.py", + description = "Lifecycle management and safety features work correctly" +} + +# Execution model +stkh_req__execution_model__processes = { + module = "score_kyron", + test = "platform_integration_tests/kyron/test_async_runtime_showcase.py", + description = "Async runtime and process execution work correctly" +} + +# Time services +stkh_req__time__vehicle_time_api = { + module = "score_time", + test = "platform_integration_tests/time/test_vehicle_time_showcase.py", + description = "Vehicle time API works correctly" +} + +# ============================================================================== +# API CONFORMANCE (FUTURE) +# ============================================================================== +# Public API surface that must be preserved for compatibility. +# This will be populated with exported symbols/headers in a future phase. + +[api.public_surface] +# Placeholder for API baseline definitions +# Each entry will specify: module, exported_symbols, headers diff --git a/tck/reference/sbom.spdx.json b/tck/reference/sbom.spdx.json new file mode 100755 index 00000000000..d9d2a23e723 --- /dev/null +++ b/tck/reference/sbom.spdx.json @@ -0,0 +1,5474 @@ +{ + "spdxVersion": "SPDX-2.3", + "dataLicense": "CC0-1.0", + "SPDXID": "SPDXRef-DOCUMENT", + "name": "SBOM for score_reference_integration", + "documentNamespace": "https://eclipse.dev/score/spdx/score-reference-integration-c9084d4c-958d-4fd2-a4c2-9d9a73c70d9f", + "creationInfo": { + "created": "2026-10-29T13:36:36Z", + "creators": [ + "Organization: Eclipse Foundation", + "Tool: score-sbom-generator" + ] + }, + "packages": [ + { + "SPDXID": "SPDXRef-RootPackage", + "name": "score_reference_integration", + "versionInfo": "unversioned", + "downloadLocation": "https://github.com/eclipse-score", + "supplier": "Organization: Eclipse Foundation", + "primaryPackagePurpose": "APPLICATION", + "filesAnalyzed": false, + "licenseConcluded": "NOASSERTION", + "licenseDeclared": "NOASSERTION", + "copyrightText": "NOASSERTION" + }, + { + "SPDXID": "SPDXRef-score-baselibs-unknown", + "name": "score_baselibs", + "versionInfo": "unknown", + "downloadLocation": "NOASSERTION", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "NOASSERTION", + "licenseDeclared": "NOASSERTION", + "copyrightText": "NOASSERTION", + "description": "Missing", + "supplier": "Organization: Eclipse Foundation", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:github/eclipse-score/score_baselibs@unknown" + } + ] + }, + { + "SPDXID": "SPDXRef-score-persistency-unknown", + "name": "score_persistency", + "versionInfo": "unknown", + "downloadLocation": "NOASSERTION", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "NOASSERTION", + "licenseDeclared": "NOASSERTION", + "copyrightText": "NOASSERTION", + "description": "Missing", + "supplier": "Organization: Eclipse Foundation", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:github/eclipse-score/score_persistency@unknown" + } + ] + }, + { + "SPDXID": "SPDXRef-nlohmann-json-unknown", + "name": "nlohmann_json+", + "versionInfo": "unknown", + "downloadLocation": "NOASSERTION", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "NOASSERTION", + "licenseDeclared": "NOASSERTION", + "copyrightText": "NOASSERTION", + "description": "Missing", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:generic/nlohmann_json+@unknown" + } + ] + }, + { + "SPDXID": "SPDXRef-score-test-scenarios-unknown", + "name": "score_test_scenarios", + "versionInfo": "unknown", + "downloadLocation": "NOASSERTION", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "NOASSERTION", + "licenseDeclared": "NOASSERTION", + "copyrightText": "NOASSERTION", + "description": "Missing", + "supplier": "Organization: Eclipse Foundation", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:github/eclipse-score/score_test_scenarios@unknown" + } + ] + }, + { + "SPDXID": "SPDXRef-serde-1.0.229", + "name": "serde", + "versionInfo": "1.0.229", + "downloadLocation": "https://crates.io/crates/serde/1.0.229", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT OR Apache-2.0", + "licenseDeclared": "MIT OR Apache-2.0", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba" + } + ], + "description": "A generic serialization/deserialization framework", + "supplier": "Organization: serde-rs", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/serde@1.0.229" + } + ] + }, + { + "SPDXID": "SPDXRef-serde-core-1.0.229", + "name": "serde-core", + "versionInfo": "1.0.229", + "downloadLocation": "https://crates.io/crates/serde-core/1.0.229", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT OR Apache-2.0", + "licenseDeclared": "MIT OR Apache-2.0", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48" + } + ], + "description": "Serde traits only, with no support for derive -- use the `serde` crate instead", + "supplier": "Organization: serde-rs", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/serde-core@1.0.229" + } + ] + }, + { + "SPDXID": "SPDXRef-proc-macro2-1.0.107", + "name": "proc-macro2", + "versionInfo": "1.0.107", + "downloadLocation": "https://crates.io/crates/proc-macro2/1.0.107", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT OR Apache-2.0", + "licenseDeclared": "MIT OR Apache-2.0", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" + } + ], + "description": "A substitute implementation of the compiler's `proc_macro` API to decouple token-based libraries from the procedural macro use case.", + "supplier": "Organization: dtolnay", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/proc-macro2@1.0.107" + } + ] + }, + { + "SPDXID": "SPDXRef-unicode-ident-1.0.26", + "name": "unicode-ident", + "versionInfo": "1.0.26", + "downloadLocation": "https://crates.io/crates/unicode-ident/1.0.26", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "(MIT OR Apache-2.0) AND Unicode-3.0", + "licenseDeclared": "(MIT OR Apache-2.0) AND Unicode-3.0", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "d245f478577f809a851594d02313b640fb437e0bb33866753cff937863096954" + } + ], + "description": "Determine whether characters have the XID_Start or XID_Continue properties according to Unicode Standard Annex #31", + "supplier": "Organization: dtolnay", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/unicode-ident@1.0.26" + } + ] + }, + { + "SPDXID": "SPDXRef-quote-1.0.47", + "name": "quote", + "versionInfo": "1.0.47", + "downloadLocation": "https://crates.io/crates/quote/1.0.47", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT OR Apache-2.0", + "licenseDeclared": "MIT OR Apache-2.0", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" + } + ], + "description": "Quasi-quoting macro quote!(...)", + "supplier": "Organization: dtolnay", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/quote@1.0.47" + } + ] + }, + { + "SPDXID": "SPDXRef-syn-3.0.8", + "name": "syn", + "versionInfo": "3.0.8", + "downloadLocation": "https://crates.io/crates/syn/3.0.8", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT OR Apache-2.0", + "licenseDeclared": "MIT OR Apache-2.0", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "01016da373cd8f7ef12624f796309f5c31ba8d646dd08856c02cd741d823c622" + } + ], + "description": "Parser for Rust source code", + "supplier": "Organization: dtolnay", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/syn@3.0.8" + } + ] + }, + { + "SPDXID": "SPDXRef-serde-derive-1.0.229", + "name": "serde-derive", + "versionInfo": "1.0.229", + "downloadLocation": "https://crates.io/crates/serde-derive/1.0.229", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT OR Apache-2.0", + "licenseDeclared": "MIT OR Apache-2.0", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" + } + ], + "description": "Macros 1.1 implementation of #[derive(Serialize, Deserialize)]", + "supplier": "Organization: serde-rs", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/serde-derive@1.0.229" + } + ] + }, + { + "SPDXID": "SPDXRef-itoa-1.0.18", + "name": "itoa", + "versionInfo": "1.0.18", + "downloadLocation": "https://crates.io/crates/itoa/1.0.18", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT OR Apache-2.0", + "licenseDeclared": "MIT OR Apache-2.0", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" + } + ], + "description": "Fast integer primitive to string conversion", + "supplier": "Organization: dtolnay", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/itoa@1.0.18" + } + ] + }, + { + "SPDXID": "SPDXRef-memchr-2.8.3", + "name": "memchr", + "versionInfo": "2.8.3", + "downloadLocation": "https://crates.io/crates/memchr/2.8.3", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "Unlicense OR MIT", + "licenseDeclared": "Unlicense OR MIT", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" + } + ], + "description": "Provides extremely fast (uses SIMD on x86_64, aarch64 and wasm32) routines for\n1, 2 or 3 byte search and single substring search.", + "supplier": "Organization: BurntSushi", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/memchr@2.8.3" + } + ] + }, + { + "SPDXID": "SPDXRef-serde-json-1.0.154", + "name": "serde-json", + "versionInfo": "1.0.154", + "downloadLocation": "https://crates.io/crates/serde-json/1.0.154", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT OR Apache-2.0", + "licenseDeclared": "MIT OR Apache-2.0", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "e7e9cc8b1b85264074fbcc02a88680c4096b1e47df8f739dceb03bf482f04bd6" + } + ], + "description": "A JSON serialization file format", + "supplier": "Organization: serde-rs", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/serde-json@1.0.154" + } + ] + }, + { + "SPDXID": "SPDXRef-zmij-1.0.23", + "name": "zmij", + "versionInfo": "1.0.23", + "downloadLocation": "https://crates.io/crates/zmij/1.0.23", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "NOASSERTION", + "licenseDeclared": "NOASSERTION", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" + } + ], + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/zmij@1.0.23" + } + ] + }, + { + "SPDXID": "SPDXRef-pin-project-lite-0.2.17", + "name": "pin-project-lite", + "versionInfo": "0.2.17", + "downloadLocation": "https://crates.io/crates/pin-project-lite/0.2.17", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "Apache-2.0 OR MIT", + "licenseDeclared": "Apache-2.0 OR MIT", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" + } + ], + "description": "A lightweight version of pin-project written with declarative macros.", + "supplier": "Organization: taiki-e", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/pin-project-lite@0.2.17" + } + ] + }, + { + "SPDXID": "SPDXRef-once-cell-1.21.4", + "name": "once-cell", + "versionInfo": "1.21.4", + "downloadLocation": "https://crates.io/crates/once-cell/1.21.4", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT OR Apache-2.0", + "licenseDeclared": "MIT OR Apache-2.0", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" + } + ], + "description": "Single assignment cells and lazy values.", + "supplier": "Organization: matklad", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/once-cell@1.21.4" + } + ] + }, + { + "SPDXID": "SPDXRef-tracing-core-0.1.36", + "name": "tracing-core", + "versionInfo": "0.1.36", + "downloadLocation": "https://crates.io/crates/tracing-core/0.1.36", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT", + "licenseDeclared": "MIT", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" + } + ], + "description": "Core primitives for application-level tracing.", + "supplier": "Organization: tokio-rs", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/tracing-core@0.1.36" + } + ] + }, + { + "SPDXID": "SPDXRef-tracing-attributes-0.1.31", + "name": "tracing-attributes", + "versionInfo": "0.1.31", + "downloadLocation": "https://crates.io/crates/tracing-attributes/0.1.31", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT", + "licenseDeclared": "MIT", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" + } + ], + "description": "Procedural macro attributes for automatically instrumenting functions.", + "supplier": "Organization: tokio-rs", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/tracing-attributes@0.1.31" + } + ] + }, + { + "SPDXID": "SPDXRef-tracing-0.1.44", + "name": "tracing", + "versionInfo": "0.1.44", + "downloadLocation": "https://crates.io/crates/tracing/0.1.44", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT", + "licenseDeclared": "MIT", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" + } + ], + "description": "Application-level tracing for Rust.", + "supplier": "Organization: tokio-rs", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/tracing@0.1.44" + } + ] + }, + { + "SPDXID": "SPDXRef-aho-corasick-1.1.5", + "name": "aho-corasick", + "versionInfo": "1.1.5", + "downloadLocation": "https://crates.io/crates/aho-corasick/1.1.5", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "Unlicense OR MIT", + "licenseDeclared": "Unlicense OR MIT", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "c982642fa9e8606056828ee9a8505737230110bb1099153c79efe865c59d12ba" + } + ], + "description": "Fast multiple substring searching.", + "supplier": "Organization: BurntSushi", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/aho-corasick@1.1.5" + } + ] + }, + { + "SPDXID": "SPDXRef-regex-syntax-0.8.11", + "name": "regex-syntax", + "versionInfo": "0.8.11", + "downloadLocation": "https://crates.io/crates/regex-syntax/0.8.11", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT OR Apache-2.0", + "licenseDeclared": "MIT OR Apache-2.0", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" + } + ], + "description": "A regular expression parser.", + "supplier": "Organization: rust-lang", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/regex-syntax@0.8.11" + } + ] + }, + { + "SPDXID": "SPDXRef-regex-automata-0.4.18", + "name": "regex-automata", + "versionInfo": "0.4.18", + "downloadLocation": "https://crates.io/crates/regex-automata/0.4.18", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT OR Apache-2.0", + "licenseDeclared": "MIT OR Apache-2.0", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "ad8553b9b26413251cbf30e620595c7a41b3887f03da04579c0e6b0d6a06b4b2" + } + ], + "description": "Automata construction and matching using regular expressions.", + "supplier": "Organization: rust-lang", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/regex-automata@0.4.18" + } + ] + }, + { + "SPDXID": "SPDXRef-matchers-0.2.0", + "name": "matchers", + "versionInfo": "0.2.0", + "downloadLocation": "https://crates.io/crates/matchers/0.2.0", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT", + "licenseDeclared": "MIT", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9" + } + ], + "description": "Regex matching on character and byte streams.", + "supplier": "Organization: hawkw", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/matchers@0.2.0" + } + ] + }, + { + "SPDXID": "SPDXRef-nu-ansi-term-0.50.3", + "name": "nu-ansi-term", + "versionInfo": "0.50.3", + "downloadLocation": "https://crates.io/crates/nu-ansi-term/0.50.3", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT", + "licenseDeclared": "MIT", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" + } + ], + "description": "Library for ANSI terminal colors and styles (bold, underline)", + "supplier": "Organization: nushell", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/nu-ansi-term@0.50.3" + } + ] + }, + { + "SPDXID": "SPDXRef-lazy-static-1.5.1", + "name": "lazy-static", + "versionInfo": "1.5.1", + "downloadLocation": "https://crates.io/crates/lazy-static/1.5.1", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT OR Apache-2.0", + "licenseDeclared": "MIT OR Apache-2.0", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "20870f649af7073d53e38067b2a84312175d56ea15217e1b15bc83506ec50afb" + } + ], + "description": "A macro for declaring lazily evaluated statics in Rust.", + "supplier": "Organization: rust-lang-nursery", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/lazy-static@1.5.1" + } + ] + }, + { + "SPDXID": "SPDXRef-sharded-slab-0.1.7", + "name": "sharded-slab", + "versionInfo": "0.1.7", + "downloadLocation": "https://crates.io/crates/sharded-slab/0.1.7", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT", + "licenseDeclared": "MIT", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" + } + ], + "description": "A lock-free concurrent slab.", + "supplier": "Organization: hawkw", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/sharded-slab@0.1.7" + } + ] + }, + { + "SPDXID": "SPDXRef-smallvec-1.16.3", + "name": "smallvec", + "versionInfo": "1.16.3", + "downloadLocation": "https://crates.io/crates/smallvec/1.16.3", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT OR Apache-2.0", + "licenseDeclared": "MIT OR Apache-2.0", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "5b3dc8af474f516a851ff4bd12db780f948b9250ad37211e4eec0bccea54e01b" + } + ], + "description": "'Small vector' optimization: store up to a small number of items on the stack", + "supplier": "Organization: servo", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/smallvec@1.16.3" + } + ] + }, + { + "SPDXID": "SPDXRef-cfg-if-1.0.5", + "name": "cfg-if", + "versionInfo": "1.0.5", + "downloadLocation": "https://crates.io/crates/cfg-if/1.0.5", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT OR Apache-2.0", + "licenseDeclared": "MIT OR Apache-2.0", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "4e7648175b45a9a48536d676f68d918270699102aa8dab5496df06904c914600" + } + ], + "description": "A macro to ergonomically define an item depending on a large number of #[cfg]\nparameters. Structured like an if-else chain, the first matching branch is the\nitem that gets emitted.", + "supplier": "Organization: rust-lang", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/cfg-if@1.0.5" + } + ] + }, + { + "SPDXID": "SPDXRef-thread-local-1.1.10", + "name": "thread-local", + "versionInfo": "1.1.10", + "downloadLocation": "https://crates.io/crates/thread-local/1.1.10", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT OR Apache-2.0", + "licenseDeclared": "MIT OR Apache-2.0", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "1ad99c4c6d32803332c548b1af0540b357b3f5fc0be8f6c6bfe8b2e6ae784070" + } + ], + "description": "Per-object thread-local storage", + "supplier": "Organization: Amanieu", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/thread-local@1.1.10" + } + ] + }, + { + "SPDXID": "SPDXRef-log-0.4.34", + "name": "log", + "versionInfo": "0.4.34", + "downloadLocation": "https://crates.io/crates/log/0.4.34", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT OR Apache-2.0", + "licenseDeclared": "MIT OR Apache-2.0", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "f9f8bd3e56ce4dfc153cf470fffbfa98c7620958b312ca5c3a4b8d5181fd13c6" + } + ], + "description": "A lightweight logging facade for Rust", + "supplier": "Organization: rust-lang", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/log@0.4.34" + } + ] + }, + { + "SPDXID": "SPDXRef-tracing-log-0.2.0", + "name": "tracing-log", + "versionInfo": "0.2.0", + "downloadLocation": "https://crates.io/crates/tracing-log/0.2.0", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT", + "licenseDeclared": "MIT", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" + } + ], + "description": "Provides compatibility between `tracing` and the `log` crate.", + "supplier": "Organization: tokio-rs", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/tracing-log@0.2.0" + } + ] + }, + { + "SPDXID": "SPDXRef-tracing-serde-0.2.0", + "name": "tracing-serde", + "versionInfo": "0.2.0", + "downloadLocation": "https://crates.io/crates/tracing-serde/0.2.0", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT", + "licenseDeclared": "MIT", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "704b1aeb7be0d0a84fc9828cae51dab5970fee5088f83d1dd7ee6f6246fc6ff1" + } + ], + "description": "A compatibility layer for serializing trace data with `serde`", + "supplier": "Organization: tokio-rs", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/tracing-serde@0.2.0" + } + ] + }, + { + "SPDXID": "SPDXRef-tracing-subscriber-0.3.23", + "name": "tracing-subscriber", + "versionInfo": "0.3.23", + "downloadLocation": "https://crates.io/crates/tracing-subscriber/0.3.23", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT", + "licenseDeclared": "MIT", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "cb7f578e5945fb242538965c2d0b04418d38ec25c79d160cd279bf0731c8d319" + } + ], + "description": "Utilities for implementing and composing `tracing` subscribers.", + "supplier": "Organization: tokio-rs", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/tracing-subscriber@0.3.23" + } + ] + }, + { + "SPDXID": "SPDXRef-adler32-1.2.0", + "name": "adler32", + "versionInfo": "1.2.0", + "downloadLocation": "https://crates.io/crates/adler32/1.2.0", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "Zlib", + "licenseDeclared": "Zlib", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "aae1277d39aeec15cb388266ecc24b11c80469deae6067e17a1a7aa9e5c1f234" + } + ], + "description": "Minimal Adler32 implementation for Rust.", + "supplier": "Organization: remram44", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/adler32@1.2.0" + } + ] + }, + { + "SPDXID": "SPDXRef-tinyjson-2.5.1", + "name": "tinyjson", + "versionInfo": "2.5.1", + "downloadLocation": "https://crates.io/crates/tinyjson/2.5.1", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT", + "licenseDeclared": "MIT", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "9ab95735ea2c8fd51154d01e39cf13912a78071c2d89abc49a7ef102a7dd725a" + } + ], + "description": "Tiny simple JSON parser/generator", + "supplier": "Organization: rhysd", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/tinyjson@2.5.1" + } + ] + }, + { + "SPDXID": "SPDXRef-anyhow-1.0.104", + "name": "anyhow", + "versionInfo": "1.0.104", + "downloadLocation": "https://crates.io/crates/anyhow/1.0.104", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT OR Apache-2.0", + "licenseDeclared": "MIT OR Apache-2.0", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "330a5ed07fa54e4702c9d6c4174f74427fc0ef6e214bbd677ae50a5099946470" + } + ], + "description": "Flexible concrete Error type built on std::error::Error", + "supplier": "Organization: dtolnay", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/anyhow@1.0.104" + } + ] + }, + { + "SPDXID": "SPDXRef-anstyle-1.0.14", + "name": "anstyle", + "versionInfo": "1.0.14", + "downloadLocation": "https://crates.io/crates/anstyle/1.0.14", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT OR Apache-2.0", + "licenseDeclared": "MIT OR Apache-2.0", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000" + } + ], + "description": "ANSI text styling", + "supplier": "Organization: rust-cli", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/anstyle@1.0.14" + } + ] + }, + { + "SPDXID": "SPDXRef-utf8parse-0.2.2", + "name": "utf8parse", + "versionInfo": "0.2.2", + "downloadLocation": "https://crates.io/crates/utf8parse/0.2.2", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "Apache-2.0 OR MIT", + "licenseDeclared": "Apache-2.0 OR MIT", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + } + ], + "description": "Table-driven UTF-8 parser", + "supplier": "Organization: alacritty", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/utf8parse@0.2.2" + } + ] + }, + { + "SPDXID": "SPDXRef-anstyle-parse-1.0.0", + "name": "anstyle-parse", + "versionInfo": "1.0.0", + "downloadLocation": "https://crates.io/crates/anstyle-parse/1.0.0", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT OR Apache-2.0", + "licenseDeclared": "MIT OR Apache-2.0", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "52ce7f38b242319f7cabaa6813055467063ecdc9d355bbb4ce0c68908cd8130e" + } + ], + "description": "Parse ANSI Style Escapes", + "supplier": "Organization: rust-cli", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/anstyle-parse@1.0.0" + } + ] + }, + { + "SPDXID": "SPDXRef-anstyle-query-1.1.5", + "name": "anstyle-query", + "versionInfo": "1.1.5", + "downloadLocation": "https://crates.io/crates/anstyle-query/1.1.5", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT OR Apache-2.0", + "licenseDeclared": "MIT OR Apache-2.0", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" + } + ], + "description": "Look up colored console capabilities", + "supplier": "Organization: rust-cli", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/anstyle-query@1.1.5" + } + ] + }, + { + "SPDXID": "SPDXRef-colorchoice-1.0.5", + "name": "colorchoice", + "versionInfo": "1.0.5", + "downloadLocation": "https://crates.io/crates/colorchoice/1.0.5", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT OR Apache-2.0", + "licenseDeclared": "MIT OR Apache-2.0", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570" + } + ], + "description": "Global override of color control", + "supplier": "Organization: rust-cli", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/colorchoice@1.0.5" + } + ] + }, + { + "SPDXID": "SPDXRef-is-terminal-polyfill-1.70.2", + "name": "is-terminal-polyfill", + "versionInfo": "1.70.2", + "downloadLocation": "https://crates.io/crates/is-terminal-polyfill/1.70.2", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT OR Apache-2.0", + "licenseDeclared": "MIT OR Apache-2.0", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" + } + ], + "description": "Polyfill for `is_terminal` stdlib feature for use with older MSRVs", + "supplier": "Organization: polyfill-rs", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/is-terminal-polyfill@1.70.2" + } + ] + }, + { + "SPDXID": "SPDXRef-anstream-1.0.0", + "name": "anstream", + "versionInfo": "1.0.0", + "downloadLocation": "https://crates.io/crates/anstream/1.0.0", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT OR Apache-2.0", + "licenseDeclared": "MIT OR Apache-2.0", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "824a212faf96e9acacdbd09febd34438f8f711fb84e09a8916013cd7815ca28d" + } + ], + "description": "IO stream adapters for writing colored text that will gracefully degrade according to your terminal's capabilities.", + "supplier": "Organization: rust-cli", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/anstream@1.0.0" + } + ] + }, + { + "SPDXID": "SPDXRef-clap-lex-1.1.1", + "name": "clap-lex", + "versionInfo": "1.1.1", + "downloadLocation": "https://crates.io/crates/clap-lex/1.1.1", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT OR Apache-2.0", + "licenseDeclared": "MIT OR Apache-2.0", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "1c133bc6a41be0d194c306b5506d15e6feeea7b1d6604bd3f8310dfb2ca96486" + } + ], + "description": "Minimal, flexible command line parser", + "supplier": "Organization: clap-rs", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/clap-lex@1.1.1" + } + ] + }, + { + "SPDXID": "SPDXRef-strsim-0.11.1", + "name": "strsim", + "versionInfo": "0.11.1", + "downloadLocation": "https://crates.io/crates/strsim/0.11.1", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT", + "licenseDeclared": "MIT", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + } + ], + "description": "Implementations of string similarity metrics. Includes Hamming, Levenshtein,\nOSA, Damerau-Levenshtein, Jaro, Jaro-Winkler, and S\u00f8rensen-Dice.", + "supplier": "Organization: rapidfuzz", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/strsim@0.11.1" + } + ] + }, + { + "SPDXID": "SPDXRef-clap-builder-4.6.7", + "name": "clap-builder", + "versionInfo": "4.6.7", + "downloadLocation": "https://crates.io/crates/clap-builder/4.6.7", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT OR Apache-2.0", + "licenseDeclared": "MIT OR Apache-2.0", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "ec0797fb7aeb1406c84efac526901f7ec3ead2124f946b494e72879d4b54704d" + } + ], + "description": "A simple to use, efficient, and full-featured Command Line Argument Parser", + "supplier": "Organization: clap-rs", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/clap-builder@4.6.7" + } + ] + }, + { + "SPDXID": "SPDXRef-heck-0.5.0", + "name": "heck", + "versionInfo": "0.5.0", + "downloadLocation": "https://crates.io/crates/heck/0.5.0", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT OR Apache-2.0", + "licenseDeclared": "MIT OR Apache-2.0", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + } + ], + "description": "heck is a case conversion library.", + "supplier": "Organization: withoutboats", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/heck@0.5.0" + } + ] + }, + { + "SPDXID": "SPDXRef-clap-derive-4.6.7", + "name": "clap-derive", + "versionInfo": "4.6.7", + "downloadLocation": "https://crates.io/crates/clap-derive/4.6.7", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT OR Apache-2.0", + "licenseDeclared": "MIT OR Apache-2.0", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "f9c751b79415d4e559e3d1fcf128e09e720eb673a06d26cf6f392d37d75b66e0" + } + ], + "description": "Parse command line argument by defining a struct, derive crate.", + "supplier": "Organization: clap-rs", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/clap-derive@4.6.7" + } + ] + }, + { + "SPDXID": "SPDXRef-clap-4.6.7", + "name": "clap", + "versionInfo": "4.6.7", + "downloadLocation": "https://crates.io/crates/clap/4.6.7", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT OR Apache-2.0", + "licenseDeclared": "MIT OR Apache-2.0", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "aa8876b300ab35ba921adea3dfd70157a46249b33f95c9084ae5709785478946" + } + ], + "description": "A simple to use, efficient, and full-featured Command Line Argument Parser", + "supplier": "Organization: clap-rs", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/clap@4.6.7" + } + ] + }, + { + "SPDXID": "SPDXRef-libc-0.2.186", + "name": "libc", + "versionInfo": "0.2.186", + "downloadLocation": "https://crates.io/crates/libc/0.2.186", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT OR Apache-2.0", + "licenseDeclared": "MIT OR Apache-2.0", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" + } + ], + "description": "Raw FFI bindings to platform libraries like libc.", + "supplier": "Organization: rust-lang", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/libc@0.2.186" + } + ] + }, + { + "SPDXID": "SPDXRef-unicode-width-0.2.2", + "name": "unicode-width", + "versionInfo": "0.2.2", + "downloadLocation": "https://crates.io/crates/unicode-width/0.2.2", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT OR Apache-2.0", + "licenseDeclared": "MIT OR Apache-2.0", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" + } + ], + "description": "Determine displayed width of `char` and `str` types\naccording to Unicode Standard Annex #11 rules.", + "supplier": "Organization: unicode-rs", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/unicode-width@0.2.2" + } + ] + }, + { + "SPDXID": "SPDXRef-console-0.15.11", + "name": "console", + "versionInfo": "0.15.11", + "downloadLocation": "https://crates.io/crates/console/0.15.11", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT", + "licenseDeclared": "MIT", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "e96a4956774c13c126a8b5af4daa79384f4d826534c95a02d76afb39e2ab64e3" + } + ], + "description": "A terminal and console abstraction for Rust", + "supplier": "Organization: console-rs", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/console@0.15.11" + } + ] + }, + { + "SPDXID": "SPDXRef-portable-atomic-1.15.0", + "name": "portable-atomic", + "versionInfo": "1.15.0", + "downloadLocation": "https://crates.io/crates/portable-atomic/1.15.0", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "Apache-2.0 OR MIT", + "licenseDeclared": "Apache-2.0 OR MIT", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "05c8b63e8d9609db387f0324918f81d68fe27748f084ef092fb35954d0539a85" + } + ], + "description": "Portable atomic types including support for 128-bit atomics, atomic float, etc.", + "supplier": "Organization: taiki-e", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/portable-atomic@1.15.0" + } + ] + }, + { + "SPDXID": "SPDXRef-unit-prefix-0.5.2", + "name": "unit-prefix", + "versionInfo": "0.5.2", + "downloadLocation": "https://crates.io/crates/unit-prefix/0.5.2", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT", + "licenseDeclared": "MIT", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "81e544489bf3d8ef66c953931f56617f423cd4b5494be343d9b9d3dda037b9a3" + } + ], + "description": "Format numbers with metric and binary unit prefixes", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/unit-prefix@0.5.2" + } + ] + }, + { + "SPDXID": "SPDXRef-indicatif-0.18.6", + "name": "indicatif", + "versionInfo": "0.18.6", + "downloadLocation": "https://crates.io/crates/indicatif/0.18.6", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT", + "licenseDeclared": "MIT", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "9433806cd6b4ec1aba79c021c7e4c58fb4c3b9977c085062e611ac929998fb0c" + } + ], + "description": "A progress bar and cli reporting library for Rust", + "supplier": "Organization: console-rs", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/indicatif@0.18.6" + } + ] + }, + { + "SPDXID": "SPDXRef-writeable-0.6.4", + "name": "writeable", + "versionInfo": "0.6.4", + "downloadLocation": "https://crates.io/crates/writeable/0.6.4", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "NOASSERTION", + "licenseDeclared": "NOASSERTION", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "3ad82d2a33cdc9674dc7465672f271e096168fcdbe0f799d9e6db8c5892679dc" + } + ], + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/writeable@0.6.4" + } + ] + }, + { + "SPDXID": "SPDXRef-stable-deref-trait-1.2.1", + "name": "stable-deref-trait", + "versionInfo": "1.2.1", + "downloadLocation": "https://crates.io/crates/stable-deref-trait/1.2.1", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT OR Apache-2.0", + "licenseDeclared": "MIT OR Apache-2.0", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" + } + ], + "description": "An unsafe marker trait for types like Box and Rc that dereference to a stable address even when moved, and hence can be used with libraries such as owning_ref and rental.", + "supplier": "Organization: storyyeller", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/stable-deref-trait@1.2.1" + } + ] + }, + { + "SPDXID": "SPDXRef-synstructure-0.14.0", + "name": "synstructure", + "versionInfo": "0.14.0", + "downloadLocation": "https://crates.io/crates/synstructure/0.14.0", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT", + "licenseDeclared": "MIT", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "901704edd0dfe137f1987838ee4f259e4e063c31371bdb423f7ae38ec6f77f02" + } + ], + "description": "Helper methods and macros for custom derives", + "supplier": "Organization: mystor", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/synstructure@0.14.0" + } + ] + }, + { + "SPDXID": "SPDXRef-zerofrom-derive-0.1.8", + "name": "zerofrom-derive", + "versionInfo": "0.1.8", + "downloadLocation": "https://crates.io/crates/zerofrom-derive/0.1.8", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "NOASSERTION", + "licenseDeclared": "NOASSERTION", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "f75b4683f6c7f45248d4d64056a24298c6281e0993356d7d1b4a1a962ef10d4a" + } + ], + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/zerofrom-derive@0.1.8" + } + ] + }, + { + "SPDXID": "SPDXRef-zerofrom-0.1.8", + "name": "zerofrom", + "versionInfo": "0.1.8", + "downloadLocation": "https://crates.io/crates/zerofrom/0.1.8", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "NOASSERTION", + "licenseDeclared": "NOASSERTION", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "0ec05a11813ea801ff6d75110ad09cd0824ddba17dfe17128ea0d5f68e6c5272" + } + ], + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/zerofrom@0.1.8" + } + ] + }, + { + "SPDXID": "SPDXRef-yoke-derive-0.8.4", + "name": "yoke-derive", + "versionInfo": "0.8.4", + "downloadLocation": "https://crates.io/crates/yoke-derive/0.8.4", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "NOASSERTION", + "licenseDeclared": "NOASSERTION", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "ec8ebde2db3681e8c9980cc27822030e68752690ddfa9473e739aeb4dbde6d71" + } + ], + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/yoke-derive@0.8.4" + } + ] + }, + { + "SPDXID": "SPDXRef-yoke-0.8.3", + "name": "yoke", + "versionInfo": "0.8.3", + "downloadLocation": "https://crates.io/crates/yoke/0.8.3", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "NOASSERTION", + "licenseDeclared": "NOASSERTION", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "709fe23a0424b6a435d82152b1bd3fdfb0833487d5fa90d05d42762a9891fef5" + } + ], + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/yoke@0.8.3" + } + ] + }, + { + "SPDXID": "SPDXRef-zerovec-derive-0.11.6", + "name": "zerovec-derive", + "versionInfo": "0.11.6", + "downloadLocation": "https://crates.io/crates/zerovec-derive/0.11.6", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "NOASSERTION", + "licenseDeclared": "NOASSERTION", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "34df6fc39dbd26ddc9c10e6a2984476e13acce22e64e4487636ef494369225da" + } + ], + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/zerovec-derive@0.11.6" + } + ] + }, + { + "SPDXID": "SPDXRef-zerovec-0.11.8", + "name": "zerovec", + "versionInfo": "0.11.8", + "downloadLocation": "https://crates.io/crates/zerovec/0.11.8", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "NOASSERTION", + "licenseDeclared": "NOASSERTION", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "bb0464e17806c1d976d5cba29399c7f08e516e279e2ba493f63123b5fca67dd8" + } + ], + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/zerovec@0.11.8" + } + ] + }, + { + "SPDXID": "SPDXRef-potential-utf-0.1.6", + "name": "potential-utf", + "versionInfo": "0.1.6", + "downloadLocation": "https://crates.io/crates/potential-utf/0.1.6", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "Unicode-3.0", + "licenseDeclared": "Unicode-3.0", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "d83eb9bc6d8e5cf568e7a1101d60ee05e81ed50ea106026f3d18deeb046d7661" + } + ], + "description": "Unvalidated string and character types", + "supplier": "Organization: unicode-org", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/potential-utf@0.1.6" + } + ] + }, + { + "SPDXID": "SPDXRef-utf8-iter-1.0.4", + "name": "utf8-iter", + "versionInfo": "1.0.4", + "downloadLocation": "https://crates.io/crates/utf8-iter/1.0.4", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "Apache-2.0 OR MIT", + "licenseDeclared": "Apache-2.0 OR MIT", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + } + ], + "description": "Iterator by char over potentially-invalid UTF-8 in &[u8]", + "supplier": "Organization: hsivonen", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/utf8-iter@1.0.4" + } + ] + }, + { + "SPDXID": "SPDXRef-displaydoc-0.2.7", + "name": "displaydoc", + "versionInfo": "0.2.7", + "downloadLocation": "https://crates.io/crates/displaydoc/0.2.7", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT OR Apache-2.0", + "licenseDeclared": "MIT OR Apache-2.0", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "c6232dd377dcc64799954cbd3a9bb882e9cdc1308ccd87b1c098f1fb2eaf82a8" + } + ], + "description": "A derive macro for implementing the display Trait via a doc comment and string interpolation", + "supplier": "Organization: yaahc", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/displaydoc@0.2.7" + } + ] + }, + { + "SPDXID": "SPDXRef-icu-collections-2.3.0", + "name": "icu-collections", + "versionInfo": "2.3.0", + "downloadLocation": "https://crates.io/crates/icu-collections/2.3.0", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "Unicode-3.0", + "licenseDeclared": "Unicode-3.0", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "fa68d21081c4a05d5a901a1c62add574c77048b6a1c67be3b50ce0b60d4ca513" + } + ], + "description": "Collection of API for use in ICU libraries.", + "supplier": "Organization: unicode-org", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/icu-collections@2.3.0" + } + ] + }, + { + "SPDXID": "SPDXRef-litemap-0.8.3", + "name": "litemap", + "versionInfo": "0.8.3", + "downloadLocation": "https://crates.io/crates/litemap/0.8.3", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "Unicode-3.0", + "licenseDeclared": "Unicode-3.0", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "47d9d19d1d6efa0109d2f65ff4c85cddd50bd572e5a00127ab10987290bcefae" + } + ], + "description": "A key-value Map implementation based on a flat, sorted Vec.", + "supplier": "Organization: unicode-org", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/litemap@0.8.3" + } + ] + }, + { + "SPDXID": "SPDXRef-tinystr-0.8.4", + "name": "tinystr", + "versionInfo": "0.8.4", + "downloadLocation": "https://crates.io/crates/tinystr/0.8.4", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "Unicode-3.0", + "licenseDeclared": "Unicode-3.0", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "b1e27c91459209c2986af3dcf603a5a74a4368754ce37414f59acc971167f643" + } + ], + "description": "A small ASCII-only bounded length string representation.", + "supplier": "Organization: unicode-org", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/tinystr@0.8.4" + } + ] + }, + { + "SPDXID": "SPDXRef-icu-locale-core-2.3.0", + "name": "icu-locale-core", + "versionInfo": "2.3.0", + "downloadLocation": "https://crates.io/crates/icu-locale-core/2.3.0", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "Unicode-3.0", + "licenseDeclared": "Unicode-3.0", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "d56e28588da92eee5c3201a6eff33fabdd49b62269c8938d4ff050ce4d900deb" + } + ], + "description": "API for managing Unicode Language and Locale Identifiers", + "supplier": "Organization: unicode-org", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/icu-locale-core@2.3.0" + } + ] + }, + { + "SPDXID": "SPDXRef-icu-locale-fallback-data-2.3.0", + "name": "icu-locale-fallback-data", + "versionInfo": "2.3.0", + "downloadLocation": "https://crates.io/crates/icu-locale-fallback-data/2.3.0", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "Unicode-3.0", + "licenseDeclared": "Unicode-3.0", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "decf2a22ec8fa68f1a0c1129a3f8583f8f8bc24e8b9ccbe98ead99f62a4dc3a8" + } + ], + "description": "Data for the icu_locale_fallback crate", + "supplier": "Organization: unicode-org", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/icu-locale-fallback-data@2.3.0" + } + ] + }, + { + "SPDXID": "SPDXRef-zerotrie-0.2.5", + "name": "zerotrie", + "versionInfo": "0.2.5", + "downloadLocation": "https://crates.io/crates/zerotrie/0.2.5", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "NOASSERTION", + "licenseDeclared": "NOASSERTION", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "4ea269c3bd32f0a32c321907a2ae912ba6f4649bb0fc764a15627e99a7095a3f" + } + ], + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/zerotrie@0.2.5" + } + ] + }, + { + "SPDXID": "SPDXRef-icu-provider-2.3.1", + "name": "icu-provider", + "versionInfo": "2.3.1", + "downloadLocation": "https://crates.io/crates/icu-provider/2.3.1", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "Unicode-3.0", + "licenseDeclared": "Unicode-3.0", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "d27bbb9d3abbefac45d55f647c9de1d44aafcd1186eb91879afef17c396c3e73" + } + ], + "description": "Trait and struct definitions for the ICU data provider", + "supplier": "Organization: unicode-org", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/icu-provider@2.3.1" + } + ] + }, + { + "SPDXID": "SPDXRef-icu-locale-fallback-2.3.0", + "name": "icu-locale-fallback", + "versionInfo": "2.3.0", + "downloadLocation": "https://crates.io/crates/icu-locale-fallback/2.3.0", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "Unicode-3.0", + "licenseDeclared": "Unicode-3.0", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "251af8e57c9400e3eb58242fe5b8b1152b2a64fdf4cf632f923c38ccee6f2fa9" + } + ], + "description": "API for Locale Fallback algorithms", + "supplier": "Organization: unicode-org", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/icu-locale-fallback@2.3.0" + } + ] + }, + { + "SPDXID": "SPDXRef-icu-segmenter-data-2.3.0", + "name": "icu-segmenter-data", + "versionInfo": "2.3.0", + "downloadLocation": "https://crates.io/crates/icu-segmenter-data/2.3.0", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "Unicode-3.0", + "licenseDeclared": "Unicode-3.0", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "ae293c039020f9ec10710af98d29ce6aa2051486638b49c9a6409f3b4a9e98ad" + } + ], + "description": "Data for the icu_segmenter crate", + "supplier": "Organization: unicode-org", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/icu-segmenter-data@2.3.0" + } + ] + }, + { + "SPDXID": "SPDXRef-icu-segmenter-2.3.0", + "name": "icu-segmenter", + "versionInfo": "2.3.0", + "downloadLocation": "https://crates.io/crates/icu-segmenter/2.3.0", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "Unicode-3.0", + "licenseDeclared": "Unicode-3.0", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "82d07aafccd67af15d02512a6adf5896fbc5ed00f2e99b471d2efa14016db3db" + } + ], + "description": "Unicode line breaking and text segmentation algorithms for text boundaries analysis", + "supplier": "Organization: unicode-org", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/icu-segmenter@2.3.0" + } + ] + }, + { + "SPDXID": "SPDXRef-smawk-0.3.3", + "name": "smawk", + "versionInfo": "0.3.3", + "downloadLocation": "https://crates.io/crates/smawk/0.3.3", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT", + "licenseDeclared": "MIT", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "e8e2fb0f499abb4d162f2bedad68f5ef91a1682b5a03596ddb67efd37768d100" + } + ], + "description": "Functions for finding row-minima in a totally monotone matrix.", + "supplier": "Organization: mgeisler", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/smawk@0.3.3" + } + ] + }, + { + "SPDXID": "SPDXRef-textwrap-0.16.4", + "name": "textwrap", + "versionInfo": "0.16.4", + "downloadLocation": "https://crates.io/crates/textwrap/0.16.4", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT", + "licenseDeclared": "MIT", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "6ecfad6c3abc80a577f2b91c1e412ee57e7a060d430b553c1b0c940974ebcd49" + } + ], + "description": "Library for word wrapping, indenting, and dedenting strings. Has optional support for Unicode and emojis as well as machine hyphenation.", + "supplier": "Organization: mgeisler", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/textwrap@0.16.4" + } + ] + }, + { + "SPDXID": "SPDXRef-zeroize-derive-1.5.0", + "name": "zeroize-derive", + "versionInfo": "1.5.0", + "downloadLocation": "https://crates.io/crates/zeroize-derive/1.5.0", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "NOASSERTION", + "licenseDeclared": "NOASSERTION", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "3c50655cbb0fe3fc43170059e702f1ce5e19b84cec58dc87b037a09935c2f328" + } + ], + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/zeroize-derive@1.5.0" + } + ] + }, + { + "SPDXID": "SPDXRef-zeroize-1.9.1", + "name": "zeroize", + "versionInfo": "1.9.1", + "downloadLocation": "https://crates.io/crates/zeroize/1.9.1", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "NOASSERTION", + "licenseDeclared": "NOASSERTION", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "e13084392c5e4bc371903e2935a5eaeed24905a7511356b883835e18a78f6879" + } + ], + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/zeroize@1.9.1" + } + ] + }, + { + "SPDXID": "SPDXRef-cliclack-0.3.8", + "name": "cliclack", + "versionInfo": "0.3.8", + "downloadLocation": "https://crates.io/crates/cliclack/0.3.8", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT", + "licenseDeclared": "MIT", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "aa510b739c618c679375ea9c5af44ce9f591289546e874ad5910e7ce7df79844" + } + ], + "description": "Beautiful, minimal, opinionated CLI prompts inspired by the Clack NPM package.", + "supplier": "Organization: fadeevab", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/cliclack@0.3.8" + } + ] + }, + { + "SPDXID": "SPDXRef-score-communication-unknown", + "name": "score_communication", + "versionInfo": "unknown", + "downloadLocation": "NOASSERTION", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "NOASSERTION", + "licenseDeclared": "NOASSERTION", + "copyrightText": "NOASSERTION", + "description": "Missing", + "supplier": "Organization: Eclipse Foundation", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:github/eclipse-score/score_communication@unknown" + } + ] + }, + { + "SPDXID": "SPDXRef-boost.config-1.83.0.bcr.4", + "name": "boost.config", + "versionInfo": "1.83.0.bcr.4", + "downloadLocation": "NOASSERTION", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "BSL-1.0", + "licenseDeclared": "BSL-1.0", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "0a5b5bf8d2afcf0731fcd452fe69f20d45b0d08ba07e70698cc7ee36f0ce7e9c" + } + ], + "description": "Missing", + "supplier": "Organization: Boost.org", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:generic/boost.config@1.83.0.bcr.4" + } + ] + }, + { + "SPDXID": "SPDXRef-boost.assert-1.83.0.bcr.4", + "name": "boost.assert", + "versionInfo": "1.83.0.bcr.4", + "downloadLocation": "NOASSERTION", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "BSL-1.0", + "licenseDeclared": "BSL-1.0", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "225cb551191ac7f5fb4eba0476a0d0397405cbb360dd9755bf29b28033415379" + } + ], + "description": "Missing", + "supplier": "Organization: Boost.org", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:generic/boost.assert@1.83.0.bcr.4" + } + ] + }, + { + "SPDXID": "SPDXRef-boost.mp11-1.83.0.bcr.4", + "name": "boost.mp11", + "versionInfo": "1.83.0.bcr.4", + "downloadLocation": "NOASSERTION", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "BSL-1.0", + "licenseDeclared": "BSL-1.0", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "8c2924bab093f7d0e44cb2ac55dea985497b9d85d6a246c89377a49d27d452a6" + } + ], + "description": "Missing", + "supplier": "Organization: Boost.org", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:generic/boost.mp11@1.83.0.bcr.4" + } + ] + }, + { + "SPDXID": "SPDXRef-boost.describe-1.83.0.bcr.4", + "name": "boost.describe", + "versionInfo": "1.83.0.bcr.4", + "downloadLocation": "NOASSERTION", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "BSL-1.0", + "licenseDeclared": "BSL-1.0", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "748e4e74723c381d304f888849efd52caf5710f48ceb67b91d4e43fc800ccd81" + } + ], + "description": "Missing", + "supplier": "Organization: Boost.org", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:generic/boost.describe@1.83.0.bcr.4" + } + ] + }, + { + "SPDXID": "SPDXRef-boost.static-assert-1.83.0.bcr.4", + "name": "boost.static_assert", + "versionInfo": "1.83.0.bcr.4", + "downloadLocation": "NOASSERTION", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "BSL-1.0", + "licenseDeclared": "BSL-1.0", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "d14305e5679f008a352f75e8eaa725ab9ff71ec1dd2553cda1b171e39fd20cfe" + } + ], + "description": "Missing", + "supplier": "Organization: Boost.org", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:generic/boost.static_assert@1.83.0.bcr.4" + } + ] + }, + { + "SPDXID": "SPDXRef-boost.type-traits-1.83.0.bcr.4", + "name": "boost.type_traits", + "versionInfo": "1.83.0.bcr.4", + "downloadLocation": "NOASSERTION", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "BSL-1.0", + "licenseDeclared": "BSL-1.0", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "107e5bef1443ee75efc197198b45fb01d6460b475e20d1fa0d52af64600c8204" + } + ], + "description": "Missing", + "supplier": "Organization: Boost.org", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:generic/boost.type_traits@1.83.0.bcr.4" + } + ] + }, + { + "SPDXID": "SPDXRef-boost.container-hash-1.83.0.bcr.4", + "name": "boost.container_hash", + "versionInfo": "1.83.0.bcr.4", + "downloadLocation": "NOASSERTION", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "BSL-1.0", + "licenseDeclared": "BSL-1.0", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "0410e34fef0a3dc16edc0f6a8f49783cba04a891183d76286ba974e4d9806ef0" + } + ], + "description": "Missing", + "supplier": "Organization: Boost.org", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:generic/boost.container_hash@1.83.0.bcr.4" + } + ] + }, + { + "SPDXID": "SPDXRef-boost.move-1.83.0.bcr.4", + "name": "boost.move", + "versionInfo": "1.83.0.bcr.4", + "downloadLocation": "NOASSERTION", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "BSL-1.0", + "licenseDeclared": "BSL-1.0", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "6f9971fd617c8d94e7c4a02c618052edec5ad0f30a1b18b4bf9e995443545330" + } + ], + "description": "Missing", + "supplier": "Organization: Boost.org", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:generic/boost.move@1.83.0.bcr.4" + } + ] + }, + { + "SPDXID": "SPDXRef-boost.intrusive-1.83.0.bcr.4", + "name": "boost.intrusive", + "versionInfo": "1.83.0.bcr.4", + "downloadLocation": "NOASSERTION", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "BSL-1.0", + "licenseDeclared": "BSL-1.0", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "04475d40cac42ebe96888a0599b2b9b35d4092502710f421cb3dc9ad2c6b8099" + } + ], + "description": "Missing", + "supplier": "Organization: Boost.org", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:generic/boost.intrusive@1.83.0.bcr.4" + } + ] + }, + { + "SPDXID": "SPDXRef-boost.container-1.83.0.bcr.4", + "name": "boost.container", + "versionInfo": "1.83.0.bcr.4", + "downloadLocation": "NOASSERTION", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "BSL-1.0", + "licenseDeclared": "BSL-1.0", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "246ae4564faf1c08995ac3f6a6886999e197821d0e3b3dd641911ae417657602" + } + ], + "description": "Missing", + "supplier": "Organization: Boost.org", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:generic/boost.container@1.83.0.bcr.4" + } + ] + }, + { + "SPDXID": "SPDXRef-boost.throw-exception-1.83.0.bcr.4", + "name": "boost.throw_exception", + "versionInfo": "1.83.0.bcr.4", + "downloadLocation": "NOASSERTION", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "BSL-1.0", + "licenseDeclared": "BSL-1.0", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "ec9d540d7ca6beaffdc7f0395cd5eea0acda924b3ab306966786b242df74b512" + } + ], + "description": "Missing", + "supplier": "Organization: Boost.org", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:generic/boost.throw_exception@1.83.0.bcr.4" + } + ] + }, + { + "SPDXID": "SPDXRef-boost.core-1.83.0.bcr.4", + "name": "boost.core", + "versionInfo": "1.83.0.bcr.4", + "downloadLocation": "NOASSERTION", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "BSL-1.0", + "licenseDeclared": "BSL-1.0", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "d709cff67716e366200ca77680b39e9c98141c7289ddbf207b1c710f4de7bf03" + } + ], + "description": "Missing", + "supplier": "Organization: Boost.org", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:generic/boost.core@1.83.0.bcr.4" + } + ] + }, + { + "SPDXID": "SPDXRef-boost.predef-1.83.0.bcr.4", + "name": "boost.predef", + "versionInfo": "1.83.0.bcr.4", + "downloadLocation": "NOASSERTION", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "BSL-1.0", + "licenseDeclared": "BSL-1.0", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "4bc4c6af4bcc909b1d4abebba5583d03d5e09447c658fa63fe8fdd8a5b2906e5" + } + ], + "description": "Missing", + "supplier": "Organization: Boost.org", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:generic/boost.predef@1.83.0.bcr.4" + } + ] + }, + { + "SPDXID": "SPDXRef-boost.preprocessor-1.83.0.bcr.4", + "name": "boost.preprocessor", + "versionInfo": "1.83.0.bcr.4", + "downloadLocation": "NOASSERTION", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "BSL-1.0", + "licenseDeclared": "BSL-1.0", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "ce770e480d05b987d953d7e64f80cebdfb5b008a9b9da80355d9e86a3d09bbb7" + } + ], + "description": "Missing", + "supplier": "Organization: Boost.org", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:generic/boost.preprocessor@1.83.0.bcr.4" + } + ] + }, + { + "SPDXID": "SPDXRef-boost.tuple-1.83.0.bcr.4", + "name": "boost.tuple", + "versionInfo": "1.83.0.bcr.4", + "downloadLocation": "NOASSERTION", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "BSL-1.0", + "licenseDeclared": "BSL-1.0", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "e145722cc962e7f4385f554ce6e8f4373bab792691712788fa16befa9082b938" + } + ], + "description": "Missing", + "supplier": "Organization: Boost.org", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:generic/boost.tuple@1.83.0.bcr.4" + } + ] + }, + { + "SPDXID": "SPDXRef-boost.unordered-1.83.0.bcr.4", + "name": "boost.unordered", + "versionInfo": "1.83.0.bcr.4", + "downloadLocation": "NOASSERTION", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "BSL-1.0", + "licenseDeclared": "BSL-1.0", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "1afd0e208be668faeea97b63d18ef23232c522e300b454d4a2f164c369dcfb2e" + } + ], + "description": "Missing", + "supplier": "Organization: Boost.org", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:generic/boost.unordered@1.83.0.bcr.4" + } + ] + }, + { + "SPDXID": "SPDXRef-boost.winapi-1.83.0.bcr.4", + "name": "boost.winapi", + "versionInfo": "1.83.0.bcr.4", + "downloadLocation": "NOASSERTION", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "BSL-1.0", + "licenseDeclared": "BSL-1.0", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "d4be5cdf5cfdeae83f70211faa034bc41168c75fd98a560464131c8cfc6365fa" + } + ], + "description": "Missing", + "supplier": "Organization: Boost.org", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:generic/boost.winapi@1.83.0.bcr.4" + } + ] + }, + { + "SPDXID": "SPDXRef-boost.interprocess-1.83.0.bcr.4", + "name": "boost.interprocess", + "versionInfo": "1.83.0.bcr.4", + "downloadLocation": "NOASSERTION", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "BSL-1.0", + "licenseDeclared": "BSL-1.0", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "4f9c40d790c736a619c03b5788b80575fadffbb712fb10944572b420313c5dee" + } + ], + "description": "Missing", + "supplier": "Organization: Boost.org", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:generic/boost.interprocess@1.83.0.bcr.4" + } + ] + }, + { + "SPDXID": "SPDXRef-score-baselibs-repo-rulesacl-deb-unknown", + "name": "score_baselibs++_repo_rules+acl-deb", + "versionInfo": "unknown", + "downloadLocation": "NOASSERTION", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "NOASSERTION", + "licenseDeclared": "NOASSERTION", + "copyrightText": "NOASSERTION", + "description": "Missing", + "supplier": "Organization: Eclipse Foundation", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:github/eclipse-score/score_baselibs++_repo_rules+acl-deb@unknown" + } + ] + }, + { + "SPDXID": "SPDXRef-futures-core-0.3.34", + "name": "futures-core", + "versionInfo": "0.3.34", + "downloadLocation": "https://crates.io/crates/futures-core/0.3.34", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT OR Apache-2.0", + "licenseDeclared": "MIT OR Apache-2.0", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "92d699e522242e69e3003b94ecc1f960f3a5e015aa7c5d7486e65ad01dd94f5e" + } + ], + "description": "The core traits and types in for the `futures` library.", + "supplier": "Organization: rust-lang", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/futures-core@0.3.34" + } + ] + }, + { + "SPDXID": "SPDXRef-futures-sink-0.3.34", + "name": "futures-sink", + "versionInfo": "0.3.34", + "downloadLocation": "https://crates.io/crates/futures-sink/0.3.34", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT OR Apache-2.0", + "licenseDeclared": "MIT OR Apache-2.0", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "1944426bf7d03f1d14f708785e4b33efd750b36d48a157b836b3efc15ede8e1d" + } + ], + "description": "The asynchronous `Sink` trait for the futures-rs library.", + "supplier": "Organization: rust-lang", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/futures-sink@0.3.34" + } + ] + }, + { + "SPDXID": "SPDXRef-futures-channel-0.3.34", + "name": "futures-channel", + "versionInfo": "0.3.34", + "downloadLocation": "https://crates.io/crates/futures-channel/0.3.34", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT OR Apache-2.0", + "licenseDeclared": "MIT OR Apache-2.0", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "b1f9e3d69d39e4862ffed03ed071a76f9a13ba1d9109d355b0f0aa6b15e393c4" + } + ], + "description": "Channels for asynchronous communication using futures-rs.", + "supplier": "Organization: rust-lang", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/futures-channel@0.3.34" + } + ] + }, + { + "SPDXID": "SPDXRef-futures-task-0.3.34", + "name": "futures-task", + "versionInfo": "0.3.34", + "downloadLocation": "https://crates.io/crates/futures-task/0.3.34", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT OR Apache-2.0", + "licenseDeclared": "MIT OR Apache-2.0", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "cd417de3d1d015fc3bfd2b1ea46dfc7bab72ef86f1cc7cc9c78e728b34a6d1fd" + } + ], + "description": "Tools for working with tasks.", + "supplier": "Organization: rust-lang", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/futures-task@0.3.34" + } + ] + }, + { + "SPDXID": "SPDXRef-futures-io-0.3.34", + "name": "futures-io", + "versionInfo": "0.3.34", + "downloadLocation": "https://crates.io/crates/futures-io/0.3.34", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT OR Apache-2.0", + "licenseDeclared": "MIT OR Apache-2.0", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "53c0fa8157de1303bfffdaa1cc2a673bfffb60102f76b0ef4441659124373fed" + } + ], + "description": "The `AsyncRead`, `AsyncWrite`, `AsyncSeek`, and `AsyncBufRead` traits for the futures-rs library.", + "supplier": "Organization: rust-lang", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/futures-io@0.3.34" + } + ] + }, + { + "SPDXID": "SPDXRef-slab-0.4.12", + "name": "slab", + "versionInfo": "0.4.12", + "downloadLocation": "https://crates.io/crates/slab/0.4.12", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT", + "licenseDeclared": "MIT", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" + } + ], + "description": "Pre-allocated storage for a uniform data type", + "supplier": "Organization: tokio-rs", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/slab@0.4.12" + } + ] + }, + { + "SPDXID": "SPDXRef-futures-macro-0.3.34", + "name": "futures-macro", + "versionInfo": "0.3.34", + "downloadLocation": "https://crates.io/crates/futures-macro/0.3.34", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT OR Apache-2.0", + "licenseDeclared": "MIT OR Apache-2.0", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "9fb9654ba8355388abeb8dcb4fc62f511300867002afc858860463bdd9fe0c44" + } + ], + "description": "The futures-rs procedural macro implementations.", + "supplier": "Organization: rust-lang", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/futures-macro@0.3.34" + } + ] + }, + { + "SPDXID": "SPDXRef-futures-util-0.3.34", + "name": "futures-util", + "versionInfo": "0.3.34", + "downloadLocation": "https://crates.io/crates/futures-util/0.3.34", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT OR Apache-2.0", + "licenseDeclared": "MIT OR Apache-2.0", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "0d50a92467f8ba5dd6e3ee5d4bd04d73ab2e4e1c44474a0674821dfce14b79bc" + } + ], + "description": "Common utilities and extension traits for the futures-rs library.", + "supplier": "Organization: rust-lang", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/futures-util@0.3.34" + } + ] + }, + { + "SPDXID": "SPDXRef-futures-executor-0.3.34", + "name": "futures-executor", + "versionInfo": "0.3.34", + "downloadLocation": "https://crates.io/crates/futures-executor/0.3.34", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT OR Apache-2.0", + "licenseDeclared": "MIT OR Apache-2.0", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "031b47cf1a3c6cc8bc2fc76cd437f521619387907d469316e7c0bc278f1f5432" + } + ], + "description": "Executors for asynchronous tasks based on the futures-rs library.", + "supplier": "Organization: rust-lang", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/futures-executor@0.3.34" + } + ] + }, + { + "SPDXID": "SPDXRef-futures-0.3.34", + "name": "futures", + "versionInfo": "0.3.34", + "downloadLocation": "https://crates.io/crates/futures/0.3.34", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT OR Apache-2.0", + "licenseDeclared": "MIT OR Apache-2.0", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "9a31d2a3fbaaeb2af2368bbdd904aa8e812d3c04a1ee10d3171f52d556e5d0a3" + } + ], + "description": "An implementation of futures and streams featuring zero allocations,\ncomposability, and iterator-like interfaces.", + "supplier": "Organization: rust-lang", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/futures@0.3.34" + } + ] + }, + { + "SPDXID": "SPDXRef-thiserror-2.0.21", + "name": "thiserror", + "versionInfo": "2.0.21", + "downloadLocation": "https://crates.io/crates/thiserror/2.0.21", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT OR Apache-2.0", + "licenseDeclared": "MIT OR Apache-2.0", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "09e52cb86a36cede5cb101bf8908837b3e4c6e5e59fe7fd85c23fb56200d189e" + } + ], + "description": "derive(Error)", + "supplier": "Organization: dtolnay", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/thiserror@2.0.21" + } + ] + }, + { + "SPDXID": "SPDXRef-thiserror-impl-2.0.21", + "name": "thiserror-impl", + "versionInfo": "2.0.21", + "downloadLocation": "https://crates.io/crates/thiserror-impl/2.0.21", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT OR Apache-2.0", + "licenseDeclared": "MIT OR Apache-2.0", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "fe5197923287db20a58125f0bc85c062f7f2c892de97b18c356f9efb14b28524" + } + ], + "description": "Implementation detail of the `thiserror` crate", + "supplier": "Organization: dtolnay", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/thiserror-impl@2.0.21" + } + ] + }, + { + "SPDXID": "SPDXRef-paste-1.0.15", + "name": "paste", + "versionInfo": "1.0.15", + "downloadLocation": "https://crates.io/crates/paste/1.0.15", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT OR Apache-2.0", + "licenseDeclared": "MIT OR Apache-2.0", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + } + ], + "description": "Macros for all your token pasting needs", + "supplier": "Organization: dtolnay", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/paste@1.0.15" + } + ] + }, + { + "SPDXID": "SPDXRef-iceoryx2-pal-concurrency-sync-qnx8-0.7.0", + "name": "iceoryx2-pal-concurrency-sync-qnx8", + "versionInfo": "0.7.0", + "downloadLocation": "https://crates.io/crates/iceoryx2-pal-concurrency-sync-qnx8/0.7.0", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT OR Apache-2.0", + "licenseDeclared": "MIT OR Apache-2.0", + "copyrightText": "NOASSERTION", + "description": "iceoryx2: [internal] low-level basic building blocks to implement posix mutex, condition variables etc.", + "supplier": "Organization: eclipse-iceoryx", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/iceoryx2-pal-concurrency-sync-qnx8@0.7.0" + } + ] + }, + { + "SPDXID": "SPDXRef-iceoryx2-bb-elementary-traits-qnx8-0.7.0", + "name": "iceoryx2-bb-elementary-traits-qnx8", + "versionInfo": "0.7.0", + "downloadLocation": "https://crates.io/crates/iceoryx2-bb-elementary-traits-qnx8/0.7.0", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT OR Apache-2.0", + "licenseDeclared": "MIT OR Apache-2.0", + "copyrightText": "NOASSERTION", + "description": "iceoryx2: [internal] elementary traits that have (almost) no dependencies at all", + "supplier": "Organization: eclipse-iceoryx", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/iceoryx2-bb-elementary-traits-qnx8@0.7.0" + } + ] + }, + { + "SPDXID": "SPDXRef-iceoryx2-bb-elementary-qnx8-0.7.0", + "name": "iceoryx2-bb-elementary-qnx8", + "versionInfo": "0.7.0", + "downloadLocation": "https://crates.io/crates/iceoryx2-bb-elementary-qnx8/0.7.0", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT OR Apache-2.0", + "licenseDeclared": "MIT OR Apache-2.0", + "copyrightText": "NOASSERTION", + "description": "iceoryx2: [internal] elementary constructs that have (almost) no dependencies at all", + "supplier": "Organization: eclipse-iceoryx", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/iceoryx2-bb-elementary-qnx8@0.7.0" + } + ] + }, + { + "SPDXID": "SPDXRef-iceoryx2-bb-log-qnx8-0.7.0", + "name": "iceoryx2-bb-log-qnx8", + "versionInfo": "0.7.0", + "downloadLocation": "https://crates.io/crates/iceoryx2-bb-log-qnx8/0.7.0", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT OR Apache-2.0", + "licenseDeclared": "MIT OR Apache-2.0", + "copyrightText": "NOASSERTION", + "description": "iceoryx2: [internal] the logger", + "supplier": "Organization: eclipse-iceoryx", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/iceoryx2-bb-log-qnx8@0.7.0" + } + ] + }, + { + "SPDXID": "SPDXRef-iceoryx2-bb-derive-macros-qnx8-0.7.0", + "name": "iceoryx2-bb-derive-macros-qnx8", + "versionInfo": "0.7.0", + "downloadLocation": "https://crates.io/crates/iceoryx2-bb-derive-macros-qnx8/0.7.0", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT OR Apache-2.0", + "licenseDeclared": "MIT OR Apache-2.0", + "copyrightText": "NOASSERTION", + "description": "iceoryx2: [internal] helper derive proc-macros", + "supplier": "Organization: eclipse-iceoryx", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/iceoryx2-bb-derive-macros-qnx8@0.7.0" + } + ] + }, + { + "SPDXID": "SPDXRef-iceoryx2-bb-container-qnx8-0.7.0", + "name": "iceoryx2-bb-container-qnx8", + "versionInfo": "0.7.0", + "downloadLocation": "https://crates.io/crates/iceoryx2-bb-container-qnx8/0.7.0", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT OR Apache-2.0", + "licenseDeclared": "MIT OR Apache-2.0", + "copyrightText": "NOASSERTION", + "description": "iceoryx2: IPC shared memory compatible containers", + "supplier": "Organization: eclipse-iceoryx", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/iceoryx2-bb-container-qnx8@0.7.0" + } + ] + }, + { + "SPDXID": "SPDXRef-iceoryx2-bb-lock-free-qnx8-0.7.0", + "name": "iceoryx2-bb-lock-free-qnx8", + "versionInfo": "0.7.0", + "downloadLocation": "https://crates.io/crates/iceoryx2-bb-lock-free-qnx8/0.7.0", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT OR Apache-2.0", + "licenseDeclared": "MIT OR Apache-2.0", + "copyrightText": "NOASSERTION", + "description": "iceoryx2: [internal] lock-free containers and constructs", + "supplier": "Organization: eclipse-iceoryx", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/iceoryx2-bb-lock-free-qnx8@0.7.0" + } + ] + }, + { + "SPDXID": "SPDXRef-enum-iterator-derive-1.5.0", + "name": "enum-iterator-derive", + "versionInfo": "1.5.0", + "downloadLocation": "https://crates.io/crates/enum-iterator-derive/1.5.0", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "0BSD", + "licenseDeclared": "0BSD", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "685adfa4d6f3d765a26bc5dbc936577de9abf756c1feeb3089b01dd395034842" + } + ], + "description": "Procedural macro to derive Sequence", + "supplier": "Organization: stephaneyfx", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/enum-iterator-derive@1.5.0" + } + ] + }, + { + "SPDXID": "SPDXRef-enum-iterator-2.3.0", + "name": "enum-iterator", + "versionInfo": "2.3.0", + "downloadLocation": "https://crates.io/crates/enum-iterator/2.3.0", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "0BSD", + "licenseDeclared": "0BSD", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "a4549325971814bda7a44061bf3fe7e487d447cba01e4220a4b454d630d7a016" + } + ], + "description": "Tools to iterate over all values of a type (e.g. all variants of an enumeration)", + "supplier": "Organization: stephaneyfx", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/enum-iterator@2.3.0" + } + ] + }, + { + "SPDXID": "SPDXRef-iceoryx2-pal-configuration-qnx8-0.7.0", + "name": "iceoryx2-pal-configuration-qnx8", + "versionInfo": "0.7.0", + "downloadLocation": "https://crates.io/crates/iceoryx2-pal-configuration-qnx8/0.7.0", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT OR Apache-2.0", + "licenseDeclared": "MIT OR Apache-2.0", + "copyrightText": "NOASSERTION", + "description": "iceoryx2: [internal] platform specific settings", + "supplier": "Organization: eclipse-iceoryx", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/iceoryx2-pal-configuration-qnx8@0.7.0" + } + ] + }, + { + "SPDXID": "SPDXRef-bindgen-0.72.1", + "name": "bindgen", + "versionInfo": "0.72.1", + "downloadLocation": "https://crates.io/crates/bindgen/0.72.1", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "BSD-3-Clause", + "licenseDeclared": "BSD-3-Clause", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "993776b509cfb49c750f11b8f07a46fa23e0a1386ffc01fb1e7d343efc387895" + } + ], + "description": "Automatically generates Rust FFI bindings to C and C++ libraries.", + "supplier": "Organization: rust-lang", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/bindgen@0.72.1" + } + ] + }, + { + "SPDXID": "SPDXRef-bitflags-2.13.2", + "name": "bitflags", + "versionInfo": "2.13.2", + "downloadLocation": "https://crates.io/crates/bitflags/2.13.2", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT OR Apache-2.0", + "licenseDeclared": "MIT OR Apache-2.0", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "3ded4057c258ba199e2d26386d3af3780957ecaee6c4ef4041c6b4b8b97c0b06" + } + ], + "description": "A macro to generate structures which behave like bitflags.", + "supplier": "Organization: bitflags", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/bitflags@2.13.2" + } + ] + }, + { + "SPDXID": "SPDXRef-minimal-lexical-0.2.1", + "name": "minimal-lexical", + "versionInfo": "0.2.1", + "downloadLocation": "https://crates.io/crates/minimal-lexical/0.2.1", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT OR Apache-2.0", + "licenseDeclared": "MIT OR Apache-2.0", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + } + ], + "description": "Fast float parsing conversion routines.", + "supplier": "Organization: Alexhuszagh", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/minimal-lexical@0.2.1" + } + ] + }, + { + "SPDXID": "SPDXRef-nom-7.1.3", + "name": "nom", + "versionInfo": "7.1.3", + "downloadLocation": "https://crates.io/crates/nom/7.1.3", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT", + "licenseDeclared": "MIT", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" + } + ], + "description": "A byte-oriented, zero-copy, parser combinators library", + "supplier": "Organization: rust-bakery", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/nom@7.1.3" + } + ] + }, + { + "SPDXID": "SPDXRef-cexpr-0.6.0", + "name": "cexpr", + "versionInfo": "0.6.0", + "downloadLocation": "https://crates.io/crates/cexpr/0.6.0", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "Apache-2.0 OR MIT", + "licenseDeclared": "Apache-2.0 OR MIT", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" + } + ], + "description": "A C expression parser and evaluator", + "supplier": "Organization: jethrogb", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/cexpr@0.6.0" + } + ] + }, + { + "SPDXID": "SPDXRef-glob-0.3.4", + "name": "glob", + "versionInfo": "0.3.4", + "downloadLocation": "https://crates.io/crates/glob/0.3.4", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT OR Apache-2.0", + "licenseDeclared": "MIT OR Apache-2.0", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "e4eba85ea1d0a966a983acd07deee566e67395d2d96b6fb39e62b5a833f1eb0b" + } + ], + "description": "Support for matching file paths against Unix shell style patterns.", + "supplier": "Organization: rust-lang", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/glob@0.3.4" + } + ] + }, + { + "SPDXID": "SPDXRef-clang-sys-1.9.1", + "name": "clang-sys", + "versionInfo": "1.9.1", + "downloadLocation": "https://crates.io/crates/clang-sys/1.9.1", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "Apache-2.0", + "licenseDeclared": "Apache-2.0", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "157a8ba7b480713b56f4c09fd13fc3e0a22a5dfab8097ba61cbc5feef950788a" + } + ], + "description": "Rust bindings for libclang.", + "supplier": "Organization: KyleMayes", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/clang-sys@1.9.1" + } + ] + }, + { + "SPDXID": "SPDXRef-libloading-0.8.9", + "name": "libloading", + "versionInfo": "0.8.9", + "downloadLocation": "https://crates.io/crates/libloading/0.8.9", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "ISC", + "licenseDeclared": "ISC", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55" + } + ], + "description": "Bindings around the platform's dynamic library loading primitives with greatly improved memory safety.", + "supplier": "Organization: nagisa", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/libloading@0.8.9" + } + ] + }, + { + "SPDXID": "SPDXRef-either-1.19.0", + "name": "either", + "versionInfo": "1.19.0", + "downloadLocation": "https://crates.io/crates/either/1.19.0", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT OR Apache-2.0", + "licenseDeclared": "MIT OR Apache-2.0", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "0e9c71c2167ca323c882b99918929403426e2373ea17242ff5653e0d5e1058be" + } + ], + "description": "The enum `Either` with variants `Left` and `Right` is a general purpose sum type with two cases.", + "supplier": "Organization: rayon-rs", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/either@1.19.0" + } + ] + }, + { + "SPDXID": "SPDXRef-itertools-0.13.0", + "name": "itertools", + "versionInfo": "0.13.0", + "downloadLocation": "https://crates.io/crates/itertools/0.13.0", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT OR Apache-2.0", + "licenseDeclared": "MIT OR Apache-2.0", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" + } + ], + "description": "Extra iterator adaptors, iterator methods, free functions, and macros.", + "supplier": "Organization: rust-itertools", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/itertools@0.13.0" + } + ] + }, + { + "SPDXID": "SPDXRef-prettyplease-0.2.37", + "name": "prettyplease", + "versionInfo": "0.2.37", + "downloadLocation": "https://crates.io/crates/prettyplease/0.2.37", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT OR Apache-2.0", + "licenseDeclared": "MIT OR Apache-2.0", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" + } + ], + "description": "A minimal `syn` syntax tree pretty-printer", + "supplier": "Organization: dtolnay", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/prettyplease@0.2.37" + } + ] + }, + { + "SPDXID": "SPDXRef-regex-1.13.1", + "name": "regex", + "versionInfo": "1.13.1", + "downloadLocation": "https://crates.io/crates/regex/1.13.1", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT OR Apache-2.0", + "licenseDeclared": "MIT OR Apache-2.0", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d" + } + ], + "description": "An implementation of regular expressions for Rust. This implementation uses\nfinite automata and guarantees linear time matching on all inputs.", + "supplier": "Organization: rust-lang", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/regex@1.13.1" + } + ] + }, + { + "SPDXID": "SPDXRef-rustc-hash-2.1.3", + "name": "rustc-hash", + "versionInfo": "2.1.3", + "downloadLocation": "https://crates.io/crates/rustc-hash/2.1.3", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "Apache-2.0 OR MIT", + "licenseDeclared": "Apache-2.0 OR MIT", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "6b1e7f9a428571be2dc5bc0505c13fb6bf936822b894ec87abf8a08a4e51742d" + } + ], + "description": "A speedy, non-cryptographic hashing algorithm used by rustc", + "supplier": "Organization: rust-lang", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/rustc-hash@2.1.3" + } + ] + }, + { + "SPDXID": "SPDXRef-shlex-1.3.0", + "name": "shlex", + "versionInfo": "1.3.0", + "downloadLocation": "https://crates.io/crates/shlex/1.3.0", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT OR Apache-2.0", + "licenseDeclared": "MIT OR Apache-2.0", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" + } + ], + "description": "Split a string into shell words, like Python's shlex.", + "supplier": "Organization: comex", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/shlex@1.3.0" + } + ] + }, + { + "SPDXID": "SPDXRef-find-msvc-tools-0.1.14", + "name": "find-msvc-tools", + "versionInfo": "0.1.14", + "downloadLocation": "https://crates.io/crates/find-msvc-tools/0.1.14", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT OR Apache-2.0", + "licenseDeclared": "MIT OR Apache-2.0", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "aedcfb3409746eddb02b9e19ebda1c3394f759a152e48ee875a0844d1b955484" + } + ], + "description": "Find windows-specific tools, read MSVC versions from the registry and from COM interfaces", + "supplier": "Organization: rust-lang", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/find-msvc-tools@0.1.14" + } + ] + }, + { + "SPDXID": "SPDXRef-cc-1.8.0", + "name": "cc", + "versionInfo": "1.8.0", + "downloadLocation": "https://crates.io/crates/cc/1.8.0", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT OR Apache-2.0", + "licenseDeclared": "MIT OR Apache-2.0", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "6651c9ed80effdc7db0ff72512157f901af5e3549e341e24b1dd4887d836d838" + } + ], + "description": "A build-time dependency for Cargo build scripts to assist in invoking the native\nC compiler to compile native C code into a static archive to be linked into Rust\ncode.", + "supplier": "Organization: rust-lang", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/cc@1.8.0" + } + ] + }, + { + "SPDXID": "SPDXRef-iceoryx2-pal-posix-qnx8-0.7.0", + "name": "iceoryx2-pal-posix-qnx8", + "versionInfo": "0.7.0", + "downloadLocation": "https://crates.io/crates/iceoryx2-pal-posix-qnx8/0.7.0", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT OR Apache-2.0", + "licenseDeclared": "MIT OR Apache-2.0", + "copyrightText": "NOASSERTION", + "description": "iceoryx2: [internal] A posix layer that ensures uniform posix behavior on all platforms according to https://posix.opengroup.org", + "supplier": "Organization: eclipse-iceoryx", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/iceoryx2-pal-posix-qnx8@0.7.0" + } + ] + }, + { + "SPDXID": "SPDXRef-iceoryx2-bb-system-types-qnx8-0.7.0", + "name": "iceoryx2-bb-system-types-qnx8", + "versionInfo": "0.7.0", + "downloadLocation": "https://crates.io/crates/iceoryx2-bb-system-types-qnx8/0.7.0", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT OR Apache-2.0", + "licenseDeclared": "MIT OR Apache-2.0", + "copyrightText": "NOASSERTION", + "description": "iceoryx2: [internal] strong types that represents low level constructs like file, path, ip address, etc...", + "supplier": "Organization: eclipse-iceoryx", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/iceoryx2-bb-system-types-qnx8@0.7.0" + } + ] + }, + { + "SPDXID": "SPDXRef-tiny-fn-0.1.9", + "name": "tiny-fn", + "versionInfo": "0.1.9", + "downloadLocation": "https://crates.io/crates/tiny-fn/0.1.9", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT OR Apache-2.0", + "licenseDeclared": "MIT OR Apache-2.0", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "9659b108631d1e1cf3e8e489f894bee40bc9d68fd6cc67ec4d4ce9b72d565228" + } + ], + "description": "Type erased closures on stack", + "supplier": "Organization: zakarumych", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/tiny-fn@0.1.9" + } + ] + }, + { + "SPDXID": "SPDXRef-iceoryx2-bb-posix-qnx8-0.7.0", + "name": "iceoryx2-bb-posix-qnx8", + "versionInfo": "0.7.0", + "downloadLocation": "https://crates.io/crates/iceoryx2-bb-posix-qnx8/0.7.0", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT OR Apache-2.0", + "licenseDeclared": "MIT OR Apache-2.0", + "copyrightText": "NOASSERTION", + "description": "iceoryx2: [internal] high level safe abstractions for low level unsafe posix constructs", + "supplier": "Organization: eclipse-iceoryx", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/iceoryx2-bb-posix-qnx8@0.7.0" + } + ] + }, + { + "SPDXID": "SPDXRef-iceoryx2-bb-memory-qnx8-0.7.0", + "name": "iceoryx2-bb-memory-qnx8", + "versionInfo": "0.7.0", + "downloadLocation": "https://crates.io/crates/iceoryx2-bb-memory-qnx8/0.7.0", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT OR Apache-2.0", + "licenseDeclared": "MIT OR Apache-2.0", + "copyrightText": "NOASSERTION", + "description": "iceoryx2: [internal] allocators and tools for memory management", + "supplier": "Organization: eclipse-iceoryx", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/iceoryx2-bb-memory-qnx8@0.7.0" + } + ] + }, + { + "SPDXID": "SPDXRef-iceoryx2-pal-testing-qnx8-0.7.0", + "name": "iceoryx2-pal-testing-qnx8", + "versionInfo": "0.7.0", + "downloadLocation": "https://crates.io/crates/iceoryx2-pal-testing-qnx8/0.7.0", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT OR Apache-2.0", + "licenseDeclared": "MIT OR Apache-2.0", + "copyrightText": "NOASSERTION", + "description": "iceoryx2: [internal] simple testing primitives", + "supplier": "Organization: eclipse-iceoryx", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/iceoryx2-pal-testing-qnx8@0.7.0" + } + ] + }, + { + "SPDXID": "SPDXRef-iceoryx2-bb-testing-qnx8-0.7.0", + "name": "iceoryx2-bb-testing-qnx8", + "versionInfo": "0.7.0", + "downloadLocation": "https://crates.io/crates/iceoryx2-bb-testing-qnx8/0.7.0", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT OR Apache-2.0", + "licenseDeclared": "MIT OR Apache-2.0", + "copyrightText": "NOASSERTION", + "description": "iceoryx2: [internal] testing primitives", + "supplier": "Organization: eclipse-iceoryx", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/iceoryx2-bb-testing-qnx8@0.7.0" + } + ] + }, + { + "SPDXID": "SPDXRef-iceoryx2-bb-threadsafe-qnx8-0.7.0", + "name": "iceoryx2-bb-threadsafe-qnx8", + "versionInfo": "0.7.0", + "downloadLocation": "https://crates.io/crates/iceoryx2-bb-threadsafe-qnx8/0.7.0", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT OR Apache-2.0", + "licenseDeclared": "MIT OR Apache-2.0", + "copyrightText": "NOASSERTION", + "description": "iceoryx2: [internal] threadsafe non-lock-free containers and constructs", + "supplier": "Organization: eclipse-iceoryx", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/iceoryx2-bb-threadsafe-qnx8@0.7.0" + } + ] + }, + { + "SPDXID": "SPDXRef-score-kyron-0.0.0", + "name": "score_kyron", + "versionInfo": "0.0.0", + "downloadLocation": "NOASSERTION", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "NOASSERTION", + "licenseDeclared": "NOASSERTION", + "copyrightText": "NOASSERTION", + "description": "Missing", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:generic/score_kyron@0.0.0" + } + ] + }, + { + "SPDXID": "SPDXRef-byteorder-1.5.0", + "name": "byteorder", + "versionInfo": "1.5.0", + "downloadLocation": "https://crates.io/crates/byteorder/1.5.0", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "Unlicense OR MIT", + "licenseDeclared": "Unlicense OR MIT", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + } + ], + "description": "Library for reading/writing numbers in big-endian and little-endian.", + "supplier": "Organization: BurntSushi", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/byteorder@1.5.0" + } + ] + }, + { + "SPDXID": "SPDXRef-cdr-0.2.4", + "name": "cdr", + "versionInfo": "0.2.4", + "downloadLocation": "https://crates.io/crates/cdr/0.2.4", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT OR Apache-2.0", + "licenseDeclared": "MIT OR Apache-2.0", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "9617422bf43fde9280707a7e90f8f7494389c182f5c70b0f67592d0f06d41dfa" + } + ], + "description": "A serialization/deserialization implementation of Common Data Representation", + "supplier": "Organization: hrektts", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/cdr@0.2.4" + } + ] + }, + { + "SPDXID": "SPDXRef-iceoryx2-pal-os-api-qnx8-0.7.0", + "name": "iceoryx2-pal-os-api-qnx8", + "versionInfo": "0.7.0", + "downloadLocation": "https://crates.io/crates/iceoryx2-pal-os-api-qnx8/0.7.0", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "NOASSERTION", + "licenseDeclared": "NOASSERTION", + "copyrightText": "NOASSERTION", + "description": "iceoryx2: [internal] OS api layer for OS specific features", + "supplier": "Organization: eclipse-iceoryx", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/iceoryx2-pal-os-api-qnx8@0.7.0" + } + ] + }, + { + "SPDXID": "SPDXRef-iceoryx2-bb-linux-qnx8-0.7.0", + "name": "iceoryx2-bb-linux-qnx8", + "versionInfo": "0.7.0", + "downloadLocation": "https://crates.io/crates/iceoryx2-bb-linux-qnx8/0.7.0", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "NOASSERTION", + "licenseDeclared": "NOASSERTION", + "copyrightText": "NOASSERTION", + "description": "iceoryx2: [internal] high level safe abstractions for low level unsafe linux constructs", + "supplier": "Organization: eclipse-iceoryx", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/iceoryx2-bb-linux-qnx8@0.7.0" + } + ] + }, + { + "SPDXID": "SPDXRef-cobs-0.3.0", + "name": "cobs", + "versionInfo": "0.3.0", + "downloadLocation": "https://crates.io/crates/cobs/0.3.0", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT OR Apache-2.0", + "licenseDeclared": "MIT OR Apache-2.0", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "0fa961b519f0b462e3a3b4a34b64d119eeaca1d59af726fe450bbba07a9fc0a1" + } + ], + "description": "This is an implementation of the Consistent Overhead Byte Stuffing (COBS) algorithm.\n COBS is an algorithm for transforming a message into an encoding where a specific value\n (the \"sentinel\" value) is not used. This value can then be used to mark frame boundaries\n in a serial communication channel.", + "supplier": "Organization: jamesmunns", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/cobs@0.3.0" + } + ] + }, + { + "SPDXID": "SPDXRef-hash32-0.2.1", + "name": "hash32", + "versionInfo": "0.2.1", + "downloadLocation": "https://crates.io/crates/hash32/0.2.1", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT OR Apache-2.0", + "licenseDeclared": "MIT OR Apache-2.0", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "b0c35f58762feb77d74ebe43bdbc3210f09be9fe6742234d573bacc26ed92b67" + } + ], + "description": "32-bit hashing algorithms", + "supplier": "Organization: rust-embedded-community", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/hash32@0.2.1" + } + ] + }, + { + "SPDXID": "SPDXRef-semver-1.0.28", + "name": "semver", + "versionInfo": "1.0.28", + "downloadLocation": "https://crates.io/crates/semver/1.0.28", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT OR Apache-2.0", + "licenseDeclared": "MIT OR Apache-2.0", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" + } + ], + "description": "Parser and evaluator for Cargo's flavor of Semantic Versioning", + "supplier": "Organization: dtolnay", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/semver@1.0.28" + } + ] + }, + { + "SPDXID": "SPDXRef-rustc-version-0.4.1", + "name": "rustc-version", + "versionInfo": "0.4.1", + "downloadLocation": "https://crates.io/crates/rustc-version/0.4.1", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT OR Apache-2.0", + "licenseDeclared": "MIT OR Apache-2.0", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" + } + ], + "description": "A library for querying the version of a installed rustc compiler", + "supplier": "Organization: djc", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/rustc-version@0.4.1" + } + ] + }, + { + "SPDXID": "SPDXRef-heapless-0.7.17", + "name": "heapless", + "versionInfo": "0.7.17", + "downloadLocation": "https://crates.io/crates/heapless/0.7.17", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT OR Apache-2.0", + "licenseDeclared": "MIT OR Apache-2.0", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "cdc6457c0eb62c71aac4bc17216026d8410337c4126773b9c5daba343f17964f" + } + ], + "description": "`static` friendly data structures that don't require dynamic memory allocation", + "supplier": "Organization: rust-embedded", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/heapless@0.7.17" + } + ] + }, + { + "SPDXID": "SPDXRef-scopeguard-1.2.0", + "name": "scopeguard", + "versionInfo": "1.2.0", + "downloadLocation": "https://crates.io/crates/scopeguard/1.2.0", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT OR Apache-2.0", + "licenseDeclared": "MIT OR Apache-2.0", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + } + ], + "description": "A RAII scope guard that will run a given closure when it goes out of scope,\neven if the code between panics (assuming unwinding panic).\n\nDefines the macros `defer!`, `defer_on_unwind!`, `defer_on_success!` as\nshorthands for guards with one of the implemented strategies.", + "supplier": "Organization: bluss", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/scopeguard@1.2.0" + } + ] + }, + { + "SPDXID": "SPDXRef-lock-api-0.4.14", + "name": "lock-api", + "versionInfo": "0.4.14", + "downloadLocation": "https://crates.io/crates/lock-api/0.4.14", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT OR Apache-2.0", + "licenseDeclared": "MIT OR Apache-2.0", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" + } + ], + "description": "Wrappers to create fully-featured Mutex and RwLock types. Compatible with no_std.", + "supplier": "Organization: Amanieu", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/lock-api@0.4.14" + } + ] + }, + { + "SPDXID": "SPDXRef-spin-0.9.9", + "name": "spin", + "versionInfo": "0.9.9", + "downloadLocation": "https://crates.io/crates/spin/0.9.9", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT", + "licenseDeclared": "MIT", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "3763264f6b73151db08c50ff20d7d8a0b8796e021cdea7ceedad07b80155fa0e" + } + ], + "description": "Spin-based synchronization primitives", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/spin@0.9.9" + } + ] + }, + { + "SPDXID": "SPDXRef-postcard-derive-0.2.2", + "name": "postcard-derive", + "versionInfo": "0.2.2", + "downloadLocation": "https://crates.io/crates/postcard-derive/0.2.2", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT OR Apache-2.0", + "licenseDeclared": "MIT OR Apache-2.0", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "e0232bd009a197ceec9cc881ba46f727fcd8060a2d8d6a9dde7a69030a6fe2bb" + } + ], + "description": "A no_std + serde compatible message library for Rust - Derive Crate", + "supplier": "Organization: jamesmunns", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/postcard-derive@0.2.2" + } + ] + }, + { + "SPDXID": "SPDXRef-postcard-1.1.3", + "name": "postcard", + "versionInfo": "1.1.3", + "downloadLocation": "https://crates.io/crates/postcard/1.1.3", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT OR Apache-2.0", + "licenseDeclared": "MIT OR Apache-2.0", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "6764c3b5dd454e283a30e6dfe78e9b31096d9e32036b5d1eaac7a6119ccb9a24" + } + ], + "description": "A no_std + serde compatible message library for Rust", + "supplier": "Organization: jamesmunns", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/postcard@1.1.3" + } + ] + }, + { + "SPDXID": "SPDXRef-sha1-smol-1.0.1", + "name": "sha1-smol", + "versionInfo": "1.0.1", + "downloadLocation": "https://crates.io/crates/sha1-smol/1.0.1", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "BSD-3-Clause", + "licenseDeclared": "BSD-3-Clause", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "bbfa15b3dddfee50a0fff136974b3e1bde555604ba463834a7eb7deb6417705d" + } + ], + "description": "Minimal dependency-free implementation of SHA1 for Rust.", + "supplier": "Organization: mitsuhiko", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/sha1-smol@1.0.1" + } + ] + }, + { + "SPDXID": "SPDXRef-serde-spanned-0.6.9", + "name": "serde-spanned", + "versionInfo": "0.6.9", + "downloadLocation": "https://crates.io/crates/serde-spanned/0.6.9", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT OR Apache-2.0", + "licenseDeclared": "MIT OR Apache-2.0", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" + } + ], + "description": "Serde-compatible spanned Value", + "supplier": "Organization: toml-rs", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/serde-spanned@0.6.9" + } + ] + }, + { + "SPDXID": "SPDXRef-toml-datetime-0.6.11", + "name": "toml-datetime", + "versionInfo": "0.6.11", + "downloadLocation": "https://crates.io/crates/toml-datetime/0.6.11", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT OR Apache-2.0", + "licenseDeclared": "MIT OR Apache-2.0", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" + } + ], + "description": "A TOML-compatible datetime type", + "supplier": "Organization: toml-rs", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/toml-datetime@0.6.11" + } + ] + }, + { + "SPDXID": "SPDXRef-equivalent-1.0.2", + "name": "equivalent", + "versionInfo": "1.0.2", + "downloadLocation": "https://crates.io/crates/equivalent/1.0.2", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "Apache-2.0 OR MIT", + "licenseDeclared": "Apache-2.0 OR MIT", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + } + ], + "description": "Traits for key comparison in maps.", + "supplier": "Organization: indexmap-rs", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/equivalent@1.0.2" + } + ] + }, + { + "SPDXID": "SPDXRef-allocator-api2-0.2.21", + "name": "allocator-api2", + "versionInfo": "0.2.21", + "downloadLocation": "https://crates.io/crates/allocator-api2/0.2.21", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT OR Apache-2.0", + "licenseDeclared": "MIT OR Apache-2.0", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + } + ], + "description": "Mirror of Rust's allocator API", + "supplier": "Organization: zakarumych", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/allocator-api2@0.2.21" + } + ] + }, + { + "SPDXID": "SPDXRef-foldhash-0.2.0", + "name": "foldhash", + "versionInfo": "0.2.0", + "downloadLocation": "https://crates.io/crates/foldhash/0.2.0", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "Zlib", + "licenseDeclared": "Zlib", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" + } + ], + "description": "A fast, non-cryptographic, minimally DoS-resistant hashing algorithm.", + "supplier": "Organization: orlp", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/foldhash@0.2.0" + } + ] + }, + { + "SPDXID": "SPDXRef-hashbrown-0.17.1", + "name": "hashbrown", + "versionInfo": "0.17.1", + "downloadLocation": "https://crates.io/crates/hashbrown/0.17.1", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT OR Apache-2.0", + "licenseDeclared": "MIT OR Apache-2.0", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" + } + ], + "description": "A Rust port of Google's SwissTable hash map", + "supplier": "Organization: rust-lang", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/hashbrown@0.17.1" + } + ] + }, + { + "SPDXID": "SPDXRef-indexmap-2.14.2", + "name": "indexmap", + "versionInfo": "2.14.2", + "downloadLocation": "https://crates.io/crates/indexmap/2.14.2", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "Apache-2.0 OR MIT", + "licenseDeclared": "Apache-2.0 OR MIT", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "cc4e190f5d26ca7051642629da2c52fc03bde85a03197c99408dcd291734c855" + } + ], + "description": "A hash table with consistent order and fast iteration.", + "supplier": "Organization: indexmap-rs", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/indexmap@2.14.2" + } + ] + }, + { + "SPDXID": "SPDXRef-toml-write-0.1.2", + "name": "toml-write", + "versionInfo": "0.1.2", + "downloadLocation": "https://crates.io/crates/toml-write/0.1.2", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT OR Apache-2.0", + "licenseDeclared": "MIT OR Apache-2.0", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" + } + ], + "description": "A low-level interface for writing out TOML", + "supplier": "Organization: toml-rs", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/toml-write@0.1.2" + } + ] + }, + { + "SPDXID": "SPDXRef-winnow-0.7.15", + "name": "winnow", + "versionInfo": "0.7.15", + "downloadLocation": "https://crates.io/crates/winnow/0.7.15", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "NOASSERTION", + "licenseDeclared": "NOASSERTION", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945" + } + ], + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/winnow@0.7.15" + } + ] + }, + { + "SPDXID": "SPDXRef-toml-edit-0.22.27", + "name": "toml-edit", + "versionInfo": "0.22.27", + "downloadLocation": "https://crates.io/crates/toml-edit/0.22.27", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT OR Apache-2.0", + "licenseDeclared": "MIT OR Apache-2.0", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" + } + ], + "description": "Yet another format-preserving TOML parser.", + "supplier": "Organization: toml-rs", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/toml-edit@0.22.27" + } + ] + }, + { + "SPDXID": "SPDXRef-toml-0.8.23", + "name": "toml", + "versionInfo": "0.8.23", + "downloadLocation": "https://crates.io/crates/toml/0.8.23", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT OR Apache-2.0", + "licenseDeclared": "MIT OR Apache-2.0", + "copyrightText": "NOASSERTION", + "checksums": [ + { + "algorithm": "SHA256", + "checksumValue": "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" + } + ], + "description": "A native Rust encoder and decoder of TOML-formatted files and streams. Provides\nimplementations of the standard Serialize/Deserialize traits for TOML data to\nfacilitate deserializing and serializing Rust structures.", + "supplier": "Organization: toml-rs", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/toml@0.8.23" + } + ] + }, + { + "SPDXID": "SPDXRef-iceoryx2-cal-qnx8-0.7.0", + "name": "iceoryx2-cal-qnx8", + "versionInfo": "0.7.0", + "downloadLocation": "https://crates.io/crates/iceoryx2-cal-qnx8/0.7.0", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT OR Apache-2.0", + "licenseDeclared": "MIT OR Apache-2.0", + "copyrightText": "NOASSERTION", + "description": "iceoryx2: [internal] high-level traits and implementations that represents OS primitives in an exchangeable fashion", + "supplier": "Organization: eclipse-iceoryx", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/iceoryx2-cal-qnx8@0.7.0" + } + ] + }, + { + "SPDXID": "SPDXRef-iceoryx2-qnx8-0.7.0", + "name": "iceoryx2-qnx8", + "versionInfo": "0.7.0", + "downloadLocation": "https://crates.io/crates/iceoryx2-qnx8/0.7.0", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "MIT OR Apache-2.0", + "licenseDeclared": "MIT OR Apache-2.0", + "copyrightText": "NOASSERTION", + "description": "iceoryx2: Lock-Free Zero-Copy Interprocess Communication", + "supplier": "Organization: eclipse-iceoryx", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:cargo/iceoryx2-qnx8@0.7.0" + } + ] + }, + { + "SPDXID": "SPDXRef-score-lifecycle-unknown", + "name": "score_lifecycle", + "versionInfo": "unknown", + "downloadLocation": "NOASSERTION", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "NOASSERTION", + "licenseDeclared": "NOASSERTION", + "copyrightText": "NOASSERTION", + "description": "Missing", + "supplier": "Organization: Eclipse Foundation", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:github/eclipse-score/score_lifecycle@unknown" + } + ] + }, + { + "SPDXID": "SPDXRef-score-logging-0.0.0", + "name": "score_logging", + "versionInfo": "0.0.0", + "downloadLocation": "NOASSERTION", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "NOASSERTION", + "licenseDeclared": "NOASSERTION", + "copyrightText": "NOASSERTION", + "description": "Missing", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:generic/score_logging@0.0.0" + } + ] + }, + { + "SPDXID": "SPDXRef-score-time-unknown", + "name": "score_time", + "versionInfo": "unknown", + "downloadLocation": "NOASSERTION", + "primaryPackagePurpose": "LIBRARY", + "filesAnalyzed": false, + "licenseConcluded": "NOASSERTION", + "licenseDeclared": "NOASSERTION", + "copyrightText": "NOASSERTION", + "description": "Missing", + "supplier": "Organization: Eclipse Foundation", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:github/eclipse-score/score_time@unknown" + } + ] + } + ], + "relationships": [ + { + "spdxElementId": "SPDXRef-DOCUMENT", + "relationshipType": "DESCRIBES", + "relatedSpdxElement": "SPDXRef-RootPackage" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-score-baselibs-unknown" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-score-persistency-unknown" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-nlohmann-json-unknown" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-score-test-scenarios-unknown" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-serde-1.0.229" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-serde-core-1.0.229" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-proc-macro2-1.0.107" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-unicode-ident-1.0.26" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-quote-1.0.47" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-syn-3.0.8" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-serde-derive-1.0.229" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-itoa-1.0.18" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-memchr-2.8.3" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-serde-json-1.0.154" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-zmij-1.0.23" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-pin-project-lite-0.2.17" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-once-cell-1.21.4" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-tracing-core-0.1.36" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-tracing-attributes-0.1.31" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-tracing-0.1.44" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-aho-corasick-1.1.5" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-regex-syntax-0.8.11" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-regex-automata-0.4.18" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-matchers-0.2.0" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-nu-ansi-term-0.50.3" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-lazy-static-1.5.1" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-sharded-slab-0.1.7" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-smallvec-1.16.3" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-cfg-if-1.0.5" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-thread-local-1.1.10" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-log-0.4.34" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-tracing-log-0.2.0" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-tracing-serde-0.2.0" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-tracing-subscriber-0.3.23" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-adler32-1.2.0" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-tinyjson-2.5.1" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-anyhow-1.0.104" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-anstyle-1.0.14" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-utf8parse-0.2.2" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-anstyle-parse-1.0.0" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-anstyle-query-1.1.5" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-colorchoice-1.0.5" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-is-terminal-polyfill-1.70.2" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-anstream-1.0.0" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-clap-lex-1.1.1" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-strsim-0.11.1" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-clap-builder-4.6.7" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-heck-0.5.0" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-clap-derive-4.6.7" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-clap-4.6.7" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-libc-0.2.186" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-unicode-width-0.2.2" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-console-0.15.11" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-portable-atomic-1.15.0" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-unit-prefix-0.5.2" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-indicatif-0.18.6" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-writeable-0.6.4" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-stable-deref-trait-1.2.1" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-synstructure-0.14.0" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-zerofrom-derive-0.1.8" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-zerofrom-0.1.8" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-yoke-derive-0.8.4" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-yoke-0.8.3" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-zerovec-derive-0.11.6" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-zerovec-0.11.8" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-potential-utf-0.1.6" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-utf8-iter-1.0.4" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-displaydoc-0.2.7" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-icu-collections-2.3.0" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-litemap-0.8.3" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-tinystr-0.8.4" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-icu-locale-core-2.3.0" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-icu-locale-fallback-data-2.3.0" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-zerotrie-0.2.5" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-icu-provider-2.3.1" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-icu-locale-fallback-2.3.0" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-icu-segmenter-data-2.3.0" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-icu-segmenter-2.3.0" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-smawk-0.3.3" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-textwrap-0.16.4" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-zeroize-derive-1.5.0" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-zeroize-1.9.1" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-cliclack-0.3.8" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-score-communication-unknown" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-boost.config-1.83.0.bcr.4" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-boost.assert-1.83.0.bcr.4" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-boost.mp11-1.83.0.bcr.4" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-boost.describe-1.83.0.bcr.4" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-boost.static-assert-1.83.0.bcr.4" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-boost.type-traits-1.83.0.bcr.4" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-boost.container-hash-1.83.0.bcr.4" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-boost.move-1.83.0.bcr.4" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-boost.intrusive-1.83.0.bcr.4" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-boost.container-1.83.0.bcr.4" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-boost.throw-exception-1.83.0.bcr.4" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-boost.core-1.83.0.bcr.4" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-boost.predef-1.83.0.bcr.4" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-boost.preprocessor-1.83.0.bcr.4" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-boost.tuple-1.83.0.bcr.4" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-boost.unordered-1.83.0.bcr.4" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-boost.winapi-1.83.0.bcr.4" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-boost.interprocess-1.83.0.bcr.4" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-score-baselibs-repo-rulesacl-deb-unknown" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-futures-core-0.3.34" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-futures-sink-0.3.34" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-futures-channel-0.3.34" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-futures-task-0.3.34" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-futures-io-0.3.34" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-slab-0.4.12" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-futures-macro-0.3.34" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-futures-util-0.3.34" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-futures-executor-0.3.34" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-futures-0.3.34" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-thiserror-2.0.21" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-thiserror-impl-2.0.21" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-paste-1.0.15" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-iceoryx2-pal-concurrency-sync-qnx8-0.7.0" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-iceoryx2-bb-elementary-traits-qnx8-0.7.0" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-iceoryx2-bb-elementary-qnx8-0.7.0" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-iceoryx2-bb-log-qnx8-0.7.0" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-iceoryx2-bb-derive-macros-qnx8-0.7.0" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-iceoryx2-bb-container-qnx8-0.7.0" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-iceoryx2-bb-lock-free-qnx8-0.7.0" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-enum-iterator-derive-1.5.0" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-enum-iterator-2.3.0" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-iceoryx2-pal-configuration-qnx8-0.7.0" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-bindgen-0.72.1" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-bitflags-2.13.2" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-minimal-lexical-0.2.1" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-nom-7.1.3" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-cexpr-0.6.0" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-glob-0.3.4" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-clang-sys-1.9.1" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-libloading-0.8.9" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-either-1.19.0" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-itertools-0.13.0" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-prettyplease-0.2.37" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-regex-1.13.1" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-rustc-hash-2.1.3" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-shlex-1.3.0" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-find-msvc-tools-0.1.14" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-cc-1.8.0" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-iceoryx2-pal-posix-qnx8-0.7.0" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-iceoryx2-bb-system-types-qnx8-0.7.0" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-tiny-fn-0.1.9" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-iceoryx2-bb-posix-qnx8-0.7.0" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-iceoryx2-bb-memory-qnx8-0.7.0" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-iceoryx2-pal-testing-qnx8-0.7.0" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-iceoryx2-bb-testing-qnx8-0.7.0" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-iceoryx2-bb-threadsafe-qnx8-0.7.0" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-score-kyron-0.0.0" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-byteorder-1.5.0" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-cdr-0.2.4" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-iceoryx2-pal-os-api-qnx8-0.7.0" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-iceoryx2-bb-linux-qnx8-0.7.0" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-cobs-0.3.0" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-hash32-0.2.1" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-semver-1.0.28" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-rustc-version-0.4.1" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-heapless-0.7.17" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-scopeguard-1.2.0" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-lock-api-0.4.14" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-spin-0.9.9" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-postcard-derive-0.2.2" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-postcard-1.1.3" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-sha1-smol-1.0.1" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-serde-spanned-0.6.9" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-toml-datetime-0.6.11" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-equivalent-1.0.2" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-allocator-api2-0.2.21" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-foldhash-0.2.0" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-hashbrown-0.17.1" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-indexmap-2.14.2" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-toml-write-0.1.2" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-winnow-0.7.15" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-toml-edit-0.22.27" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-toml-0.8.23" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-iceoryx2-cal-qnx8-0.7.0" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-iceoryx2-qnx8-0.7.0" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-score-lifecycle-unknown" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-score-logging-0.0.0" + }, + { + "spdxElementId": "SPDXRef-RootPackage", + "relationshipType": "DEPENDS_ON", + "relatedSpdxElement": "SPDXRef-score-time-unknown" + } + ] +} \ No newline at end of file diff --git a/tck/runner/Cargo.toml b/tck/runner/Cargo.toml new file mode 100644 index 00000000000..18ddfb496a0 --- /dev/null +++ b/tck/runner/Cargo.toml @@ -0,0 +1,29 @@ +[package] +name = "score-tck" +version = "0.1.0" +edition = "2021" +description = "s-core Test Compatibility Kit - verify SCORE distribution compatibility" +license = "Apache-2.0" +repository = "https://github.com/eclipse-score/reference_integration" + +[[bin]] +name = "score-tck" +path = "src/main.rs" + +[lib] +name = "score_tck" +path = "src/lib.rs" + +[dependencies] +clap = { version = "4", features = ["derive"] } +serde = { version = "1", features = ["derive"] } +serde_json = "1" +anyhow = "1" + +[dev-dependencies] +tempfile = "3" + +[profile.release] +opt-level = "s" # Optimize for size +lto = true # Link-time optimization +strip = true # Strip symbols diff --git a/tck/runner/src/config.rs b/tck/runner/src/config.rs new file mode 100644 index 00000000000..2d44a3388bc --- /dev/null +++ b/tck/runner/src/config.rs @@ -0,0 +1,146 @@ +// ******************************************************************************* +// Copyright (c) 2026 Contributors to the Eclipse Foundation +// +// See the NOTICE file(s) distributed with this work for additional +// information regarding copyright ownership. +// +// This program and the accompanying materials are made available under the +// terms of the Apache License Version 2.0 which is available at +// +// +// SPDX-License-Identifier: Apache-2.0 +// ******************************************************************************* +//! Distribution configuration parsing + +use anyhow::{Context, Result}; +use std::path::PathBuf; + +/// Distribution configuration +#[derive(Debug)] +pub struct Config { + pub dist: DistConfig, + pub checks: ChecksConfig, +} + +#[derive(Debug)] +pub struct DistConfig { + pub name: String, + pub version: String, + pub arch: String, + pub profile: String, + pub platform_version: String, + pub paths: PathsConfig, +} + +#[derive(Debug)] +pub struct PathsConfig { + pub sbom_file: PathBuf, + pub headers_dir: Option, + pub libs_dir: Option, +} + +#[derive(Debug, Default)] +pub struct ChecksConfig { + pub enabled: Vec, +} + +/// Load a distribution configuration from a TOML file +pub fn load(path: &PathBuf) -> Result { + let content = + std::fs::read_to_string(path).with_context(|| format!("Failed to read config file: {}", path.display()))?; + let tables = + crate::toml::parse(&content).with_context(|| format!("Failed to parse config file: {}", path.display()))?; + let dist = tables.get("dist"); + let paths = tables.get("dist.paths"); + let checks = tables.get("checks"); + + Ok(Config { + dist: DistConfig { + name: get_string(dist, "name")?.unwrap_or_else(|| "unknown-distribution".to_string()), + version: get_string(dist, "version")?.unwrap_or_else(|| "unversioned".to_string()), + arch: get_string(dist, "arch")?.unwrap_or_else(|| "x86_64-linux".to_string()), + profile: get_string(dist, "profile")?.unwrap_or_else(|| "full".to_string()), + platform_version: get_string(dist, "platform_version")?.unwrap_or_else(|| "0.9.0".to_string()), + paths: PathsConfig { + sbom_file: PathBuf::from( + get_string(paths, "sbom_file")?.unwrap_or_else(|| "./sbom.spdx.json".to_string()), + ), + headers_dir: get_string(paths, "headers_dir")?.map(PathBuf::from), + libs_dir: get_string(paths, "libs_dir")?.map(PathBuf::from), + }, + }, + checks: ChecksConfig { + enabled: checks + .and_then(|table| table.get("enabled")) + .map(|value| crate::toml::string_array(value)) + .transpose()? + .unwrap_or_default(), + }, + }) +} + +fn get_string(table: Option<&std::collections::HashMap>, key: &str) -> Result> { + table + .and_then(|table| table.get(key)) + .map(|value| crate::toml::string(value)) + .transpose() +} + +#[cfg(test)] +mod tests { + use super::*; + use std::io::Write; + use tempfile::NamedTempFile; + + #[test] + fn test_load_config_minimal() { + let mut file = NamedTempFile::new().unwrap(); + writeln!(file, r#"[dist]"#).unwrap(); + writeln!(file, r#"name = "my-dist""#).unwrap(); + writeln!(file, r#"version = "2.0.0""#).unwrap(); + + let config = load(&file.path().to_path_buf()).unwrap(); + assert_eq!(config.dist.name, "my-dist"); + assert_eq!(config.dist.version, "2.0.0"); + } + + #[test] + fn test_load_config_with_platform_version() { + let mut file = NamedTempFile::new().unwrap(); + writeln!(file, r#"[dist]"#).unwrap(); + writeln!(file, r#"name = "test""#).unwrap(); + writeln!(file, r#"platform_version = "0.8.0" # older platform"#).unwrap(); + + let config = load(&file.path().to_path_buf()).unwrap(); + assert_eq!(config.dist.platform_version, "0.8.0"); + } + + #[test] + fn test_load_checks_and_nested_paths() { + let mut file = NamedTempFile::new().unwrap(); + writeln!(file, "[dist]").unwrap(); + writeln!(file, r#"name = "test""#).unwrap(); + writeln!(file, r#"profile = "minimal""#).unwrap(); + writeln!(file, "[dist.paths]").unwrap(); + writeln!(file, r#"sbom_file = "./sbom.json" # path"#).unwrap(); + writeln!(file, "[checks]").unwrap(); + writeln!(file, r#"enabled = ["sbom"]"#).unwrap(); + + let config = load(&file.path().to_path_buf()).unwrap(); + assert_eq!(config.dist.paths.sbom_file, PathBuf::from("./sbom.json")); + assert_eq!(config.checks.enabled, vec!["sbom"]); + } + + #[test] + fn test_invalid_toml_is_reported() { + let mut file = NamedTempFile::new().unwrap(); + writeln!(file, "[dist").unwrap(); + assert!(load(&file.path().to_path_buf()).is_err()); + } + + #[test] + fn test_load_config_file_not_found() { + let result = load(&PathBuf::from("/nonexistent/config.toml")); + assert!(result.is_err()); + } +} diff --git a/tck/runner/src/lib.rs b/tck/runner/src/lib.rs new file mode 100644 index 00000000000..28ab7d17a90 --- /dev/null +++ b/tck/runner/src/lib.rs @@ -0,0 +1,41 @@ +// ******************************************************************************* +// Copyright (c) 2026 Contributors to the Eclipse Foundation +// +// See the NOTICE file(s) distributed with this work for additional +// information regarding copyright ownership. +// +// This program and the accompanying materials are made available under the +// terms of the Apache License Version 2.0 which is available at +// +// +// SPDX-License-Identifier: Apache-2.0 +// ******************************************************************************* +//! s-core TCK - Test Compatibility Kit for SCORE Platform Distributions +//! +//! This library provides the core check implementations for verifying +//! SCORE distribution compatibility. +//! +//! # Check Families +//! +//! - **SBOM**: Validates required components, license policy, and drift from golden +//! - **Version**: Ensures platform version compatibility +//! - **Runtime**: Validates execution environment and test harness adapter +//! +//! # Porting Package Concept +//! +//! Inspired by Jakarta EE TCK, vendors configure a "test harness adapter" that +//! tells the TCK how to run tests against their distribution. This is the RPM +//! equivalent of Jakarta's porting package. + +pub mod config; +pub mod report; +pub mod runtime; +pub mod sbom; +pub(crate) mod toml; +pub mod version; + +pub use config::Config; +pub use report::{CheckReport, CheckResult, Report}; +pub use runtime::{RuntimeRequirements, ShowcaseResult, TestHarnessAdapter}; +pub use sbom::SBOMChecker; +pub use version::{load_policy as load_version_policy, VersionPolicy}; diff --git a/tck/runner/src/main.rs b/tck/runner/src/main.rs new file mode 100644 index 00000000000..855d702289d --- /dev/null +++ b/tck/runner/src/main.rs @@ -0,0 +1,316 @@ +// ******************************************************************************* +// Copyright (c) 2026 Contributors to the Eclipse Foundation +// +// See the NOTICE file(s) distributed with this work for additional +// information regarding copyright ownership. +// +// This program and the accompanying materials are made available under the +// terms of the Apache License Version 2.0 which is available at +// +// +// SPDX-License-Identifier: Apache-2.0 +// ******************************************************************************* +//! s-core TCK - Test Compatibility Kit for SCORE Platform Distributions +//! +//! This binary verifies whether a SCORE distribution is compatible with +//! the main platform requirements: SBOM policy, API surface, and behavioral +//! conformance. + +use anyhow::{bail, Context, Result}; +use clap::{Parser, Subcommand}; +use std::path::PathBuf; + +mod config; +mod report; +mod runtime; +mod sbom; +mod toml; +mod version; + +/// s-core Test Compatibility Kit +#[derive(Parser)] +#[command(name = "score-tck")] +#[command(author, version, about, long_about = None)] +struct Cli { + #[command(subcommand)] + command: Commands, +} + +#[derive(Subcommand)] +enum Commands { + /// Run TCK checks against a distribution + Run { + /// Path to distribution config file (tck.config.toml) + #[arg(short, long)] + config: PathBuf, + + /// Output directory for reports + #[arg(short, long, default_value = "./tck-report")] + report: PathBuf, + + /// Comma-separated list of checks to run (sbom,version,runtime) + #[arg(long)] + checks: Option, + }, + + /// Validate a distribution config file + ValidateConfig { + /// Path to distribution config file + config: PathBuf, + }, + + /// Print TCK version information + Version, +} + +fn main() -> Result<()> { + let cli = Cli::parse(); + + match cli.command { + Commands::Run { config, report, checks } => { + cmd_run(config, report, checks)?; + }, + Commands::ValidateConfig { config } => { + cmd_validate_config(config)?; + }, + Commands::Version => { + println!("s-core TCK v{}", env!("CARGO_PKG_VERSION")); + println!("Platform: linux-x86_64"); + }, + } + + Ok(()) +} + +/// Execute TCK checks and produce a report +fn cmd_run(config_path: PathBuf, report_dir: PathBuf, checks: Option) -> Result<()> { + println!("s-core TCK v{}", env!("CARGO_PKG_VERSION")); + println!(); + + // Load distribution configuration + let config = config::load(&config_path)?; + println!("Distribution: {} v{}", config.dist.name, config.dist.version); + println!("Platform version: {}", config.dist.platform_version); + println!("Architecture: {}", config.dist.arch); + let enabled_checks = select_checks(checks.as_deref(), &config)?; + println!("Checks: {}", enabled_checks.join(",")); + println!(); + + std::fs::create_dir_all(&report_dir)?; + let mut report = report::Report::new(&config); + let runtime_requirements = runtime::RuntimeRequirements::default(); + let policy_path = if enabled_checks.iter().any(|check| check == "sbom" || check == "version") { + Some(resolve_reference_file("reference/policy/requirements.toml")?) + } else { + None + }; + let version_policy = if enabled_checks.iter().any(|check| check == "version") { + Some(version::load_policy(policy_path.as_deref().unwrap())?) + } else { + None + }; + let sbom_policy = if enabled_checks.iter().any(|check| check == "sbom") { + Some(sbom::SbomPolicy::load(policy_path.as_deref().unwrap())?) + } else { + None + }; + let golden_sbom = if sbom_policy.is_some() { + Some(resolve_reference_file("reference/sbom.spdx.json")?) + } else { + None + }; + + // Run SBOM check if enabled + if sbom_policy.is_some() { + println!("Running SBOM check..."); + match sbom::run(&config, golden_sbom.as_deref().unwrap(), sbom_policy.unwrap()) { + Ok(sbom_report) => { + println!(" SBOM verdict: {}", sbom_report.verdict); + report.add_check(sbom_report); + }, + Err(e) => { + println!(" Error: {}", e); + report.add_check(report::CheckReport { + family: "sbom".to_string(), + verdict: "NON-CONFORMANT".to_string(), + checks: vec![report::CheckResult { + id: "sbom.error".to_string(), + status: "fail".to_string(), + severity: "required".to_string(), + message: e.to_string(), + details: vec![], + }], + }); + }, + } + } + + // Run version check if enabled + if let Some(version_policy) = version_policy { + println!("Running version check..."); + match version::run(&config, &version_policy) { + Ok(version_report) => { + println!(" Version verdict: {}", version_report.verdict); + report.add_check(version_report); + }, + Err(e) => { + println!(" Error: {}", e); + report.add_check(report::CheckReport { + family: "version".to_string(), + verdict: "NON-CONFORMANT".to_string(), + checks: vec![report::CheckResult { + id: "version.error".to_string(), + status: "fail".to_string(), + severity: "required".to_string(), + message: e.to_string(), + details: vec![], + }], + }); + }, + } + } + + // Run runtime check if enabled + if enabled_checks.iter().any(|check| check == "runtime") { + println!("Running runtime check..."); + match runtime::run(&config, &runtime_requirements) { + Ok(runtime_report) => { + println!(" Runtime verdict: {}", runtime_report.verdict); + report.add_check(runtime_report); + }, + Err(e) => { + println!(" Error: {}", e); + report.add_check(report::CheckReport { + family: "runtime".to_string(), + verdict: "NON-CONFORMANT".to_string(), + checks: vec![report::CheckResult { + id: "runtime.error".to_string(), + status: "fail".to_string(), + severity: "required".to_string(), + message: e.to_string(), + details: vec![], + }], + }); + }, + } + } + + // Write reports + let json_path = report_dir.join("report.json"); + let md_path = report_dir.join("summary.md"); + report.write_json(&json_path)?; + report.write_markdown(&md_path)?; + + println!(); + println!("Report written to: {}/", report_dir.display()); + println!("Overall verdict: {}", report.verdict); + + if report.verdict == "NON-CONFORMANT" { + std::process::exit(1); + } + + Ok(()) +} + +fn select_checks(explicit: Option<&str>, config: &config::Config) -> Result> { + let checks = match explicit { + Some(checks) => checks.split(',').map(str::trim).map(str::to_string).collect(), + None if !config.checks.enabled.is_empty() => config.checks.enabled.clone(), + None if config.dist.profile == "minimal" => vec!["sbom".to_string()], + None => vec!["sbom".to_string(), "version".to_string(), "runtime".to_string()], + }; + if checks.is_empty() || checks.iter().any(String::is_empty) { + bail!("No checks specified. Known checks are: sbom, version, runtime"); + } + let unknown: Vec<_> = checks + .iter() + .filter(|check| !["sbom", "version", "runtime"].contains(&check.as_str())) + .collect(); + if !unknown.is_empty() { + bail!( + "Unknown or unsupported check(s): {}. Known checks are: sbom, version, runtime", + unknown + .iter() + .map(|check| check.as_str()) + .collect::>() + .join(", ") + ); + } + Ok(checks) +} + +fn resolve_reference_file(relative_path: &str) -> Result { + let executable = std::env::current_exe().context("Failed to locate the TCK executable")?; + let executable_directory = executable.parent().context("TCK executable has no parent directory")?; + let current_directory = std::env::current_dir().context("Failed to determine current directory")?; + let candidates = [ + executable_directory.join("../").join(relative_path), + executable_directory.join(relative_path), + current_directory.join("tck").join(relative_path), + current_directory.join(relative_path), + ]; + candidates + .into_iter() + .map(|path| path.canonicalize().unwrap_or(path)) + .find(|path| path.is_file()) + .with_context(|| format!("Could not find packaged reference file '{}'", relative_path)) +} + +/// Validate a distribution config file +fn cmd_validate_config(config_path: PathBuf) -> Result<()> { + let config = config::load(&config_path)?; + println!( + "Config valid for distribution: {} v{}", + config.dist.name, config.dist.version + ); + println!("Platform version: {}", config.dist.platform_version); + println!("SBOM path: {}", config.dist.paths.sbom_file.display()); + Ok(()) +} + +#[cfg(test)] +mod tests { + use super::*; + use config::{ChecksConfig, DistConfig, PathsConfig}; + + fn config(profile: &str, enabled: Vec<&str>) -> config::Config { + config::Config { + dist: DistConfig { + name: "test".to_string(), + version: "1".to_string(), + arch: "x86_64-linux".to_string(), + profile: profile.to_string(), + platform_version: "0.9.0".to_string(), + paths: PathsConfig { + sbom_file: PathBuf::from("sbom.json"), + headers_dir: None, + libs_dir: None, + }, + }, + checks: ChecksConfig { + enabled: enabled.into_iter().map(str::to_string).collect(), + }, + } + } + + #[test] + fn configured_checks_and_minimal_profile_are_used() { + assert_eq!( + select_checks(None, &config("full", vec!["sbom"])).unwrap(), + vec!["sbom"] + ); + assert_eq!(select_checks(None, &config("minimal", vec![])).unwrap(), vec!["sbom"]); + assert_eq!( + select_checks(Some("runtime"), &config("minimal", vec!["sbom"])).unwrap(), + vec!["runtime"] + ); + } + + #[test] + fn empty_or_unsupported_checks_are_rejected() { + assert!(select_checks(Some(""), &config("full", vec![])).is_err()); + assert!(select_checks(Some("sbom,,version"), &config("full", vec![])).is_err()); + assert!(select_checks(Some("sbmo"), &config("full", vec![])).is_err()); + assert!(select_checks(Some("behavioral"), &config("full", vec![])).is_err()); + } +} diff --git a/tck/runner/src/report.rs b/tck/runner/src/report.rs new file mode 100644 index 00000000000..da790b9e37a --- /dev/null +++ b/tck/runner/src/report.rs @@ -0,0 +1,238 @@ +// ******************************************************************************* +// Copyright (c) 2026 Contributors to the Eclipse Foundation +// +// See the NOTICE file(s) distributed with this work for additional +// information regarding copyright ownership. +// +// This program and the accompanying materials are made available under the +// terms of the Apache License Version 2.0 which is available at +// +// +// SPDX-License-Identifier: Apache-2.0 +// ******************************************************************************* +//! Report generation + +use serde::{Deserialize, Serialize}; +use std::path::Path; + +use crate::config::Config; + +/// Full TCK report +#[derive(Debug, Serialize)] +pub struct Report { + pub tck_version: String, + pub platform_version: String, + pub dist_name: String, + pub dist_version: String, + pub dist_arch: String, + pub verdict: String, + pub checks: Vec, +} + +/// Per-check-family report +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct CheckReport { + pub family: String, + pub verdict: String, + pub checks: Vec, +} + +/// Individual check result +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct CheckResult { + pub id: String, + pub status: String, + pub severity: String, + pub message: String, + pub details: Vec, +} + +impl Report { + pub fn new(config: &Config) -> Self { + Self { + tck_version: env!("CARGO_PKG_VERSION").to_string(), + platform_version: "0.9.0".to_string(), + dist_name: config.dist.name.clone(), + dist_version: config.dist.version.clone(), + dist_arch: config.dist.arch.clone(), + verdict: "CONFORMANT".to_string(), + checks: Vec::new(), + } + } + + pub fn add_check(&mut self, check: CheckReport) { + // Update overall verdict + if check.verdict == "NON-CONFORMANT" { + self.verdict = "NON-CONFORMANT".to_string(); + } else if check.verdict == "CONFORMANT-WITH-WARNINGS" && self.verdict != "NON-CONFORMANT" { + self.verdict = "CONFORMANT-WITH-WARNINGS".to_string(); + } + + self.checks.push(check); + } + + pub fn write_json(&self, path: &Path) -> anyhow::Result<()> { + let content = serde_json::to_string_pretty(self)?; + std::fs::write(path, content)?; + Ok(()) + } + + pub fn write_markdown(&self, path: &Path) -> anyhow::Result<()> { + let mut lines = vec![ + format!("# s-core TCK Compatibility Report"), + String::new(), + format!( + "**Distribution**: {} v{} (`{}`)", + self.dist_name, self.dist_version, self.dist_arch + ), + format!("**TCK Version**: {}", self.tck_version), + format!("**Platform Version**: {}", self.platform_version), + String::new(), + format!("## Verdict: **{}**", self.verdict), + String::new(), + ]; + + for check in &self.checks { + lines.push(format!("### {} Check - {}", check.family.to_uppercase(), check.verdict)); + lines.push(String::new()); + + for result in &check.checks { + let icon = match result.status.as_str() { + "pass" => "✅", + "fail" => "❌", + "warn" => "⚠️", + _ => "⏭️", + }; + lines.push(format!("- {} **{}**: {}", icon, result.id, result.message)); + + for detail in &result.details { + lines.push(format!(" - `{}`", serde_json::to_string(detail).unwrap_or_default())); + } + } + lines.push(String::new()); + } + + std::fs::write(path, lines.join("\n"))?; + Ok(()) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::config::{ChecksConfig, Config, DistConfig, PathsConfig}; + use std::path::PathBuf; + use tempfile::tempdir; + + fn make_test_config() -> Config { + Config { + dist: DistConfig { + name: "test-dist".to_string(), + version: "1.0.0".to_string(), + arch: "x86_64-linux".to_string(), + profile: "full".to_string(), + platform_version: "0.9.0".to_string(), + paths: PathsConfig { + sbom_file: PathBuf::from("./sbom.json"), + headers_dir: None, + libs_dir: None, + }, + }, + checks: ChecksConfig::default(), + } + } + + #[test] + fn test_report_new() { + let config = make_test_config(); + let report = Report::new(&config); + assert_eq!(report.dist_name, "test-dist"); + assert_eq!(report.verdict, "CONFORMANT"); + assert!(report.checks.is_empty()); + } + + #[test] + fn test_add_check_conformant() { + let config = make_test_config(); + let mut report = Report::new(&config); + + report.add_check(CheckReport { + family: "sbom".to_string(), + verdict: "CONFORMANT".to_string(), + checks: vec![], + }); + + assert_eq!(report.verdict, "CONFORMANT"); + assert_eq!(report.checks.len(), 1); + } + + #[test] + fn test_add_check_non_conformant() { + let config = make_test_config(); + let mut report = Report::new(&config); + + report.add_check(CheckReport { + family: "sbom".to_string(), + verdict: "NON-CONFORMANT".to_string(), + checks: vec![], + }); + + assert_eq!(report.verdict, "NON-CONFORMANT"); + } + + #[test] + fn test_add_check_warnings() { + let config = make_test_config(); + let mut report = Report::new(&config); + + report.add_check(CheckReport { + family: "runtime".to_string(), + verdict: "CONFORMANT-WITH-WARNINGS".to_string(), + checks: vec![], + }); + + assert_eq!(report.verdict, "CONFORMANT-WITH-WARNINGS"); + } + + #[test] + fn test_write_json() { + let dir = tempdir().unwrap(); + let config = make_test_config(); + let report = Report::new(&config); + + let path = dir.path().join("report.json"); + report.write_json(&path).unwrap(); + + assert!(path.exists()); + let content = std::fs::read_to_string(&path).unwrap(); + assert!(content.contains("test-dist")); + } + + #[test] + fn test_write_markdown() { + let dir = tempdir().unwrap(); + let config = make_test_config(); + let mut report = Report::new(&config); + + report.add_check(CheckReport { + family: "version".to_string(), + verdict: "CONFORMANT".to_string(), + checks: vec![CheckResult { + id: "version.compatibility".to_string(), + status: "pass".to_string(), + severity: "required".to_string(), + message: "Version compatible".to_string(), + details: vec![], + }], + }); + + let path = dir.path().join("summary.md"); + report.write_markdown(&path).unwrap(); + + assert!(path.exists()); + let content = std::fs::read_to_string(&path).unwrap(); + assert!(content.contains("test-dist")); + assert!(content.contains("VERSION")); + assert!(content.contains("✅")); + } +} diff --git a/tck/runner/src/runtime.rs b/tck/runner/src/runtime.rs new file mode 100644 index 00000000000..8d3a7a70e18 --- /dev/null +++ b/tck/runner/src/runtime.rs @@ -0,0 +1,403 @@ +// ******************************************************************************* +// Copyright (c) 2026 Contributors to the Eclipse Foundation +// +// See the NOTICE file(s) distributed with this work for additional +// information regarding copyright ownership. +// +// This program and the accompanying materials are made available under the +// terms of the Apache License Version 2.0 which is available at +// +// +// SPDX-License-Identifier: Apache-2.0 +// ******************************************************************************* +//! Runtime compatibility check and test harness adapter +//! +//! This module ensures that the distribution's runtime environment is compatible +//! with the TCK's test execution requirements. It provides: +//! - Runtime version checking (toolchain, libraries) +//! - Test harness adapter configuration +//! - Execution environment validation +//! +//! Inspired by Jakarta TCK's porting package concept - vendors provide adapters +//! that tell the TCK how to execute tests in their environment. + +use anyhow::{Context, Result}; +use std::path::{Path, PathBuf}; +use std::process::Command; + +use crate::config::Config; +use crate::report::{CheckReport, CheckResult}; + +/// Runtime environment requirements +#[derive(Debug, Clone)] +pub struct RuntimeRequirements { + /// Minimum toolchain version (e.g., "GCC 11", "Clang 14", "Rust 1.70") + pub min_toolchain_version: String, + + /// Required runtime libraries + pub required_libraries: Vec, + + /// Required environment variables + pub required_env_vars: Vec, + + /// Target platform triplet + pub target_triple: String, +} + +impl Default for RuntimeRequirements { + fn default() -> Self { + Self { + min_toolchain_version: "GCC 11+ or Clang 14+".to_string(), + required_libraries: vec!["pthread".to_string(), "dl".to_string()], + required_env_vars: vec![], + target_triple: "x86_64-linux-gnu".to_string(), + } + } +} + +/// Test harness adapter configuration +/// +/// This is the SCORE equivalent of Jakarta's "porting package". +/// Vendors configure how the TCK should build and run tests against their distribution. +#[derive(Debug, Clone, Default)] +pub struct TestHarnessAdapter { + /// Command to build tests for this distribution + pub build_command: Option, + + /// Command to run a test binary + pub run_command: Option, + + /// Working directory for test execution + pub working_directory: Option, + + /// Environment variables to set for test execution + pub env_vars: Vec<(String, String)>, + + /// Timeout for test execution (seconds) + pub timeout_seconds: u64, + + /// Path to the showcase CLI binary (for behavioral tests) + pub showcase_cli_path: Option, + + /// Showcase examples to run + pub showcase_examples: Vec, +} + +impl TestHarnessAdapter { + /// Create adapter from distribution config + pub fn from_config(config: &Config) -> Self { + Self { + timeout_seconds: 300, // 5 minutes default + showcase_examples: vec!["LoggingApp Demo".to_string(), "ComApiExample".to_string()], + ..Default::default() + } + } + + /// Validate that the adapter is configured correctly for test execution + pub fn validate(&self) -> Result> { + let mut warnings = Vec::new(); + + if self.build_command.is_none() { + warnings.push("No build_command configured - behavioral tests will be skipped".to_string()); + } + + if self.showcase_cli_path.is_none() { + warnings.push("No showcase_cli_path configured - will attempt to discover".to_string()); + } + + Ok(warnings) + } + + /// Execute a showcase example and return success/failure + pub fn run_showcase(&self, example: &str) -> Result { + let cli_path = match &self.showcase_cli_path { + Some(p) => p.clone(), + None => return Err(anyhow::anyhow!("Showcase CLI path not configured")), + }; + + if !cli_path.exists() { + return Err(anyhow::anyhow!("Showcase CLI not found at {:?}", cli_path)); + } + + let output = Command::new(&cli_path) + .arg("--examples") + .arg(example) + .output() + .context("Failed to execute showcase CLI")?; + + let stdout = String::from_utf8_lossy(&output.stdout); + let success = + output.status.success() && stdout.contains(&format!("Example '{}' finished successfully", example)); + + Ok(ShowcaseResult { + example: example.to_string(), + success, + exit_code: output.status.code().unwrap_or(-1), + output: stdout.to_string(), + }) + } +} + +/// Result of running a showcase example +#[derive(Debug)] +pub struct ShowcaseResult { + pub example: String, + pub success: bool, + pub exit_code: i32, + pub output: String, +} + +/// Run runtime compatibility check +pub fn run(config: &Config, requirements: &RuntimeRequirements) -> Result { + let mut checks = Vec::new(); + + // Check 1: Architecture compatibility + checks.push(check_architecture(config, &requirements.target_triple)); + + // Check 2: Toolchain availability + checks.push(check_toolchain(&requirements.min_toolchain_version)); + + // Check 3: Required libraries + checks.push(check_libraries(&requirements.required_libraries)); + + // Check 4: Environment variables (if configured) + if !requirements.required_env_vars.is_empty() { + checks.push(check_env_vars(&requirements.required_env_vars)); + } + + // Compute verdict + let verdict = if checks.iter().any(|c| c.status == "fail" && c.severity == "required") { + "NON-CONFORMANT" + } else if checks.iter().any(|c| c.status == "warn") { + "CONFORMANT-WITH-WARNINGS" + } else { + "CONFORMANT" + }; + + Ok(CheckReport { + family: "runtime".to_string(), + verdict: verdict.to_string(), + checks, + }) +} + +fn check_architecture(config: &Config, expected_triple: &str) -> CheckResult { + let arch = &config.dist.arch; + + // Map arch names to triples + let expected = match arch.as_str() { + "x86_64-linux" => "x86_64-linux-gnu", + "aarch64-linux" => "aarch64-linux-gnu", + "qnx-aarch64" => "aarch64-qnx", + _ => arch, + }; + + // For now, just check the arch is recognized + let known_archs = ["x86_64-linux", "aarch64-linux", "qnx-aarch64"]; + if known_archs.contains(&arch.as_str()) { + CheckResult { + id: "runtime.architecture".to_string(), + status: "pass".to_string(), + severity: "required".to_string(), + message: format!("Target architecture '{}' is supported", arch), + details: vec![serde_json::json!({"arch": arch, "triple": expected})], + } + } else { + CheckResult { + id: "runtime.architecture".to_string(), + status: "fail".to_string(), + severity: "required".to_string(), + message: format!("Unknown target architecture '{}'", arch), + details: vec![serde_json::json!({"known_archs": known_archs})], + } + } +} + +fn check_toolchain(min_version: &str) -> CheckResult { + let alternatives: Vec<_> = min_version.split(" or ").collect(); + let mut attempted = Vec::new(); + for alternative in alternatives { + let fields: Vec<_> = alternative.split_whitespace().collect(); + if fields.len() != 2 { + return toolchain_failure(min_version, "Invalid minimum compiler version requirement"); + } + let (display_name, executable) = match fields[0].to_ascii_lowercase().as_str() { + "gcc" => ("GCC", "gcc"), + "clang" => ("Clang", "clang"), + _ => return toolchain_failure(min_version, "Unsupported compiler in minimum version requirement"), + }; + let minimum = fields[1].trim_end_matches('+'); + let output = Command::new(executable).arg("--version").output(); + let Ok(output) = output else { + attempted.push(format!("{display_name} not found")); + continue; + }; + if !output.status.success() { + attempted.push(format!("{display_name} command failed")); + continue; + } + let output = String::from_utf8_lossy(&output.stdout).to_string(); + if compiler_meets_minimum(&output, minimum) { + let detected = extract_numeric_version(&output).unwrap_or_else(|| "unknown".to_string()); + return CheckResult { + id: "runtime.toolchain".to_string(), + status: "pass".to_string(), + severity: "required".to_string(), + message: format!("Detected {display_name} {detected}"), + details: vec![serde_json::json!({ + "compiler": display_name, + "version": detected, + "min_required": min_version + })], + }; + } + let detected = extract_numeric_version(&output).unwrap_or_else(|| "unknown".to_string()); + attempted.push(format!("{display_name} {detected} is below {minimum}")); + } + + toolchain_failure(min_version, &attempted.join("; ")) +} + +fn toolchain_failure(min_version: &str, reason: &str) -> CheckResult { + CheckResult { + id: "runtime.toolchain".to_string(), + status: "fail".to_string(), + severity: "required".to_string(), + message: format!("No supported compiler satisfies the minimum: {reason}"), + details: vec![serde_json::json!({"min_required": min_version})], + } +} + +fn compiler_meets_minimum(output: &str, minimum: &str) -> bool { + let Some(detected) = extract_numeric_version(output) else { + return false; + }; + let Some(detected) = numeric_components(&detected) else { + return false; + }; + let Some(minimum) = numeric_components(minimum) else { + return false; + }; + let mut detected = detected; + let mut minimum = minimum; + detected.resize(3, 0); + minimum.resize(3, 0); + detected >= minimum +} + +fn extract_numeric_version(output: &str) -> Option { + let bytes = output.as_bytes(); + for start in 0..bytes.len() { + if !bytes[start].is_ascii_digit() || (start > 0 && bytes[start - 1].is_ascii_alphanumeric()) { + continue; + } + let mut end = start; + while end < bytes.len() && (bytes[end].is_ascii_digit() || bytes[end] == b'.') { + end += 1; + } + let candidate = &output[start..end]; + if numeric_components(candidate).is_some() { + return Some(candidate.trim_end_matches('.').to_string()); + } + } + None +} + +fn numeric_components(value: &str) -> Option> { + let components: Vec<_> = value.split('.').collect(); + if components.is_empty() + || components.len() > 3 + || components + .iter() + .any(|part| part.is_empty() || !part.bytes().all(|b| b.is_ascii_digit())) + { + return None; + } + components.into_iter().map(|part| part.parse().ok()).collect() +} + +fn check_libraries(required: &[String]) -> CheckResult { + // Check for required libraries by trying to link against them + let mut missing = Vec::new(); + + for lib in required { + // Simple check - see if the library exists in standard locations + let found = ["/lib", "/usr/lib", "/usr/local/lib"].iter().any(|dir| { + Path::new(dir).join(format!("lib{}.so", lib)).exists() + || Path::new(dir).join(format!("lib{}.a", lib)).exists() + }); + + if !found { + missing.push(lib.clone()); + } + } + + if missing.is_empty() { + CheckResult { + id: "runtime.libraries".to_string(), + status: "pass".to_string(), + severity: "required".to_string(), + message: format!("All {} required libraries found", required.len()), + details: required + .iter() + .map(|l| serde_json::json!({"library": l, "found": true})) + .collect(), + } + } else { + CheckResult { + id: "runtime.libraries".to_string(), + status: "warn".to_string(), + severity: "required".to_string(), + message: format!("{} required libraries not found: {}", missing.len(), missing.join(", ")), + details: missing + .iter() + .map(|l| serde_json::json!({"library": l, "found": false})) + .collect(), + } + } +} + +fn check_env_vars(required: &[String]) -> CheckResult { + let missing: Vec = required.iter().filter(|v| std::env::var(v).is_err()).cloned().collect(); + + if missing.is_empty() { + CheckResult { + id: "runtime.env_vars".to_string(), + status: "pass".to_string(), + severity: "required".to_string(), + message: "All required environment variables set".to_string(), + details: required + .iter() + .map(|v| serde_json::json!({"var": v, "value": std::env::var(v).unwrap_or_default()})) + .collect(), + } + } else { + CheckResult { + id: "runtime.env_vars".to_string(), + status: "fail".to_string(), + severity: "required".to_string(), + message: format!("Missing environment variables: {}", missing.join(", ")), + details: missing + .iter() + .map(|v| serde_json::json!({"var": v, "set": false})) + .collect(), + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn compiler_version_must_meet_its_minimum() { + assert!(!compiler_meets_minimum("gcc (GCC) 10.4.0", "11")); + assert!(compiler_meets_minimum("clang version 14.0.6", "14")); + } + + #[test] + fn compiler_version_parser_rejects_malformed_values() { + assert!(!compiler_meets_minimum("gcc version unknown", "11")); + assert!(!compiler_meets_minimum("clang version 14.0.6", "14.1")); + } +} diff --git a/tck/runner/src/sbom.rs b/tck/runner/src/sbom.rs new file mode 100644 index 00000000000..a8776f6fd15 --- /dev/null +++ b/tck/runner/src/sbom.rs @@ -0,0 +1,691 @@ +// ******************************************************************************* +// Copyright (c) 2026 Contributors to the Eclipse Foundation +// +// See the NOTICE file(s) distributed with this work for additional +// information regarding copyright ownership. +// +// This program and the accompanying materials are made available under the +// terms of the Apache License Version 2.0 which is available at +// +// +// SPDX-License-Identifier: Apache-2.0 +// ******************************************************************************* +//! SBOM comparison check + +use anyhow::{bail, Context, Result}; +use serde::Deserialize; +use std::collections::HashSet; +use std::path::{Path, PathBuf}; + +use crate::config::Config; +use crate::report::{CheckReport, CheckResult}; + +#[derive(Debug, Deserialize)] +pub struct SpdxDocument { + #[serde(rename = "spdxVersion")] + spdx_version: Option, + #[serde(rename = "dataLicense")] + data_license: Option, + #[serde(rename = "SPDXID")] + spdx_id: Option, + name: Option, + #[serde(rename = "documentNamespace")] + document_namespace: Option, + #[serde(rename = "creationInfo")] + creation_info: Option, + #[serde(default)] + pub packages: Vec, + #[serde(default)] + relationships: Vec, +} + +#[derive(Debug, Deserialize)] +struct SpdxCreationInfo { + created: Option, + creators: Option>, +} + +#[derive(Debug, Deserialize)] +struct SpdxRelationship { + #[serde(rename = "spdxElementId")] + spdx_element_id: String, + #[serde(rename = "relationshipType")] + relationship_type: String, + #[serde(rename = "relatedSpdxElement")] + related_spdx_element: String, +} + +#[derive(Debug, Deserialize, Clone)] +pub struct SpdxPackage { + #[serde(rename = "SPDXID")] + spdx_id: Option, + pub name: String, + #[serde(default)] + #[serde(rename = "versionInfo")] + pub version_info: Option, + #[serde(default)] + #[serde(rename = "licenseConcluded")] + pub license_concluded: Option, + #[serde(default)] + pub supplier: Option, + #[serde(default)] + checksums: Vec, +} + +#[derive(Debug, Deserialize, Clone, Eq, PartialEq)] +struct SpdxChecksum { + algorithm: String, + #[serde(rename = "checksumValue")] + checksum_value: String, +} + +#[derive(Debug)] +pub struct SbomPolicy { + required_modules: HashSet, + allowed_licenses: HashSet, + forbidden_components: HashSet, +} + +impl SbomPolicy { + pub fn load(path: &Path) -> Result { + let content = + std::fs::read_to_string(path).with_context(|| format!("Failed to read SBOM policy: {}", path.display()))?; + let tables = + crate::toml::parse(&content).with_context(|| format!("Failed to parse SBOM policy: {}", path.display()))?; + + let entries = |name: &str| { + tables + .get(name) + .with_context(|| format!("Missing [{}] in SBOM policy", name)) + }; + let required_modules = entries("sbom.required_components")? + .keys() + .map(|name| name.to_lowercase()) + .collect(); + let allowed_licenses = entries("sbom.allowed_licenses")? + .iter() + .filter_map(|(name, value)| match crate::toml::inline_bool(value, "approved") { + Ok(Some(true)) => Some(Ok(Some(name.clone()))), + Ok(Some(false)) => None, + Ok(None) => Some(Err(anyhow::anyhow!("Missing 'approved' flag for license '{}'", name))), + Err(error) => Some(Err(error)), + }) + .collect::>>()? + .into_iter() + .flatten() + .collect(); + let forbidden_components = entries("sbom.forbidden_components")? + .keys() + .filter(|name| name.as_str() != "_placeholder") + .map(|name| name.to_lowercase()) + .collect(); + + Ok(Self { + required_modules, + allowed_licenses, + forbidden_components, + }) + } +} + +/// SBOM comparison checker +pub struct SBOMChecker { + golden_packages: Vec, + policy: SbomPolicy, +} + +impl SBOMChecker { + pub fn new(golden_sbom_path: PathBuf, policy: SbomPolicy) -> Result { + let golden = load_spdx(&golden_sbom_path) + .with_context(|| format!("Failed to load golden SBOM: {}", golden_sbom_path.display()))?; + Ok(Self { + golden_packages: extract_packages(&golden), + policy, + }) + } + + /// Run the SBOM check against a distribution's SBOM + pub fn check(&self, dist_sbom_path: &Path) -> CheckReport { + match load_spdx(dist_sbom_path) { + Ok(document) => self.run_checks(&extract_packages(&document)), + Err(error) => CheckReport { + family: "sbom".to_string(), + verdict: "NON-CONFORMANT".to_string(), + checks: vec![CheckResult { + id: "sbom.error".to_string(), + status: "fail".to_string(), + severity: "required".to_string(), + message: format!("Failed to load SBOM: {}", error), + details: vec![], + }], + }, + } + } + + fn run_checks(&self, packages: &[SpdxPackage]) -> CheckReport { + let checks = vec![ + self.check_required_components(packages), + self.check_forbidden_components(packages), + self.check_license_policy(packages), + self.check_drift(packages), + ]; + let verdict = if checks + .iter() + .any(|check| check.status == "fail" && check.severity == "required") + { + "NON-CONFORMANT" + } else if checks.iter().any(|check| check.status == "warn") { + "CONFORMANT-WITH-WARNINGS" + } else { + "CONFORMANT" + }; + CheckReport { + family: "sbom".to_string(), + verdict: verdict.to_string(), + checks, + } + } + + fn check_required_components(&self, packages: &[SpdxPackage]) -> CheckResult { + let missing: Vec<_> = self + .policy + .required_modules + .iter() + .filter(|required| { + !packages + .iter() + .any(|package| package.name.eq_ignore_ascii_case(required)) + }) + .cloned() + .collect(); + if missing.is_empty() { + CheckResult { + id: "sbom.required_components".to_string(), + status: "pass".to_string(), + severity: "required".to_string(), + message: format!("All {} required components present", self.policy.required_modules.len()), + details: self + .policy + .required_modules + .iter() + .map(|module| serde_json::json!({"module": module, "found": true})) + .collect(), + } + } else { + CheckResult { + id: "sbom.required_components".to_string(), + status: "fail".to_string(), + severity: "required".to_string(), + message: format!("Missing {} required component(s)", missing.len()), + details: missing + .iter() + .map(|module| serde_json::json!({"module": module})) + .collect(), + } + } + } + + fn check_forbidden_components(&self, packages: &[SpdxPackage]) -> CheckResult { + let found: Vec<_> = self + .policy + .forbidden_components + .iter() + .filter(|forbidden| { + packages + .iter() + .any(|package| package.name.eq_ignore_ascii_case(forbidden)) + }) + .cloned() + .collect(); + if found.is_empty() { + CheckResult { + id: "sbom.forbidden_components".to_string(), + status: "pass".to_string(), + severity: "required".to_string(), + message: "No forbidden components found".to_string(), + details: vec![], + } + } else { + CheckResult { + id: "sbom.forbidden_components".to_string(), + status: "fail".to_string(), + severity: "required".to_string(), + message: format!("Found {} forbidden component(s)", found.len()), + details: found + .iter() + .map(|component| serde_json::json!({"component": component})) + .collect(), + } + } + } + + fn check_license_policy(&self, packages: &[SpdxPackage]) -> CheckResult { + let violations: Vec<_> = packages + .iter() + .filter_map(|package| { + let license = package.license_concluded.as_deref().unwrap_or("NOASSERTION"); + (!license_expression_is_allowed(license, &self.policy.allowed_licenses)) + .then(|| serde_json::json!({"component": package.name, "license": license})) + }) + .take(20) + .collect(); + if violations.is_empty() { + CheckResult { + id: "sbom.license_policy".to_string(), + status: "pass".to_string(), + severity: "required".to_string(), + message: "All licenses comply with policy".to_string(), + details: vec![], + } + } else { + CheckResult { + id: "sbom.license_policy".to_string(), + status: "warn".to_string(), + severity: "warning".to_string(), + message: format!("Found {} license policy violation(s)", violations.len()), + details: violations, + } + } + } + + fn check_drift(&self, packages: &[SpdxPackage]) -> CheckResult { + let mut matched = vec![false; self.golden_packages.len()]; + let mut drift = Vec::new(); + for package in packages { + let matching = self + .golden_packages + .iter() + .enumerate() + .filter(|(index, golden)| !matched[*index] && golden.name.eq_ignore_ascii_case(&package.name)) + .min_by_key(|(_, golden)| { + golden.version_info != package.version_info + || normalized_checksums(&golden.checksums) != normalized_checksums(&package.checksums) + }); + if let Some((index, golden)) = matching { + matched[index] = true; + let version_changed = golden.version_info != package.version_info; + let checksum_changed = + normalized_checksums(&golden.checksums) != normalized_checksums(&package.checksums); + if version_changed || checksum_changed { + drift.push(serde_json::json!({ + "component": package.name, + "type": "change", + "golden_version": golden.version_info, + "distribution_version": package.version_info, + "checksum_changed": checksum_changed + })); + } + } else { + drift.push(serde_json::json!({ + "component": package.name, + "type": "addition" + })); + } + } + for (index, golden) in self.golden_packages.iter().enumerate() { + if !matched[index] { + drift.push(serde_json::json!({ + "component": golden.name, + "type": "removal" + })); + } + } + drift.truncate(50); + if drift.is_empty() { + CheckResult { + id: "sbom.drift".to_string(), + status: "pass".to_string(), + severity: "informational".to_string(), + message: "No drift from golden reference".to_string(), + details: vec![], + } + } else { + CheckResult { + id: "sbom.drift".to_string(), + status: "warn".to_string(), + severity: "informational".to_string(), + message: format!("Found {} drift item(s) from golden", drift.len()), + details: drift, + } + } + } +} + +fn normalized_checksums(checksums: &[SpdxChecksum]) -> Vec<(String, String)> { + let mut checksums: Vec<_> = checksums + .iter() + .map(|checksum| { + ( + checksum.algorithm.to_ascii_uppercase(), + checksum.checksum_value.to_ascii_lowercase(), + ) + }) + .collect(); + checksums.sort(); + checksums +} + +fn license_expression_is_allowed(expression: &str, allowed: &HashSet) -> bool { + let mut tokens = Vec::new(); + let mut token = String::new(); + for character in expression.chars() { + match character { + '(' | ')' => { + if !token.is_empty() { + tokens.push(std::mem::take(&mut token)); + } + tokens.push(character.to_string()); + }, + character if character.is_whitespace() => { + if !token.is_empty() { + tokens.push(std::mem::take(&mut token)); + } + }, + _ => token.push(character), + } + } + if !token.is_empty() { + tokens.push(token); + } + let mut parser = LicenseExpressionParser { + tokens: &tokens, + position: 0, + allowed, + }; + parser.parse_or().unwrap_or(false) && parser.position == tokens.len() +} + +struct LicenseExpressionParser<'a> { + tokens: &'a [String], + position: usize, + allowed: &'a HashSet, +} + +impl LicenseExpressionParser<'_> { + fn parse_or(&mut self) -> Option { + let mut result = self.parse_and()?; + while self.take("OR") { + result = self.parse_and()? | result; + } + Some(result) + } + + fn parse_and(&mut self) -> Option { + let mut result = self.parse_primary()?; + while self.take("AND") { + result = self.parse_primary()? & result; + } + Some(result) + } + + fn parse_primary(&mut self) -> Option { + if self.take("(") { + let result = self.parse_or()?; + if !self.take(")") { + return None; + } + return Some(result); + } + let license = self.tokens.get(self.position)?; + if matches!(license.as_str(), "AND" | "OR" | "WITH" | ")") { + return None; + } + self.position += 1; + let allowed = self.allowed.contains(license); + if self.take("WITH") { + if self.tokens.get(self.position).is_none() { + return None; + } + self.position += 1; + return Some(false); + } + Some(allowed) + } + + fn take(&mut self, token: &str) -> bool { + if self.tokens.get(self.position).map(String::as_str) == Some(token) { + self.position += 1; + true + } else { + false + } + } +} + +/// Load and validate an SPDX JSON document. +pub fn load_spdx(path: &Path) -> Result { + let content = + std::fs::read_to_string(path).with_context(|| format!("Failed to read SPDX file: {}", path.display()))?; + let document: SpdxDocument = + serde_json::from_str(&content).with_context(|| format!("Failed to parse SPDX JSON: {}", path.display()))?; + validate_spdx(&document)?; + Ok(document) +} + +fn validate_spdx(document: &SpdxDocument) -> Result<()> { + if !document.spdx_version.as_deref().is_some_and(valid_spdx_version) + || document.data_license.as_deref() != Some("CC0-1.0") + || document.spdx_id.as_deref() != Some("SPDXRef-DOCUMENT") + || document.name.as_deref().is_none_or(str::is_empty) + || document.document_namespace.as_deref().is_none_or(str::is_empty) + { + bail!("SPDX document is missing required document metadata"); + } + let creation = document + .creation_info + .as_ref() + .context("SPDX document is missing creationInfo")?; + if creation.created.as_deref().is_none_or(str::is_empty) + || creation.creators.as_ref().is_none_or(|creators| creators.is_empty()) + { + bail!("SPDX document has incomplete creationInfo"); + } + if document.packages.is_empty() { + bail!("SPDX document contains no packages"); + } + let mut package_ids = HashSet::new(); + for package in &document.packages { + let id = package + .spdx_id + .as_deref() + .filter(|id| valid_spdx_id(id)) + .context("SPDX package is missing a valid SPDXID")?; + if !package_ids.insert(id) { + bail!("SPDX document contains duplicate package SPDXID '{}'", id); + } + } + let describes_root = document.relationships.iter().any(|relationship| { + relationship.spdx_element_id == "SPDXRef-DOCUMENT" + && relationship.relationship_type == "DESCRIBES" + && package_ids.contains(relationship.related_spdx_element.as_str()) + }); + if !describes_root { + bail!("SPDX document does not describe a root package"); + } + Ok(()) +} + +fn valid_spdx_version(version: &str) -> bool { + let Some(version) = version.strip_prefix("SPDX-") else { + return false; + }; + let mut parts = version.split('.'); + matches!( + (parts.next(), parts.next(), parts.next()), + (Some("2"), Some(minor), None) + if !minor.is_empty() + && !(minor.len() > 1 && minor.starts_with('0')) + && minor.bytes().all(|byte| byte.is_ascii_digit()) + ) +} + +fn valid_spdx_id(id: &str) -> bool { + let Some(suffix) = id.strip_prefix("SPDXRef-") else { + return false; + }; + !suffix.is_empty() + && suffix.as_bytes()[0].is_ascii_alphanumeric() + && suffix.as_bytes()[suffix.len() - 1].is_ascii_alphanumeric() + && suffix + .bytes() + .all(|byte| byte.is_ascii_alphanumeric() || matches!(byte, b'-' | b'.')) + && !suffix.ends_with('-') +} + +pub fn extract_packages(document: &SpdxDocument) -> Vec { + document.packages.clone() +} + +/// Run the SBOM check using the packaged reference SBOM and policy. +pub fn run(config: &Config, golden_path: &Path, policy: SbomPolicy) -> Result { + let checker = SBOMChecker::new(golden_path.to_path_buf(), policy)?; + Ok(checker.check(&config.dist.paths.sbom_file)) +} + +#[cfg(test)] +mod tests { + use super::*; + + fn package(name: &str, version: &str, license: &str, checksum: &str) -> SpdxPackage { + SpdxPackage { + spdx_id: Some(format!("SPDXRef-{name}-{version}")), + name: name.to_string(), + version_info: Some(version.to_string()), + license_concluded: Some(license.to_string()), + supplier: None, + checksums: vec![SpdxChecksum { + algorithm: "SHA256".to_string(), + checksum_value: checksum.to_string(), + }], + } + } + + fn checker(packages: Vec, allowed: &[&str]) -> SBOMChecker { + SBOMChecker { + golden_packages: packages, + policy: SbomPolicy { + required_modules: HashSet::new(), + allowed_licenses: allowed.iter().map(|license| license.to_string()).collect(), + forbidden_components: HashSet::new(), + }, + } + } + + #[test] + fn license_expression_obeys_and_or_precedence() { + let allowed = ["MIT", "BSD-3-Clause"] + .iter() + .map(|license| license.to_string()) + .collect(); + assert!(license_expression_is_allowed("GPL-3.0-only OR MIT", &allowed)); + assert!(!license_expression_is_allowed("GPL-2.0-only OR GPL-3.0-only", &allowed)); + assert!(!license_expression_is_allowed( + "(MIT OR GPL-3.0-only) AND GPL-2.0-only", + &allowed + )); + assert!(license_expression_is_allowed("MIT AND BSD-3-Clause", &allowed)); + assert!(!license_expression_is_allowed("MIT WITH LLVM-exception", &allowed)); + } + + #[test] + fn packages_with_duplicate_names_are_all_checked_for_licenses() { + let checker = checker(vec![], &["MIT"]); + let report = checker.run_checks(&[ + package("duplicate", "1.0.0", "MIT", "one"), + package("duplicate", "2.0.0", "GPL-3.0-only", "two"), + ]); + assert_eq!(report.checks[2].status, "fail"); + assert_eq!(report.checks[2].details.len(), 1); + } + + #[test] + fn drift_detects_versions_and_checksums() { + let checker = checker(vec![package("component", "1.0.0", "MIT", "same")], &["MIT"]); + let report = checker.run_checks(&[package("component", "2.0.0", "MIT", "changed")]); + assert_eq!(report.checks[3].status, "warn"); + assert_eq!(report.checks[3].details[0]["type"], "change"); + assert_eq!(report.checks[3].details[0]["checksum_changed"], true); + } + + #[test] + fn golden_sbom_load_failure_is_propagated() { + let policy = SbomPolicy { + required_modules: HashSet::new(), + allowed_licenses: HashSet::new(), + forbidden_components: HashSet::new(), + }; + assert!(SBOMChecker::new(PathBuf::from("missing-golden.json"), policy).is_err()); + } + + #[test] + fn policy_uses_approved_licenses_and_component_tables() { + let file = tempfile::NamedTempFile::new().unwrap(); + std::fs::write( + file.path(), + r#" +[sbom.required_components] +score_core = { description = "core", critical = true } + +[sbom.allowed_licenses] +MIT = { category = "permissive", approved = true } +NOASSERTION = { category = "unknown", approved = false } + +[sbom.forbidden_components] +blocked = { reason = "not allowed" } +"#, + ) + .unwrap(); + let policy = SbomPolicy::load(file.path()).unwrap(); + assert!(policy.required_modules.contains("score_core")); + assert!(policy.allowed_licenses.contains("MIT")); + assert!(!policy.allowed_licenses.contains("NOASSERTION")); + assert!(policy.forbidden_components.contains("blocked")); + } + + #[test] + fn malformed_or_incomplete_spdx_documents_are_rejected() { + let malformed = serde_json::from_str::(r#"{"packages":[{"name":"only-package"}]}"#).unwrap(); + assert!(validate_spdx(&malformed).is_err()); + assert!(serde_json::from_str::(r#"{"packages":[{}]}"#).is_err()); + assert!(!valid_spdx_version("SPDX-2.invalid")); + assert!(!valid_spdx_version("SPDX-2.03")); + assert!(!valid_spdx_id("SPDXRef-")); + assert!(!valid_spdx_id("SPDXRef-root!")); + } + + #[test] + fn valid_spdx_document_requires_and_accepts_a_described_root_package() { + let document: SpdxDocument = serde_json::from_str( + r#"{ + "spdxVersion":"SPDX-2.3", + "dataLicense":"CC0-1.0", + "SPDXID":"SPDXRef-DOCUMENT", + "name":"test", + "documentNamespace":"https://example.test/sbom", + "creationInfo":{"created":"2026-01-01T00:00:00Z","creators":["Tool: test"]}, + "packages":[{"SPDXID":"SPDXRef-root","name":"root"}], + "relationships":[{ + "spdxElementId":"SPDXRef-DOCUMENT", + "relationshipType":"DESCRIBES", + "relatedSpdxElement":"SPDXRef-root" + }] + }"#, + ) + .unwrap(); + assert!(validate_spdx(&document).is_ok()); + let missing_root: SpdxDocument = serde_json::from_str( + r#"{ + "spdxVersion":"SPDX-2.3", + "dataLicense":"CC0-1.0", + "SPDXID":"SPDXRef-DOCUMENT", + "name":"test", + "documentNamespace":"https://example.test/sbom", + "creationInfo":{"created":"2026-01-01T00:00:00Z","creators":["Tool: test"]}, + "packages":[{"SPDXID":"SPDXRef-root","name":"root"}], + "relationships":[] + }"#, + ) + .unwrap(); + assert!(validate_spdx(&missing_root).is_err()); + } +} diff --git a/tck/runner/src/toml.rs b/tck/runner/src/toml.rs new file mode 100644 index 00000000000..3e278c345ba --- /dev/null +++ b/tck/runner/src/toml.rs @@ -0,0 +1,212 @@ +// ******************************************************************************* +// Copyright (c) 2026 Contributors to the Eclipse Foundation +// +// See the NOTICE file(s) distributed with this work for additional +// information regarding copyright ownership. +// +// This program and the accompanying materials are made available under the +// terms of the Apache License Version 2.0 which is available at +// +// +// SPDX-License-Identifier: Apache-2.0 +// ******************************************************************************* +use anyhow::{bail, Context, Result}; +use std::collections::HashMap; + +pub type Tables = HashMap>; + +pub fn parse(content: &str) -> Result { + let mut tables = Tables::new(); + let mut table = String::new(); + let mut pending = String::new(); + let mut key = String::new(); + + for (line_number, line) in content.lines().enumerate() { + let line = strip_comment(line)?; + let line = line.trim(); + if line.is_empty() { + continue; + } + + if pending.is_empty() && line.starts_with('[') { + if !line.ends_with(']') || line.starts_with("[[") { + bail!("Invalid TOML table header on line {}", line_number + 1); + } + table = line[1..line.len() - 1].trim().to_string(); + if table.is_empty() { + bail!("Empty TOML table header on line {}", line_number + 1); + } + tables.entry(table.clone()).or_default(); + continue; + } + + if pending.is_empty() { + let Some((parsed_key, value)) = line.split_once('=') else { + bail!("Expected key/value pair on TOML line {}", line_number + 1); + }; + key = parsed_key.trim().to_string(); + if key.is_empty() { + bail!("Empty TOML key on line {}", line_number + 1); + } + pending.push_str(value.trim()); + } else { + pending.push(' '); + pending.push_str(line); + } + + if value_is_complete(&pending)? { + let entries = tables.entry(table.clone()).or_default(); + if entries.insert(key.clone(), pending.trim().to_string()).is_some() { + bail!("Duplicate TOML key '{}' on line {}", key, line_number + 1); + } + pending.clear(); + key.clear(); + } + } + + if !pending.is_empty() { + bail!("Incomplete TOML value for '{}'", key); + } + Ok(tables) +} + +pub fn string(value: &str) -> Result { + let value = value.trim(); + if value.starts_with('"') { + serde_json::from_str(value).context("Invalid TOML string") + } else if value.starts_with('\'') && value.ends_with('\'') && value.len() >= 2 { + Ok(value[1..value.len() - 1].to_string()) + } else { + bail!("Expected a TOML string, found '{}'", value) + } +} + +pub fn string_array(value: &str) -> Result> { + let value = value.trim(); + if !value.starts_with('[') || !value.ends_with(']') { + bail!("Expected a TOML array, found '{}'", value); + } + let inner = &value[1..value.len() - 1]; + if inner.trim().is_empty() { + return Ok(Vec::new()); + } + split_values(inner)? + .into_iter() + .map(|value| string(value.trim())) + .collect() +} + +pub fn inline_bool(value: &str, key: &str) -> Result> { + let value = value.trim(); + if !value.starts_with('{') || !value.ends_with('}') { + bail!("Expected a TOML inline table, found '{}'", value); + } + for field in split_values(&value[1..value.len() - 1])? { + let Some((field_key, field_value)) = field.split_once('=') else { + bail!("Invalid TOML inline table field '{}'", field); + }; + if field_key.trim() == key { + return match field_value.trim() { + "true" => Ok(Some(true)), + "false" => Ok(Some(false)), + other => bail!("Expected a boolean for '{}', found '{}'", key, other), + }; + } + } + Ok(None) +} + +fn strip_comment(line: &str) -> Result { + let mut quote = None; + let mut escaped = false; + for (index, ch) in line.char_indices() { + if let Some(q) = quote { + if q == '"' && ch == '\\' && !escaped { + escaped = true; + continue; + } + if ch == q && !escaped { + quote = None; + } + escaped = false; + } else if ch == '"' || ch == '\'' { + quote = Some(ch); + } else if ch == '#' { + return Ok(line[..index].to_string()); + } + } + if quote.is_some() { + bail!("Unterminated quoted string in TOML"); + } + Ok(line.to_string()) +} + +fn value_is_complete(value: &str) -> Result { + let mut quote = None; + let mut escaped = false; + let mut depth = 0i32; + for ch in value.chars() { + if let Some(q) = quote { + if q == '"' && ch == '\\' && !escaped { + escaped = true; + continue; + } + if ch == q && !escaped { + quote = None; + } + escaped = false; + continue; + } + match ch { + '"' | '\'' => quote = Some(ch), + '{' | '[' => depth += 1, + '}' | ']' => { + depth -= 1; + if depth < 0 { + bail!("Unbalanced TOML value"); + } + }, + _ => {}, + } + } + Ok(quote.is_none() && depth == 0) +} + +fn split_values(value: &str) -> Result> { + let mut parts = Vec::new(); + let mut start = 0; + let mut quote = None; + let mut escaped = false; + let mut depth = 0i32; + for (index, ch) in value.char_indices() { + if let Some(q) = quote { + if q == '"' && ch == '\\' && !escaped { + escaped = true; + continue; + } + if ch == q && !escaped { + quote = None; + } + escaped = false; + continue; + } + match ch { + '"' | '\'' => quote = Some(ch), + '{' | '[' => depth += 1, + '}' | ']' => depth -= 1, + ',' if depth == 0 => { + parts.push(value[start..index].trim()); + start = index + ch.len_utf8(); + }, + _ => {}, + } + } + if quote.is_some() || depth != 0 { + bail!("Malformed TOML array or inline table"); + } + let last = value[start..].trim(); + if !last.is_empty() { + parts.push(last); + } + Ok(parts) +} diff --git a/tck/runner/src/version.rs b/tck/runner/src/version.rs new file mode 100644 index 00000000000..7cdd00b1106 --- /dev/null +++ b/tck/runner/src/version.rs @@ -0,0 +1,409 @@ +// ******************************************************************************* +// Copyright (c) 2026 Contributors to the Eclipse Foundation +// +// See the NOTICE file(s) distributed with this work for additional +// information regarding copyright ownership. +// +// This program and the accompanying materials are made available under the +// terms of the Apache License Version 2.0 which is available at +// +// +// SPDX-License-Identifier: Apache-2.0 +// ******************************************************************************* +//! Version compatibility check + +use anyhow::{Context, Result}; +use std::path::Path; + +use crate::config::Config; +use crate::report::{CheckReport, CheckResult}; + +/// Version requirements from policy +#[derive(Debug, Clone)] +pub struct VersionPolicy { + pub platform_version: String, + pub min_platform_version: String, + pub tck_version: String, + pub version_policy: String, +} + +impl Default for VersionPolicy { + fn default() -> Self { + Self { + platform_version: "0.9.0".to_string(), + min_platform_version: "0.9.0".to_string(), + tck_version: "0.1.0".to_string(), + version_policy: "compatible".to_string(), + } + } +} + +/// Load version policy from requirements.toml +pub fn load_policy(policy_path: &Path) -> Result { + let content = std::fs::read_to_string(policy_path) + .with_context(|| format!("Failed to read version policy: {}", policy_path.display()))?; + parse_version_section(&content) +} + +/// Parse [version] section from TOML content +fn parse_version_section(content: &str) -> Result { + let tables = crate::toml::parse(content)?; + let version = tables + .get("version") + .context("Missing [version] section in requirements.toml")?; + let required = |key: &str| -> Result { + let value = version + .get(key) + .with_context(|| format!("Missing version policy key '{}'", key))?; + crate::toml::string(value).with_context(|| format!("Invalid version policy key '{}'", key)) + }; + + Ok(VersionPolicy { + platform_version: required("platform_version")?, + min_platform_version: required("min_platform_version")?, + tck_version: required("tck_version")?, + version_policy: required("version_policy")?, + }) +} + +/// Run version compatibility check +pub fn run(config: &Config, policy: &VersionPolicy) -> Result { + let dist_version = &config.dist.platform_version; + + let check = match policy.version_policy.as_str() { + "exact" => check_exact(dist_version, &policy.platform_version), + "compatible" => check_compatible(dist_version, &policy.min_platform_version), + "any" => CheckResult { + id: "version.compatibility".to_string(), + status: "pass".to_string(), + severity: "required".to_string(), + message: "Version checking disabled".to_string(), + details: vec![], + }, + _ => CheckResult { + id: "version.compatibility".to_string(), + status: "fail".to_string(), // Unknown policy must fail, not warn + severity: "required".to_string(), + message: format!( + "Unknown version policy: '{}'. Must be 'exact', 'compatible', or 'any'", + policy.version_policy + ), + details: vec![], + }, + }; + + let verdict = if check.status == "fail" { + "NON-CONFORMANT" + } else { + "CONFORMANT" + }; + + Ok(CheckReport { + family: "version".to_string(), + verdict: verdict.to_string(), + checks: vec![check], + }) +} + +fn check_exact(dist_version: &str, required_version: &str) -> CheckResult { + let valid_versions = parse_semver(dist_version).is_ok() && parse_semver(required_version).is_ok(); + if valid_versions && dist_version == required_version { + CheckResult { + id: "version.compatibility".to_string(), + status: "pass".to_string(), + severity: "required".to_string(), + message: format!("Platform version {} matches required version", dist_version), + details: vec![serde_json::json!({"dist_version": dist_version, "required_version": required_version})], + } + } else if !valid_versions { + CheckResult { + id: "version.compatibility".to_string(), + status: "fail".to_string(), + severity: "required".to_string(), + message: format!( + "Invalid version format: distribution '{}' or required '{}'", + dist_version, required_version + ), + details: vec![serde_json::json!({"dist_version": dist_version, "required_version": required_version})], + } + } else { + CheckResult { + id: "version.compatibility".to_string(), + status: "fail".to_string(), + severity: "required".to_string(), + message: format!( + "Platform version {} does not match required version {}", + dist_version, required_version + ), + details: vec![serde_json::json!({"dist_version": dist_version, "required_version": required_version})], + } + } +} + +fn check_compatible(dist_version: &str, min_version: &str) -> CheckResult { + match compare_versions(dist_version, min_version) { + Ok(true) => CheckResult { + id: "version.compatibility".to_string(), + status: "pass".to_string(), + severity: "required".to_string(), + message: format!("Platform version {} is compatible (>= {})", dist_version, min_version), + details: vec![serde_json::json!({"dist_version": dist_version, "min_version": min_version})], + }, + Ok(false) => CheckResult { + id: "version.compatibility".to_string(), + status: "fail".to_string(), + severity: "required".to_string(), + message: format!( + "Platform version {} is below minimum required version {}", + dist_version, min_version + ), + details: vec![serde_json::json!({"dist_version": dist_version, "min_version": min_version})], + }, + Err(e) => CheckResult { + id: "version.compatibility".to_string(), + status: "fail".to_string(), // Parse errors must fail, not warn + severity: "required".to_string(), + message: format!("Invalid version format: {}", e), + details: vec![serde_json::json!({"dist_version": dist_version, "min_version": min_version, "error": e})], + }, + } +} + +/// Compare two semantic version strings. Build metadata does not affect precedence. +fn compare_versions(v1: &str, v2: &str) -> Result { + Ok(parse_semver(v1)? >= parse_semver(v2)?) +} + +#[derive(Debug, Eq, PartialEq)] +struct SemVer { + core: [u64; 3], + prerelease: Vec, +} + +#[derive(Debug, Eq, PartialEq)] +enum Identifier { + Numeric(u64), + Text(String), +} + +impl Ord for SemVer { + fn cmp(&self, other: &Self) -> std::cmp::Ordering { + self.core + .cmp(&other.core) + .then_with(|| match (self.prerelease.is_empty(), other.prerelease.is_empty()) { + (true, true) => std::cmp::Ordering::Equal, + (true, false) => std::cmp::Ordering::Greater, + (false, true) => std::cmp::Ordering::Less, + (false, false) => self.prerelease.cmp(&other.prerelease), + }) + } +} + +impl PartialOrd for SemVer { + fn partial_cmp(&self, other: &Self) -> Option { + Some(self.cmp(other)) + } +} + +impl Ord for Identifier { + fn cmp(&self, other: &Self) -> std::cmp::Ordering { + match (self, other) { + (Self::Numeric(left), Self::Numeric(right)) => left.cmp(right), + (Self::Numeric(_), Self::Text(_)) => std::cmp::Ordering::Less, + (Self::Text(_), Self::Numeric(_)) => std::cmp::Ordering::Greater, + (Self::Text(left), Self::Text(right)) => left.cmp(right), + } + } +} + +impl PartialOrd for Identifier { + fn partial_cmp(&self, other: &Self) -> Option { + Some(self.cmp(other)) + } +} + +fn parse_semver(value: &str) -> Result { + let invalid = || format!("Invalid semantic version '{}'", value); + let (version, build) = value.split_once('+').map_or((value, None), |(v, b)| (v, Some(b))); + if let Some(build) = build { + if build.is_empty() || !valid_identifiers(build, false) { + return Err(invalid()); + } + } + let (core, prerelease) = version.split_once('-').map_or((version, None), |(v, p)| (v, Some(p))); + let parts: Vec<_> = core.split('.').collect(); + if parts.len() != 3 { + return Err(invalid()); + } + let mut numbers = [0; 3]; + for (index, part) in parts.iter().enumerate() { + if part.is_empty() + || (part.len() > 1 && part.starts_with('0')) + || !part.bytes().all(|byte| byte.is_ascii_digit()) + { + return Err(invalid()); + } + numbers[index] = part.parse().map_err(|_| invalid())?; + } + let prerelease = match prerelease { + None => Vec::new(), + Some(value) if !valid_identifiers(value, true) => return Err(invalid()), + Some(value) => value + .split('.') + .map(|part| { + if part.bytes().all(|byte| byte.is_ascii_digit()) { + part.parse().map(Identifier::Numeric).map_err(|_| invalid()) + } else { + Ok(Identifier::Text(part.to_string())) + } + }) + .collect::>()?, + }; + Ok(SemVer { + core: numbers, + prerelease, + }) +} + +fn valid_identifiers(value: &str, prerelease: bool) -> bool { + !value.is_empty() + && value.split('.').all(|part| { + !part.is_empty() + && part.bytes().all(|byte| byte.is_ascii_alphanumeric() || byte == b'-') + && (!prerelease + || !part.bytes().all(|byte| byte.is_ascii_digit()) + || part == "0" + || !part.starts_with('0')) + }) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_compare_versions_equal() { + assert_eq!(compare_versions("0.9.0", "0.9.0").unwrap(), true); + } + + #[test] + fn test_compare_versions_greater_minor() { + assert_eq!(compare_versions("0.10.0", "0.9.0").unwrap(), true); + } + + #[test] + fn test_compare_versions_less_minor() { + assert_eq!(compare_versions("0.9.0", "0.10.0").unwrap(), false); + } + + #[test] + fn test_compare_versions_greater_major() { + assert_eq!(compare_versions("1.0.0", "0.9.0").unwrap(), true); + } + + #[test] + fn test_compare_versions_patch_greater() { + assert_eq!(compare_versions("0.9.1", "0.9.0").unwrap(), true); + } + + #[test] + fn test_compare_versions_missing_patch() { + assert!(compare_versions("0.9", "0.9.0").is_err()); + assert!(compare_versions("0.9.0", "0.9").is_err()); + } + + #[test] + fn test_compare_versions_prerelease() { + assert_eq!(compare_versions("0.9.0-rc.1", "0.9.0").unwrap(), false); + assert_eq!(compare_versions("0.9.0", "0.9.0-rc.1").unwrap(), true); + assert_eq!(compare_versions("1.0.0-rc.2", "1.0.0-rc.1").unwrap(), true); + assert_eq!(compare_versions("1.0.0+build.2", "1.0.0+build.1").unwrap(), true); + } + + #[test] + fn test_compare_versions_invalid() { + assert!(compare_versions("invalid", "0.9.0").is_err()); + assert!(compare_versions("0.9.0", "invalid").is_err()); + assert!(compare_versions("0.9.0-01", "0.9.0").is_err()); + } + + #[test] + fn test_check_compatible_pass() { + let result = check_compatible("0.9.0", "0.9.0"); + assert_eq!(result.status, "pass"); + } + + #[test] + fn test_check_compatible_fail() { + let result = check_compatible("0.8.0", "0.9.0"); + assert_eq!(result.status, "fail"); + } + + #[test] + fn test_check_compatible_invalid_version_fails() { + let result = check_compatible("invalid", "0.9.0"); + assert_eq!(result.status, "fail"); + } + + #[test] + fn test_check_exact_pass() { + let result = check_exact("0.9.0", "0.9.0"); + assert_eq!(result.status, "pass"); + } + + #[test] + fn test_check_exact_fail() { + let result = check_exact("0.10.0", "0.9.0"); + assert_eq!(result.status, "fail"); + } + + #[test] + fn test_parse_version_section() { + let toml = r#" +[version] +platform_version = "1.2.3" # release +min_platform_version = "1.0.0" # baseline +tck_version = "0.5.0" +version_policy = "exact" +"#; + let policy = parse_version_section(toml).unwrap(); + assert_eq!(policy.platform_version, "1.2.3"); + assert_eq!(policy.min_platform_version, "1.0.0"); + assert_eq!(policy.tck_version, "0.5.0"); + assert_eq!(policy.version_policy, "exact"); + } + + #[test] + fn test_unknown_policy_fails() { + let policy = VersionPolicy { + version_policy: "unknown".to_string(), + ..Default::default() + }; + // Unknown policy should produce a fail status + let result = run(&create_test_config(), &policy).unwrap(); + assert_eq!(result.verdict, "NON-CONFORMANT"); + assert_eq!(result.checks[0].status, "fail"); + assert!(result.checks[0].message.contains("Unknown version policy")); + } + + fn create_test_config() -> crate::config::Config { + use crate::config::{ChecksConfig, Config, DistConfig, PathsConfig}; + use std::path::PathBuf; + + Config { + dist: DistConfig { + name: "test".to_string(), + version: "1.0".to_string(), + platform_version: "0.9.0".to_string(), + arch: "x86_64-linux".to_string(), + profile: "full".to_string(), + paths: PathsConfig { + sbom_file: PathBuf::from("test.json"), + headers_dir: None, + libs_dir: None, + }, + }, + checks: ChecksConfig::default(), + } + } +} diff --git a/tck/tck.config.example.toml b/tck/tck.config.example.toml new file mode 100644 index 00000000000..5924f402bc4 --- /dev/null +++ b/tck/tck.config.example.toml @@ -0,0 +1,67 @@ +# ******************************************************************************* +# Copyright (c) 2026 Contributors to the Eclipse Foundation +# +# See the NOTICE file(s) distributed with this work for additional +# information regarding copyright ownership. +# +# This program and the accompanying materials are made available under the +# terms of the Apache License Version 2.0 which is available at +# https://www.apache.org/licenses/LICENSE-2.0 +# +# SPDX-License-Identifier: Apache-2.0 +# ******************************************************************************* +# TCK Distribution Configuration Example +# +# Copy this file and customize for your distribution. The TCK runner will use +# these settings to locate your distribution's artifacts and determine which +# checks to run. +# +# Usage: +# cp tck.config.example.toml my-dist.toml +# # Edit paths to point to your distribution +# ./bin/score-tck run --config my-dist.toml --report ./report + +[dist] +# Human-readable name of your distribution +name = "acme-score-dist" + +# Version of your distribution +version = "1.0.0" + +# Platform version this distribution targets (must be compatible with TCK platform version) +# This should match the SCORE platform version you are building against +platform_version = "0.9.0" + +# Target architecture: x86_64-linux | aarch64-linux | qnx-aarch64 +arch = "x86_64-linux" + +# Conformance profile: full | minimal +# - full: all checks (SBOM + behavioral) +# - minimal: SBOM-only (no toolchain required) +profile = "full" + +[dist.paths] +# Path to your distribution's SPDX SBOM (required for SBOM check) +# Generate this from your build system or use the one produced by //:sbom +sbom_file = "./dist/sbom.spdx.json" + +# Path to public headers for static API check (optional) +headers_dir = "./dist/include" + +# Path to libraries for static API check (optional) +libs_dir = "./dist/lib" + +[checks] +# Comma-separated list of checks to run +# - sbom: Compare against golden SBOM (required components, license policy) +# - version: Validate platform version compatibility +# - behavioral: Run platform integration tests (requires [dist.build]) +enabled = ["sbom", "version"] + +# [dist.build] - Only needed for behavioral checks +# These settings tell the TCK how to build and run showcases against your distribution +# +# [dist.build] +# build_cmd = "bazel build --config=x86_64-linux //showcases/bin/cli" +# run_cli = "./bazel-bin/showcases/bin/cli" +# examples = ["LoggingApp Demo", "ComApiExample"] diff --git a/tck/tests/api_signatures.toml b/tck/tests/api_signatures.toml new file mode 100644 index 00000000000..89b9570d6cf --- /dev/null +++ b/tck/tests/api_signatures.toml @@ -0,0 +1,57 @@ +# ******************************************************************************* +# Copyright (c) 2026 Contributors to the Eclipse Foundation +# +# See the NOTICE file(s) distributed with this work for additional +# information regarding copyright ownership. +# +# This program and the accompanying materials are made available under the +# terms of the Apache License Version 2.0 which is available at +# https://www.apache.org/licenses/LICENSE-2.0 +# +# SPDX-License-Identifier: Apache-2.0 +# ******************************************************************************* +# API Signature Test Definitions +# +# This file defines the API surface that a SCORE distribution must expose. +# The TCK verifies that required headers exist with expected symbols. + +# ============================================================================== +# REQUIRED HEADERS +# ============================================================================== +# These headers MUST be present in the distribution's include directory. + +[headers] +# Core headers (score_baselibs) +"score/language/safecpp.hpp" = { required = true, module = "score_baselibs" } +"score/json/json.hpp" = { required = true, module = "score_baselibs" } +"score/string/string.hpp" = { required = true, module = "score_baselibs" } + +# Logging headers (score_logging) +"score/logging/logging.hpp" = { required = true, module = "score_logging" } +"score/logging/console_logger.hpp" = { required = true, module = "score_logging" } +"score/logging/dlt_logger.hpp" = { required = false, module = "score_logging", note = "DLT optional for non-automotive profiles" } + +# Communication headers (score_communication) +"score/com/com.hpp" = { required = true, module = "score_communication" } +"score/com/publisher.hpp" = { required = true, module = "score_communication" } +"score/com/subscriber.hpp" = { required = true, module = "score_communication" } + +# Persistency headers (score_persistency) +"score/persistency/kv_store.hpp" = { required = true, module = "score_persistency" } + +# Lifecycle headers (score_lifecycle) +"score/lifecycle/lifecycle.hpp" = { required = true, module = "score_lifecycle" } + +# Time headers (score_time) +"score/time/time.hpp" = { required = true, module = "score_time" } +"score/time/steady_clock.hpp" = { required = true, module = "score_time" } + +# ============================================================================== +# FORBIDDEN HEADERS +# ============================================================================== +# These headers MUST NOT appear in a SCORE distribution. +# They indicate leaked internal implementation details. + +[forbidden_headers] +"score/internal/" = { reason = "Internal headers must not be part of public API" } +"score/mw/impl/" = { reason = "Implementation details must not be exposed" } diff --git a/tck/tests/behavioral.toml b/tck/tests/behavioral.toml new file mode 100644 index 00000000000..9ad0d92d4fb --- /dev/null +++ b/tck/tests/behavioral.toml @@ -0,0 +1,103 @@ +# ******************************************************************************* +# Copyright (c) 2026 Contributors to the Eclipse Foundation +# +# See the NOTICE file(s) distributed with this work for additional +# information regarding copyright ownership. +# +# This program and the accompanying materials are made available under the +# terms of the Apache License Version 2.0 which is available at +# https://www.apache.org/licenses/LICENSE-2.0 +# +# SPDX-License-Identifier: Apache-2.0 +# ******************************************************************************* +# Behavioral Conformance Test Definitions +# +# This file defines the behavioral tests that a SCORE distribution must pass +# to be considered conformant. Tests reference the existing feature integration +# tests in feature_integration_tests/ directory. + +# ============================================================================== +# TEST SUITE CONFIGURATION +# ============================================================================== +[test_suite] +# Path to feature integration tests (relative to workspace root) +path = "feature_integration_tests" + +# Test runner: pytest +runner = "pytest" + +# ============================================================================== +# SHOWCASE TESTS (ITF - Integration Test Framework) +# ============================================================================== +# Tests from feature_integration_tests/itf/test_showcases.py + +[[tests]] +id = "showcase.com_api_example.deployed" +category = "showcase" +description = "ComApiExample is deployed and executable" +severity = "required" +pytest_path = "itf/test_showcases.py::test_com_api_example_app_is_deployed" + +[[tests]] +id = "showcase.com_api_example.running" +category = "showcase" +description = "ComApiExample runs successfully" +severity = "required" +pytest_path = "itf/test_showcases.py::test_com_api_example_app_is_running" + +# ============================================================================== +# REMOTE LOGGING TESTS +# ============================================================================== +# Tests from feature_integration_tests/itf/test_remote_logging.py + +[[tests]] +id = "logging.remote" +category = "logging" +description = "Remote logging functionality works" +severity = "required" +pytest_path = "itf/test_remote_logging.py" + +# ============================================================================== +# PERSISTENCY TESTS +# ============================================================================== +# Tests from feature_integration_tests/test_cases/tests/persistency/ + +[[tests]] +id = "persistency.datatype_support" +category = "persistency" +description = "Key-value store supports all required datatypes" +severity = "required" +pytest_path = "test_cases/tests/persistency/test_datatype_support.py" +partially_verifies = [ + "feat_req__persistency__support_datatype_value", + "feat_req__persistency__support_datatype_keys", + "feat_req__persistency__store_data", +] + +[[tests]] +id = "persistency.reset_to_default" +category = "persistency" +description = "Reset to default values works correctly" +severity = "required" +pytest_path = "test_cases/tests/persistency/test_reset_to_default.py" + +[[tests]] +id = "persistency.default_values" +category = "persistency" +description = "Default values are correctly initialized" +severity = "required" +pytest_path = "test_cases/tests/persistency/test_default_values.py" + +[[tests]] +id = "persistency.multiple_kvs" +category = "persistency" +description = "Multiple key-value stores per application work" +severity = "required" +pytest_path = "test_cases/tests/persistency/test_multiple_kvs_per_app.py" + +[[tests]] +id = "persistency.combined" +category = "persistency" +description = "Combined persistency requirements work" +severity = "required" +pytest_path = "test_cases/tests/persistency/test_combined_requirements.py" diff --git a/tests/toolchain/BUILD b/tests/toolchain/BUILD new file mode 100644 index 00000000000..3793cdd7d4f --- /dev/null +++ b/tests/toolchain/BUILD @@ -0,0 +1,28 @@ +# ******************************************************************************* +# Copyright (c) 2026 Contributors to the Eclipse Foundation +# +# See the NOTICE file(s) distributed with this work for additional +# information regarding copyright ownership. +# +# This program and the accompanying materials are made available under the +# terms of the Apache License Version 2.0 which is available at +# https://www.apache.org/licenses/LICENSE-2.0 +# +# SPDX-License-Identifier: Apache-2.0 +# ******************************************************************************* + +sh_test( + name = "linux_aarch64_elf_compatibility_test", + srcs = ["linux_aarch64_elf_compatibility_test.sh"], + args = ["$(location //showcases:showcases_pkg_tar)"], + data = ["//showcases:showcases_pkg_tar"], + tags = [ + "linux-aarch64", + "requires-linux-aarch64-toolchain", + ], + # Only run on Linux AArch64 platforms + target_compatible_with = [ + "@platforms//os:linux", + "@platforms//cpu:aarch64", + ], +) diff --git a/tests/toolchain/linux_aarch64_elf_compatibility_test.sh b/tests/toolchain/linux_aarch64_elf_compatibility_test.sh new file mode 100755 index 00000000000..09bde26facd --- /dev/null +++ b/tests/toolchain/linux_aarch64_elf_compatibility_test.sh @@ -0,0 +1,73 @@ +#!/usr/bin/env bash +# ******************************************************************************* +# Copyright (c) 2026 Contributors to the Eclipse Foundation +# +# See the NOTICE file(s) distributed with this work for additional +# information regarding copyright ownership. +# +# This program and the accompanying materials are made available under the +# terms of the Apache License Version 2.0 which is available at +# https://www.apache.org/licenses/LICENSE-2.0 +# +# SPDX-License-Identifier: Apache-2.0 +# ******************************************************************************* + +set -euo pipefail + +# Verify that all ELF binaries in the showcase payload are AArch64, require at +# most GLIBC_2.41, and have PT_LOAD alignment >= 16K. + +tar_path="$1" +tmpdir="$(mktemp -d)" +trap 'rm -rf "$tmpdir"' EXIT + +tar -xf "$tar_path" -C "$tmpdir" + +status=0 +elf_count=0 + +while IFS= read -r -d '' binary; do + if [[ ! -x "$binary" ]]; then + continue + fi + if ! readelf -h "$binary" >/dev/null 2>&1; then + continue + fi + + elf_count=$((elf_count + 1)) + bin_name="${binary#"$tmpdir"/}" + + if ! readelf -h "$binary" | grep -q 'Machine:.*AArch64'; then + echo "FAIL: $bin_name: expected AArch64 architecture" >&2 + status=1 + continue + fi + + glibc_version="$(readelf --version-info "$binary" 2>/dev/null | grep -oE 'GLIBC_[0-9]+\.[0-9]+' | sort -Vu | tail -n 1 || true)" + if [[ -n "$glibc_version" ]]; then + glibc_number="${glibc_version#GLIBC_}" + highest="$(printf '%s\n' "$glibc_number" 2.41 | sort -V | tail -n 1)" + if [[ "$highest" != "2.41" ]]; then + echo "FAIL: $bin_name: requires $glibc_version (> GLIBC_2.41)" >&2 + status=1 + fi + fi + + while IFS= read -r alignment; do + if (( alignment < 16384 )); then + echo "FAIL: $bin_name: PT_LOAD alignment $alignment < 16K" >&2 + status=1 + fi + done < <(readelf -lW "$binary" 2>/dev/null | awk '$1 == "LOAD" {print $NF}') +done < <(find "$tmpdir" -type f -print0) + +if (( elf_count == 0 )); then + echo "FAIL: no ELF binaries found in showcase payload" >&2 + status=1 +fi + +if (( status == 0 )); then + echo "PASS: $elf_count ELF binaries satisfy AArch64, GLIBC<=2.41, PT_LOAD>=16K" +fi + +exit "$status"