ここしばらく上半期末の事務処理やら稲刈りやらを口実に執筆をサボっているうち、linux-6.
最近はあまりカーネルのソースコードを見ることがなかったので、6.
$ head linux-6.0/init/main.c
// SPDX-License-Identifier: GPL-2.0-only
/*
* linux/init/main.c
*
* Copyright (C) 1991, 1992 Linus Torvalds
...
linuxの利用許諾条件はGPL-2.
Software Package Data Exchange
ざっと調べたところを簡単に紹介すると、SPDXとは"Software Package Data Exchange"の略で、Linux Foundationが中心になって取り決めた、ソフトウェアのライセンスなどに関するメタ情報をやりとりするための規格だそうです。
Linuxを代表とするフリー/オープンソース・
一方、FOSSにはライセンスに関わる問題が発生しがちです。最近はライセンスに関する意識も高まってきたので、GPLなコードを組み込んだ商用ソフトウェアがソースコード開示請求された、といった話題はあまり聞かなくなったものの、何か新しいソフトウェアを作ろうとする際、ライブラリ等の部品として使いたいソフトウェアが利用元のソースコードの公開も求めるGPLなのか、リンクして使うには問題ないLGPLなのか、より制限の少ないBSDやApache、MITライセンスなのかは、特に商用ソフトウェアの開発において注意すべきポイントになります。
たいていのFOSSは、ソースコードを収めたディレクトリにそのコードを利用する際の条件
そこでSPDXでは、FOSSに使われているライセンスを広く収集、整理し、それらに識別子を付けて簡単に区別できるようにしました。SPDXのサイトには収集しているFOSSのライセンスの一覧表があります。
2022/
GPLやBSD、MIT、Apacheといったメジャーなライセンスのみならず、IPAやJPNIC、はてはbzip2やimlib、libtiffなど、そのソフトウェアだけしか使ってないようなライセンスまで収集、整理されているのには感心します。
上述のようにSPDXのサイトでは500の異なるライセンスが整理され、それぞれを一意に区別する識別子が振られているので、"COPYING"ファイルの写しを置かずとも、識別子だけで適用するライセンスを示すことができます。
多くのFOSSプロジェクトではソースコードのあるディレクトリに置いた一つの"COPYING"ファイルがプロジェクト全体に適用されるように考えています。しかしながら、linuxのような規模になってくると、
そのためSPDXでは、ファイル単位でライセンスを設定するよう、ソースコードの先頭行にコメント文として"SPDX-License-Identifier:"タグと適用されるライセンスの識別子
linux-6.0とSPDX
それでは実際にlinuxのソースコードにSPDXがどのように利用されているか調べてみましょう。執筆時点での最新版、linux-6.
$ find linux-6.0.5/ -type f | wc -l 77970
そのうち、"SPDX-License-Identifier:"のタグを持つファイルは62210ありました。
$ find linux-6.0.5/ -type f -print | xargs grep 'SPDX-License-Identifier:' | wc -l 62210
どのライセンスが採用されているのかを確認すると、当然のことながら大多数のファイルはGPL-2.
$ find linux-6.0.5/ -type f -print | xargs grep 'SPDX-License-Identifier:' | cut -f3 -d':' | sort | uniq -c | sort -nr 15587 GPL-2.0 11814 GPL-2.0-only 8918 GPL-2.0 */ 5797 GPL-2.0-or-later 4182 GPL-2.0-only */ 2536 GPL-2.0-or-later */ 2355 GPL-2.0+ ...
しかしながら、MITやBSD、ISCライセンスなどを採用しているファイルも散見されます。
645 MIT */ 611 GPL-2.0+ */ 528 (GPL-2.0 OR BSD-2-Clause) 458 MIT 363 GFDL-1.1-no-invariants-or-later 286 GPL-2.0-only OR BSD-2-Clause 284 ISC 258 BSD-3-Clause OR GPL-2.0
ISC
$ find linux-6.0.5/ -type f -print |xargs grep 'SPDX-License-Identifier:' | grep ISC linux-6.0.5/Documentation/process/license-rules.rst: SPDX-License-Identifier: ISC ... linux-6.0.5/drivers/net/wireless/ath/ath10k/ahb.c:// SPDX-License-Identifier: ISC linux-6.0.5/drivers/net/wireless/ath/ath10k/ahb.h:/* SPDX-License-Identifier: ISC */ linux-6.0.5/drivers/net/wireless/ath/ath10k/bmi.c:// SPDX-License-Identifier: ISC ... linux-6.0.5/drivers/net/wireless/broadcom/brcm80211/Makefile:# SPDX-License-Identifier: ISC linux-6.0.5/drivers/net/wireless/broadcom/brcm80211/brcmfmac/Makefile:# SPDX-License-Identifier: ISC ...
ISCはBIND9やISC DHCPの開発元ということもあってか、ネットワーク製品を開発している企業が提供したワイヤレスネットワーク用のドライバ類にISCライセンスを採用している例が多いようです。
少し変わったところではZlibライセンスを採用しているファイルもありました。
$ find linux-6.0.5/ -type f -print |xargs grep 'SPDX-License-Identifier:' | grep Zlib linux-6.0.5/LICENSES/deprecated/Zlib: SPDX-License-Identifier: Zlib linux-6.0.5/lib/zlib_dfltcc/dfltcc.c:// SPDX-License-Identifier: Zlib linux-6.0.5/lib/zlib_dfltcc/dfltcc.h:// SPDX-License-Identifier: Zlib linux-6.0.5/lib/zlib_dfltcc/dfltcc_deflate.c:// SPDX-License-Identifier: Zlib linux-6.0.5/lib/zlib_dfltcc/dfltcc_inflate.c:// SPDX-License-Identifier: Zlib linux-6.0.5/lib/zlib_dfltcc/dfltcc_util.h:// SPDX-License-Identifier: Zlib
これらはzlibがファイルシステムの圧縮等に用いられていたころ利用されたコードなものの、より高機能のxzやzstdが採用されたので、現在はたぶん使用されていません。そのため、SPDX的には現在も有効なライセンスと認められているものの、linux的にはdeprecated
この結果を見ると、
実のところ、SPDXはSBOM
BOM
ソフトウェア業界にもこのような仕組みを導入しよう、というのがSBOMの目標です。すなわち、ソフトウェア製品で使われている各種FOSSの名称や機能、開発元、バージョン情報等をBOMとして管理し、セキュリティ等の問題が見つかった場合、その影響範囲を見極め、迅速な対応が取れることを目指しています。
SBOMを実現するためには必要な情報を機械可読形式にして電子的にやりとりする必要があります。SPDX
SPDXの最初の仕様
Linusさんあたりには