Yoctoでspdxファイルを作成する
概要
この記事は dev.toに投稿したCreate SPDX with Yoctoの日本語訳です。
この記事では、Poky(yocto)のspdxファイルを生成する機能(create-spdx.bbclass)の使いかたを紹介します。meta-spdxscannerでspdxファイルを生成する方法がありますが、ここでは説明しません。
spdxを生成する方法
まずはいつもどおり。
$ source oe-init-build-env
次に、conf/local.confを以下のように編集してください
+ INHERIT += "create-spdx" # required. enable to generate spdx files.
+ SPDX_PRETTY = "1" # optional. if "1", output spdx files will be formatted.
+ SPDX_INCLUDE_SOURCES = "1" # optional. if "1", output spdx files includes [file-information section](https://spdx.github.io/spdx-spec/v2.3/file-information/).
+ SPDX_ARCHIVE_SOURCES = "1" # optional. if "1", bitbake will create source files archive for each package.
+ SPDX_ARCHIVE_PACKAGED = "1" # optional. if "1", bitbake will create output binary archive for each package.
最後にビルドです
# for example, `bitbake core-image-minimal`
$ bitbake ${TARGET_IMAGE_NAME}
もし1つのパッケージを対象にspdxを生成したいのであれば、以下のコマンドになります
この場合、アウトプットは${WORKDIR}/spdxに出力されることに注意してください
# for example, `bitbake -c create_spdx gcc`
$ bitbake -c create_spdx ${TARGET_PACKAGE_NAME}
# if you want to confirm ${WORKDIR} of ${TARGET_PACKAGE_NAME}
# for example, `bitbake -e gcc | grep ^WORKDIR=`
$ bitbake -e ${TARGET_PACKAGE_NAME} | grep ^WORKDIR=
アウトプット
アウトプットは以下のとおりです
# if you want to confirm ${DEPLOY_DIR}
# for example, `bitbake -e core-image-minimal | grep ^DEPLOY_DIR=`
$ bitbake -e ${TARGET_IMAGE_NAME} | grep ^DEPLOY_DIR=
# for example, `cd tmp/deploy`
$ cd ${DEPLOY_DIR}
$ tree -d
.
├── images # Outputs
│ └── ${MACHINE}
│ ├── ${IMAGE_NAME}-${MACHINE}.spdx.index.json
│ ├── ${IMAGE_NAME}-${MACHINE}.spdx.json
│ └── ${IMAGE_NAME}-${MACHINE}.spdx.tar.zst
│
└── spdx # intermediate product. With the exception of some ARCHIVE files, they are just intermediate generated files and are not explained here.
${IMAGE_NAME}-${MACHINE}.spdx.json
これは${IMAGE_NAME}そのもののspdxファイルです
${IMAGE_NAME}-${MACHINE}.spdx.index.json
このファイルには、以下の条件に該当するパッケージのspdxファイルリストが含まれています。
- ターゲットイメージにインストールされたパッケージ
- ターゲットイメージにインストールされたパッケージが依存するパッケージ
${IMAGE_NAME}-${MACHINE}.spdx.tar.zst
このアーカイブファイルには、${IMAGE_NAME}-${MACHINE}.spdx.index.json に記載されている spdx ファイルが含まれています
このアーカイブに含まれるspdxファイルには以下の3種類が存在します
- ${PN}.spdx.json
- recipe-${PN}.spdx.json
- runtime-${PN}.spdx.json
これらのファイルに含まれるspdxのセクションのうち、file-information section
とrelationship information section
のみを以下で説明します。
その他のセクションはあまり特徴がないので、実際にファイルを見て確認してください。
もし、file-information section
やrelationship information section
がわからない場合は、以下のリンクを参照してください。
${PN}.spdx.json
- file-information section(
files
)- ターゲットパッケージによって作成され、ターゲットイメージにインストールされるファイル
- relationship information section(
relationships
)- このパッケージのソースファイルのthe file-information section への参照
- 外部ライブラリのヘッダファイルのthe file-information section への参照
recipe-${PN}.spdx.json
- file-information section(
files
)- ターゲットパッケージのソースファイル
- relationship information section(
relationships
)- ターゲットパッケージのソースファイルのthe file-information section への参照
- 外部ライブラリのレシピファイルの the file-information section への参照
runtime-${PN}.spdx.json
- file-information section(
files
)- なし
- relationship information section(
relationships
)- このパッケージがDEPENDSするパッケージの the package information section への参照
どのような情報がどこにあるのか
インストールされたパッケージ一覧
これはあんまりspdx関係ないけど
# for example, `cat tmp/deploy/images/qemux86-64/core-image-minimal-qemux86-64.manifest`
$ cat ${DEPLOY_DIR}/images/${MACHINE}/${TARGET_IMAGE_NAME}-${MACHINE}.manifest
パッケージのライセンス情報
# for example, `tar -I zstd -xvf core-image-minimal-qemux86-64.spdx.tar.zst`
$ tar -I zstd -xvf ${IMAGE_NAME}-${MACHINE}.spdx.tar.zst
# for example, `cat tmp/deploy/images/qemux86-64/libc6.spdx.json`
$ cat ${DEPLOY_DIR}/images/${MACHINE}/${TARGET_PACKAGE_NAME}.spdx.json
...
"packages": [
{
"SPDXID": "SPDXRef-Package-libc6",
"copyrightText": "NOASSERTION",
"downloadLocation": "NOASSERTION",
"hasFiles": [
"SPDXRef-PackagedFile-libc6-1",
"SPDXRef-PackagedFile-libc6-2",
"SPDXRef-PackagedFile-libc6-3",
"SPDXRef-PackagedFile-libc6-4",
"SPDXRef-PackagedFile-libc6-5",
"SPDXRef-PackagedFile-libc6-6",
"SPDXRef-PackagedFile-libc6-7",
"SPDXRef-PackagedFile-libc6-8",
"SPDXRef-PackagedFile-libc6-9",
"SPDXRef-PackagedFile-libc6-10",
"SPDXRef-PackagedFile-libc6-11",
"SPDXRef-PackagedFile-libc6-12",
"SPDXRef-PackagedFile-libc6-13",
"SPDXRef-PackagedFile-libc6-14",
"SPDXRef-PackagedFile-libc6-15",
"SPDXRef-PackagedFile-libc6-16"
],
"licenseConcluded": "NOASSERTION",
"licenseDeclared": "GPL-2.0-only AND LGPL-2.1-only",
"licenseInfoFromFiles": [
"NOASSERTION"
],
"name": "libc6",
"packageFileName": "libc6.tar.zst",
"packageVerificationCode": {
"packageVerificationCodeValue": "dc1d4ff83689b1922ab1a0b8dfaa80e40986c3b2"
},
"supplier": "Organization: OpenEmbedded ()",
"versionInfo": "2.35"
}
],
...
パッケージのソースファイルの情報
# for example, `tar -I zstd -xvf core-image-minimal-qemux86-64.spdx.tar.zst`
$ tar -I zstd -xvf ${IMAGE_NAME}-${MACHINE}.spdx.tar.zst
# for example, `cat tmp/deploy/images/qemux86-64/recipe-libffi.spdx.json`
$ cat ${DEPLOY_DIR}/images/${MACHINE}/recipe-${TARGET_PACKAGE_NAME}.spdx.json
...
"files": [
{
"SPDXID": "SPDXRef-SourceFile-libffi-1",
"checksums": [
{
"algorithm": "SHA1",
"checksumValue": "1541a69f581bcdf9405369d32fc834cb0d6aa621"
},
{
"algorithm": "SHA256",
"checksumValue": "e99c283675c59ad08620044e9b8758acb318dc1c93944009470b594db31e961b"
}
],
"copyrightText": "NOASSERTION",
"fileName": "not-win32.patch",
"fileTypes": [
"SOURCE"
],
"licenseConcluded": "NOASSERTION",
"licenseInfoInFiles": [
"NOASSERTION"
]
},
{
"SPDXID": "SPDXRef-SourceFile-libffi-2",
"checksums": [
{
"algorithm": "SHA1",
"checksumValue": "245bae99b2b5916865ee2e5c9dc9f817cf8771bb"
},
{
"algorithm": "SHA256",
"checksumValue": "328c7c2908c43ce42eefda072307d2fc7fe8f5ae1d21f7f9f0b832e469e21be9"
}
],
"copyrightText": "NOASSERTION",
"fileName": "0001-arm-sysv-reverted-clang-VFP-mitigation.patch",
"fileTypes": [
"SOURCE"
],
"licenseConcluded": "NOASSERTION",
"licenseInfoInFiles": [
"NOASSERTION"
]
},
{
"SPDXID": "SPDXRef-SourceFile-libffi-3",
"checksums": [
{
"algorithm": "SHA1",
"checksumValue": "88f1017994a6dc390903d73474fd193b86038564"
},
{
"algorithm": "SHA256",
"checksumValue": "e4d016c7690f82469d7eb52487e56c3c26429c5400f7f86e056b12e54a746ad3"
}
],
"copyrightText": "NOASSERTION",
"fileName": "libffi-3.4.4/fficonfig.h.in",
"fileTypes": [
"SOURCE"
],
"licenseConcluded": "NOASSERTION",
"licenseInfoInFiles": [
"NOASSERTION"
]
},
...
パッケージのソースファイルそのもの
SPDX_INCLUDE_SOURCESとSPDX_ARCHIVE_SOURCESを "1 "に設定してください。
$ tar -I zstd -xvf ${DEPLOY_DIR}/spdx/${MACHINE}/recipes/recipe-${PN}.yst.zst
パッケージのビルド結果のバイナリそのもの
SPDX_ARCHIVE_PACKAGEDを "1" に設定してください.
$ tar -I zstd -xvf ${DEPLOY_DIR}/spdx/${MACHINE}/packages/${PN}.yst.zst
Discussion