- 技術 💻
GNUとは?GNU/Linux・GPLの意味とBusyBox・Macとの違い
結論
GNU(グヌー)は、自由ソフトウェアだけで Unix 互換の OS を作るために、1983年にリチャード・ストールマンが始めたプロジェクトです。Linux のパソコンやサーバーで使う bash・ls・grep・sed・gcc・make の多くは GNU のソフトで、多くは GPL というライセンスで配られています。
この記事でわかること
- GNU・GNU/Linux・GPL の意味と、Linux との関係
- GNU 版と BusyBox・toybox・macOS 版で sed -i・date -d・ls が違う実行結果
- GPL・LGPL・AGPL で「何をすると公開義務が出るか」の表と、ライセンスの確かめ方
Linux と呼ばれている OS は、カーネル(OS の中核)が Linux で、その上で動くシェルやコマンド、C のライブラリの多くが GNU です。GNU プロジェクトはこの組み合わせを「GNU/Linux」と呼んでいます。
flowchart TD
A[使う人・アプリ] --> G[GNU のツール<br>bash・coreutils・grep・sed]
G --> C[GNU C ライブラリ<br>glibc]
C --> K[Linux カーネル]
K --> H[ハードウェア]
よく調べられることの答えを先にまとめます。
| 知りたいこと | 答え | 詳しい節 |
|---|---|---|
| GNU とは | 自由ソフトウェアで Unix 互換の OS を作るプロジェクトと、その OS の名前 | GNUとは(意味・読み方) |
| GNU の読み方 | グヌー(g を発音して1音節。動物のヌーの英名と同じつづり) | GNUとは(意味・読み方) |
| GNU/Linux とは | GNU のソフトと Linux カーネルを組み合わせた OS の呼び方 | GNU/Linuxとは |
| 自分の環境が GNU か | sed --version などに「GNU」と出るか、uname -o で確かめる |
GNUツールの確認方法 |
| Mac でコマンドが動かない | macOS の sed・date・ls は BSD 系で、GNU 版とオプションが違う | GNU版と他の版の違い |
| GPL とは | 改変版を配るときに同じ自由を引き継がせる「コピーレフト」のライセンス | GPLとは |
| GPL・LGPL・AGPL の違い | LGPL はライブラリ向けで条件が弱い。AGPL はネットワーク越しの利用者にもソースを渡す | GPL・LGPL・AGPLの違い |
| gcc で作ったソフトは GPL か | GCC ランタイムライブラリ例外があり、GPL でないプログラムも作れる | GCCで作ったプログラムとGPL |
確認環境:Ubuntu 24.04.5 LTS(uname -o は GNU/Linux)の上で、GNU coreutils 9.4・GNU bash 5.2.21・GNU grep 3.11・GNU sed 4.9・GCC 13.3.0・GNU Make 4.3・GNU tar 1.35・GNU C ライブラリ 2.39 の --version を実行しました。比べる相手は、apt-get download で取った .deb を作業用のフォルダーに展開しただけの BusyBox 1.36.1(busybox-static)、toybox 0.8.9、bmake 20200710(BSD 系の make)、gawk 5.2.1 で、システムには入れていません。macOS の sed・date・ls・stat は手元で動かせないため、Apple が公開しているソースコード(text_cmds-199・shell_cmds-329・file_cmds-479)とその man ページで、オプションの定義とエラーの文言を確かめました。歴史・考え方・ライセンスは GNU プロジェクトの公式ページと、Ubuntu に入っている GPL・LGPL の原文で確かめました。図は mermaid 11.16.0 で描画を確かめています(確認日 2026年10月29日)。この記事はライセンスの仕組みの説明で、法的助言ではありません。
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「GNUとは?GNU/Linux・GPLの意味とBusyBox・Macとの違い」
GNUとは(意味・読み方・名前の由来)
この節では、GNU という言葉が何を指すのか、読み方と名前の由来が分かります。
GNU は、自由ソフトウェア(使う人が実行・研究・改変・再配布できるソフト)だけで、Unix と互換性のある OS を作るプロジェクトであり、そのプロジェクトが作る OS の名前でもあります。 GNU プロジェクトの公式ページは、目標を「100% 自由ソフトウェアの Unix 互換のシステム」を作ることだと説明しています。
- 正式な意味:「GNU's Not Unix(GNU は Unix ではない)」の略です。略語の中に自分自身が入っている「再帰的な頭字語」で、Unix の考え方に敬意を払いつつ、Unix とは別物であることを表しています。
- 読み方:日本語では「グヌー」と書かれることが多いです。公式ページの注は、g を硬い音で発音し、1音節で読むと説明しています。英語の gnu はアフリカにいる動物「ヌー」のことで、GNU のロゴもヌーの頭です。
- 始めた人:リチャード・ストールマン(rms)。プロジェクトを支える非営利団体として、フリーソフトウェア財団(FSF)も設立しました。
「GNU」という言葉は、場面によって指すものが少し違います。
プロジェクト
1983年に告知された、自由ソフトウェアで OS を作る取り組み。FSF が支えている。
GNU プロジェクト
OS
GNU プロジェクトが作る Unix 互換の OS そのもの。カーネルに Linux を使ったものが GNU/Linux。
GNU システム
個々のソフト
GNU bash・GNU coreutils・GNU grep・GCC・GNU Make・GNU Emacs など、プロジェクトのパッケージ。
「GNU ○○」の名前
ライセンス
GNU GPL・LGPL・AGPL・FDL。GNU 以外のソフトでも広く使われている。
GNU ○○ License
GNUプロジェクトの歴史(1983年の告知からGNU/Linuxまで)
この節では、GNU がいつ、なぜ始まり、Linux とどう組み合わさったのかが年表で分かります。
GNU は Linux より前、1983年に始まりました。 ストールマンは、ソフトウェアのソースコードが非公開になり、使う人が自由に直したり共有したりできなくなっていく状況に反対し、自由なソフトウェアだけで使える OS を作ろうとしました。告知の文には、良心に反する非開示契約やソフトウェアの使用許諾契約に署名できない、という理由が書かれています。
| 年 | 出来事(GNU 公式ページの記述) |
|---|---|
| 1983年9月27日 | ストールマンが Usenet の net.unix-wizards などに GNU の最初の告知を投稿 |
| 1984年1月 | ストールマンが MIT を辞め、GNU のソフトを書き始める |
| 1984年9月 | GNU Emacs の開発を始め、1985年の早い時期に使えるようになる |
| 1985年 | GNU 宣言(GNU Manifesto)を書く。フリーソフトウェア財団(FSF)を設立 |
| 1989年・1991年 | GPL の第1版(1989年2月)、第2版(1991年6月)。日付は各ライセンスの本文から |
| 1990年まで | カーネル以外のほぼすべてがそろう。カーネルは Mach の上で動く GNU Hurd にすると決める |
| 1991年〜1992年 | リーナス・トーバルズが Linux カーネルを開発し、1992年に自由ソフトウェアにした。GNU と組み合わさり、完全に自由な OS ができる |
| 2007年6月29日 | GPL 第3版・LGPL 第3版 |
GNU が自分で作っていたカーネルの GNU Hurd は、開発が想定より難しく、公式ページによると2001年に動くようになったものの、一般の利用に耐えるところまでは届いていません。そのため、実際に使われている GNU の OS のほとんどは、カーネルに Linux を使っています。
自由ソフトウェアとは(4つの自由と「フリー」の意味)
この節では、GNU の土台にある「自由ソフトウェア」の定義と、オープンソースとの関係が分かります。
GNU のいう「フリー」は「無料」ではなく「自由」の意味です。 公式ページは「『自由ソフトウェア』は自由の問題であり、値段の問題ではありません」と書き、「ビール飲み放題(free beer)」ではなく「言論の自由(free speech)」の free だと説明しています。有料で売っても自由ソフトウェアになりえます。
自由ソフトウェアの定義は、次の4つの自由がそろっていることです(GNU 公式の定義を要約)。
- 0どんな目的でも実行する自由誰でも、どのコンピューターでも、開発者に連絡せずに使える
- 1仕組みを研究し、変更する自由そのためにソースコードを入手できることが前提になる
- 2コピーを再配布する自由改変の有無、料金の有無にかかわらず、ほかの人に配れる
- 3変更した版を配布する自由改良を公開して、ほかの人も恩恵を受けられるようにできる
オープンソースとの違い
「オープンソース」も、ほぼ同じ範囲のソフトを指す言葉です。GNU の公式ページは、2つの用語は「ほぼ同じ範囲のプログラムを指します」と認めたうえで、出発点が違うと説明しています。自由ソフトウェアは使う人の自由を倫理の問題として扱い、オープンソースは主に品質や信頼性といった実用上の利点を重く見る、という整理です。
GNU/Linuxとは(Linuxとの違いと呼び方)
この節では、Linux と GNU の役割の分担と、「GNU/Linux」という呼び方の理由が分かります。
Linux は、本来はカーネル(メモリや CPU をプログラムに割り当てる OS の中核)だけの名前です。 GNU の公式ページは「Linuxはカーネルです」と書き、カーネルだけでは役に立たず、通常は GNU と組み合わせて使われるので、この組み合わせを「GNU/Linux」と呼んでほしいと求めています。Debian のインストールガイドも、GNU/Linux のカーネルが Linux で、残りの大半は GNU プロジェクトのプログラムだと説明しており、Debian の正式名は「Debian GNU/Linux」です。
Linux(カーネル)
プロセス・メモリ・ファイル・デバイス・ネットワークを管理する
1991年にトーバルズが開発。今も kernel.org で開発
ライセンスは GPL 第2版のみ(システムコールの例外つき)
GNU(その上の大部分)
シェル(bash)・基本コマンド(coreutils)・grep・sed・tar
C ライブラリ(glibc)・コンパイラ(GCC)・make・gdb
多くは GPL 第3版以降、glibc は LGPL
手元の Ubuntu でも、OS の名前を出す uname -o は「GNU/Linux」を返しました。カーネルの名前(uname -s)は Linux です。
$ uname -o
GNU/Linux
$ uname -sr
Linux 6.18.44-fc-v185
GNU を使わない Linux もある
Linux カーネルを使っていても、GNU を含まないシステムがあります。 GNU の「GNU/Linux FAQ」は、Android は Linux カーネルを含むものの GNU のライブラリやコマンドを持たず、GNU/Linux とは大きく違うとしています。Android のコマンドは toybox です(toybox 公式サイトによると、2015年の Android Marshmallow から同梱)。コンテナでよく使われる Alpine Linux も、公式サイトで「musl libc と busybox を中心に作られている」と説明しています。こうした「Linux だが GNU ではない」環境で、この記事の後半の「コマンドの違い」が問題になります。
Ubuntu・Debian・Fedora などのディストリビューションの違いは、関連記事「Linuxディストリビューションとは|種類・違い・選び方を比較表で解説」で扱っています。
GNUツールの確認方法(--versionの実物)
この節では、自分の環境のコマンドが GNU 版かどうかを、どう確かめるかが分かります。
GNU のコマンドは --version を付けると、1行目に「(GNU coreutils)」「GNU bash」のように GNU の名前と版を出します。 GNU のコーディング規約は、すべてのプログラムが --version と --help の2つのオプションに対応すべきだと定めています。手元で実行した1行目です。
$ ls --version | head -1
ls (GNU coreutils) 9.4
$ bash --version | head -1
GNU bash, version 5.2.21(1)-release (x86_64-pc-linux-gnu)
$ grep --version | head -1
grep (GNU grep) 3.11
$ sed --version | head -1
sed (GNU sed) 4.9
$ gcc --version | head -1
gcc (Ubuntu 13.3.0-6ubuntu2~24.04.1) 13.3.0
$ make --version | head -1
GNU Make 4.3
$ tar --version | head -1
tar (GNU tar) 1.35
$ ldd --version | head -1
ldd (Ubuntu GLIBC 2.39-0ubuntu8.9) 2.39
続きの行には、ライセンスと保証についての決まった文が出ます。
$ sed --version
sed (GNU sed) 4.9
Packaged by Debian
Copyright (C) 2022 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
...
GNU sed home page: <https://www.gnu.org/software/sed/>.
General help using GNU software: <https://www.gnu.org/gethelp/>.
E-mail bug reports to: <bug-sed@gnu.org>.
- 「License GPLv3+」は「GPL 第3版、またはそれ以降の版」という意味です。「+」が無いと、その版だけ(only)になります。
- 「There is NO WARRANTY」は、GPL の無保証の条項にあたる文です。
- 著作権者が「Free Software Foundation, Inc.」になっています。GNU の公式ページによると、FSF は GNU のソフトの著作権の移譲を受け付けています。
GNU 版ではないものを見分ける
同じ Ubuntu の中でも、すべてが GNU ではありません。/bin/sh と awk の実体を確かめると、どちらも GNU 以外でした。
$ readlink -f /bin/sh
/usr/bin/dash
$ readlink -f /usr/bin/awk
/usr/bin/mawk
$ awk --version | head -1
mawk 1.3.4 20240123
BusyBox と toybox の sed --version は、GNU 版のふりをしない独特の答えを返しました。ls --version は BusyBox ではエラー、toybox では toybox 自身の版でした。
$ busybox sed --version
This is not GNU sed version 4.0
$ toybox sed --version
This is not GNU sed version 9.0
$ busybox ls --version
ls: unrecognized option '--version'
BusyBox v1.36.1 (Ubuntu 1:1.36.1-6ubuntu3.1) multi-call binary.
$ toybox ls --version
toybox 0.8.9
macOS の sed のソースコードでは、オプションの定義が "EHI:ae:f:i:lnru" で、--version のような長いオプションを持っていません。--version を付けてエラーになったら GNU 版ではない、と見分けられます。
GNU版と他の版の違い(sed -iの実行結果)
この節では、いちばんつまずきやすい sed -i(ファイルを直接書き換える)の違いが、実行結果で分かります。
GNU 版の -i は「後ろに付けた文字だけをバックアップの拡張子にする」、macOS 版の -i は「次の引数を必ずバックアップの拡張子として受け取る」という違いがあります。 このため、同じ1行が片方では動き、もう片方ではエラーになります。中身が apple・banana の2行の f.txt を、毎回作り直して試しました。
$ sed -i 's/apple/APPLE/' f.txt # GNU
[exit 0] f.txt: APPLE banana files: f.txt
$ sed -i '' 's/apple/APPLE/' f.txt # GNU(Mac 向けの書き方)
sed: can't read s/apple/APPLE/: No such file or directory
[exit 2] f.txt: apple banana files: f.txt
$ sed -i.bak 's/apple/APPLE/' f.txt # GNU
[exit 0] f.txt: APPLE banana files: f.txt f.txt.bak
$ sed -i .bak 's/apple/APPLE/' f.txt # GNU(-i と .bak の間に空白)
sed: -e expression #1, char 1: unknown command: `.'
[exit 1] f.txt: apple banana files: f.txt
$ busybox sed -i 's/apple/APPLE/' f.txt
[exit 0] f.txt: APPLE banana files: f.txt
$ busybox sed -i '' 's/apple/APPLE/' f.txt
sed: s/apple/APPLE/: No such file or directory
[exit 1] f.txt: apple banana files: f.txt
$ toybox sed -i '' 's/apple/APPLE/' f.txt
sed: s/apple/APPLE/: No such file or directory
[exit 1] f.txt: apple banana files: f.txt
$ busybox sed -i.bak 's/apple/APPLE/' f.txt # toybox も同じ結果
[exit 0] f.txt: APPLE banana files: f.txt f.txt.bak
GNU 版は -i '' の ''(空の文字列)を「空のスクリプト」として受け取り、's/apple/APPLE/' をファイル名だと思って探しに行きました。f.txt は書き換わっていません。
macOS 版で起きること(ソースコードで確認)
macOS の sed は、man ページで -i extension と定義され、ソースコードでも i:(引数が必須)になっています。そのため、GNU 向けの sed -i 's/apple/APPLE/' f.txt を Mac で打つと、's/apple/APPLE/' がバックアップの拡張子、f.txt がスクリプトとして扱われます。ソースコードのエラーの書式から、表示は次のようになります。
sed: 1: "f.txt": invalid command code f
「f」は f.txt の先頭の1文字で、sed の命令として解釈できなかったという意味です。man ページは、拡張子に空の文字列(-i '')を渡すとバックアップを作らないこと、ただしディスクがいっぱいのときなどに中身が壊れるおそれがあるので勧めないことも書いています。
sed -i を両方で動かす
sed -i 's/a/b/' f(Mac でエラー)や sed -i '' 's/a/b/' f(Linux でエラー)を、そのまま共有のスクリプトに書くsed -i.bak 's/a/b/' f && rm f.bak。拡張子を -i にくっつけて書くと、GNU・BusyBox・toybox で動き、macOS の定義でも拡張子として読まれる見分ける問い:「-i の直後に空白があるか」
sed の置換・削除・挿入の書き方そのものは、関連記事「sedコマンドの使い方|置換・削除・挿入の逆引きとmacOSとの違い(実行結果つき)」で扱っています。
date・ls・grep・awk・statでのGNU版との違い
この節では、sed 以外にもよく使うコマンドで、GNU 版だけにある機能と、他の版での結果が分かります。
date -d(日付の計算)
「1日前」「来月」のような英語の言い回しを -d で計算できるのは GNU 版だけでした。 BusyBox と toybox は、決まった形の日時と @秒数 は読めますが、相対的な表現は読めません。macOS の date は -d を持たず、代わりに -v(日時を前後にずらす)と -j -f(形式を指定して読む)を使います(man ページとソースコードの "f:I::jnRr:uv:z:")。
$ TZ=Asia/Tokyo date -d @0 '+%Y-%m-%d %H:%M:%S' # 3つとも同じ
1970-01-01 09:00:00
$ date -d '2026-10-29 -1 day' +%F # GNU
2026-10-28
$ busybox date -d '2026-10-29 -1 day' +%F
date: invalid date '2026-10-29 -1 day'
$ toybox date -d '2026-10-29 -1 day' +%F
date: bad date 2026-10-29 -1 day
$ date -v-1d +%F # Mac の書き方を GNU で
date: invalid option -- 'v'
Try 'date --help' for more information.
$ toybox date -v-1d +%F
date: Unknown option 'v-1d' (see "date --help")
$ busybox date -D '%Y/%m/%d' -d '2026/10/29' +%F # 入力の形を指定
2026-10-29
GNU 版の月の計算には注意が要ります。1月31日の「1か月後」は、2月31日を3月にくり上げた結果になりました。
$ date -d '2026-01-31 +1 month' +%F
2026-03-03
ls(オプションの位置と長いオプション)
GNU 版はオプションをファイル名の後ろに書いても読みますが、POSIX の決まりでは、最初のファイル名より後ろはすべてファイル名です。 GNU のコーディング規約も、引数の間のオプションを認めるのは POSIX ではなく GNU の拡張だと書いています。GNU 版でも環境変数 POSIXLY_CORRECT を付けると、POSIX の動きになりました。
$ ls d -l
total 8
-rw-r--r-- 1 root root 3 Oct 29 10:00 a.txt
drwxr-xr-x 2 root root 4096 Oct 29 10:00 sub
$ POSIXLY_CORRECT=1 ls d -l
ls: cannot access '-l': No such file or directory
d:
a.txt
sub
BusyBox と toybox の ls d -l は、GNU 版と同じく詳しい一覧を出しました。macOS の ls はソースコードのオプション定義が + で始まっており、最初のファイル名でオプションの読み取りを止める POSIX の動きです。長いオプションは版ごとに違いました。
| オプション | GNU coreutils 9.4 | BusyBox 1.36.1 | toybox 0.8.9 | macOS(man で確認) |
|---|---|---|---|---|
ls d -l(後ろに書く) |
読む | 読む | 読む | ファイル名として扱う |
--time-style=long-iso |
使える | unrecognized option | Unknown option | 無い(-D で書式指定) |
--group-directories-first |
使える | 使える | Unknown option | 無い |
| 色付き表示 | --color |
--color |
--color |
-G(--color も GNU 互換で受け付ける) |
ls -l の日付 |
Oct 29 10:00 | Oct 29 10:00 | 2026-10-29 10:00 | — |
grep -P・awk・stat・echo
$ grep -oP 'id=\K\d+' g.txt # GNU(Perl 互換の正規表現)
42
7
$ busybox grep -oP 'id=\K\d+' g.txt
grep: invalid option -- 'P'
$ toybox grep -oP 'id=\K\d+' g.txt
grep: Unknown option 'P' (see "grep --help")
$ busybox grep -oE 'id=[0-9]+' g.txt # -E は3つとも同じ結果
id=42
id=7
$ awk 'BEGIN{print gensub(/o+/,"0","g","foo boo")}' # Ubuntu の既定は mawk
awk: line 2: function gensub never defined
$ gawk 'BEGIN{print gensub(/o+/,"0","g","foo boo")}' # GNU awk
f0 b0
$ sh -c 'echo -e "a\tb"' # /bin/sh は dash
-e a b
$ bash -c 'echo -e "a\tb"'
a b
$ sh -c 'printf "a\tb\n"' # printf はどちらでも同じ
a b
stat -c '%s %n'(大きさと名前)は GNU・BusyBox・toybox の3つで「64 hello.c」と同じ結果でした。macOS の stat は -c を持たず(ソースコードのオプション定義は "f:FHlLnqrst:x")、stat -f '%z %N' と書きます。
1GNU 版は機能が多い
date -d の相対表現、grep -P、gawk の gensub、ls の長いオプションは GNU 版だけにあった。
2エラーの文言で版が分かる
invalid option・unrecognized option は GNU と BusyBox、Unknown option は toybox、invalid command code は macOS の sed。
3sh と bash は別物
Ubuntu の /bin/sh は dash。echo -e は sh では効かなかった。printf は同じ結果になった。
大きさと速さ(BusyBox・toybox との比較)
BusyBox と toybox は、1つの実行ファイルに多くのコマンドをまとめた「マルチコール」の形です。小さな機器向けに、大きさを優先しています。
100万行(約37MB)のテキストで、同じ処理の時間を5回ずつ測った中央値です(2コアの環境、出力はファイルへ)。結果の行数は3つとも同じ332,587行でした。
| 処理 | GNU | BusyBox | toybox |
|---|---|---|---|
grep -c 'status=ng' |
0.037秒 | 0.520秒 | 0.112秒 |
sed 's/status=/s=/' |
0.286秒 | 0.421秒 | 0.555秒 |
sort -k2 |
0.359秒 | 1.983秒 | 3.662秒 |
wc -l |
0.009秒 | 0.104秒 | 0.206秒 |
ほかのよく使うコマンドの使い方は、関連記事「Linuxコマンド一覧|100個をカテゴリ別に実行結果つきで解説」で扱っています。
GNU makeとBSD makeの違い(Makefileの書き方)
この節では、Makefile が「GNU make 専用の書き方」になっていると、BSD 系の make でどうなるかが分かります。
Linux の make は GNU Make、FreeBSD などの make は BSD make で、条件分岐や関数の書き方が違います。 GNU make の書き方の Makefile と、BSD make の書き方の Makefile を、両方の make で動かしました。BSD make は Debian の bmake を展開して使っています。
# GNU make の書き方
SRCS := $(wildcard *.c)
OBJS := $(SRCS:.c=.o)
VERSION := $(shell gcc -dumpversion)
ifeq ($(VERSION),)
$(error gcc not found)
endif
all: $(OBJS)
@echo "objs: $(OBJS) gcc=$(VERSION)"
%.o: %.c
@echo "compile $<"
# BSD make の書き方
SRCS != echo *.c
VERSION != gcc -dumpversion
.if empty(VERSION)
.error gcc not found
.endif
all:
@echo "srcs: ${SRCS} gcc=${VERSION}"
$ make -f GNUmakefile.test
compile hello.c
objs: hello.o gcc=13
$ bmake -f GNUmakefile.test
bmake: "/.../GNUmakefile.test" line 4: Missing dependency operator
bmake: "/.../GNUmakefile.test" line 5: Need an operator
bmake: "/.../GNUmakefile.test" line 6: Need an operator
bmake: Fatal errors encountered -- cannot continue
$ bmake -f BSDmakefile.test
srcs: hello.c gcc=13
$ make -f BSDmakefile.test
BSDmakefile.test:3: *** missing separator. Stop.
- GNU make の
ifeq・endifは、BSD make では読めませんでした。反対に、BSD make の.ifは GNU make では「missing separator」になりました。 VAR != コマンド(コマンドの結果を代入)は、GNU make 4.3 でも読めました。2行目までは通り、3行目の.ifで止まっています。- GNU make は、
GNUmakefileという名前のファイルをMakefileより先に読みます。同じフォルダーに両方を置くと、make ごとに読むファイルが分かれました。
$ ls
GNUmakefile Makefile
$ make
from GNUmakefile
$ bmake
from Makefile
GNU make だけで動く Makefile には GNUmakefile という名前を付けると、BSD make が読まないので、意図が伝わりやすくなります。
自動変数やパターンルールの書き方は、関連記事「Makefileの書き方|自動変数一覧とタスクランナー用テンプレート」で扱っています。
GPLとは(コピーレフトとGPLv2・GPLv3)
この節では、GNU のソフトの多くが使う GPL の考え方と、版による違いが分かります。
GPL(GNU General Public License、GNU 一般公衆利用許諾書)は、プログラムを配るときに、受け取った人にも同じ4つの自由を渡すことを条件にするライセンスです。 改変版を配る人も、ソースコードを同じ GPL で渡す必要があります。この仕組みを「コピーレフト」と呼びます。GNU の公式ページは、コピーレフトは著作権法を利用しながら、それを「ひっくり返して通常とは反対の目的のために使って」いると説明しています。
| 版 | 公開(本文の日付) | 主な特徴 | 使っている例 |
|---|---|---|---|
| GPL 第1版 | 1989年2月 | 最初の版 | — |
| GPL 第2版 | 1991年6月 | 長く広く使われた版 | Linux カーネル(第2版のみ)、BusyBox(第2版のみ)、mawk |
| GPL 第3版 | 2007年6月29日 | 特許の条項、機器での改変版の導入に要る情報(Installation Information)の提供、Apache 2.0 との両立 | GNU coreutils・bash・grep・sed・make・tar(すべて第3版以降) |
- 「第2版のみ」と「第2版以降」:GPL の本文は、「または、それ以降の版」と書かれたプログラムなら、FSF が出したそれ以降の版の条件を選べる、と定めています。Linux カーネルは kernel.org の文書で「GPL 第2版のみ」と明記しており、第3版の条件では配れません。
- Installation Information:GPL 第3版は、家電などの「ユーザー製品」にプログラムを組み込んで配るとき、改変版を導入して動かすのに必要な鍵や手順も渡す、と定めています。署名の検査で改変版を動かせなくする機器への対策です。
- ほかのライセンスとの両立:GNU のライセンス一覧は、Apache License 2.0 は GPL 第3版と両立するが、第2版とは両立しないとしています。MIT(Expat)・修正 BSD は GPL と両立します。
MIT・Apache・BSD など GPL 以外のライセンスとの比較と、表示の文例は、関連記事「OSSライセンスの種類一覧と違い|MIT・Apache・GPL比較表と表示文例」で扱っています。この記事は GNU のライセンス(GPL・LGPL・AGPL)に絞ります。
GPL・LGPL・AGPLの違いと公開義務が出る場面
この節では、3つの GNU のライセンスの違いと、「何をすると」ソースを渡す義務が出るのかが、GNU の公式 FAQ の範囲で分かります。
GPL の義務は「配布(convey)」したときに生じます。 GPL 第3版は「convey」を、ほかの人がコピーを作ったり受け取ったりできるようにする広め方と定義し、「コピーの移転を伴わない、コンピューターネットワークを通じた単なるやりとりは convey ではない」と書いています。そのすき間を埋めるのが AGPL です。
| ライセンス | 主な対象 | 義務が及ぶ範囲 | GNU の推奨 |
|---|---|---|---|
| GPL | ほとんどの GNU のプログラム | 配布した本体と、結合した著作物の全体 | ほとんどのプログラムに |
| LGPL | 一部のライブラリ(glibc など) | ライブラリ自体。リンクして使う側のプログラムには及ばない(差し替えの条件あり) | 一部のライブラリに限る |
| AGPL | ネットワークで使われるソフト | GPL の範囲に加え、ネットワーク越しに使う人にも改変版のソースを渡す | ネットワーク上で動くソフトに |
よくある場面ごとに、GNU の FAQ とライセンスの本文に書かれていることを並べます。個別の判断は契約や利用形態で変わるため、この表は目安で、法的助言ではありません。
| やること | GPL | LGPL | AGPL |
|---|---|---|---|
| 改変して社内だけで使い、外に配らない | 公開の義務なし | 公開の義務なし | 改変版を使う人がネットワーク越しにいれば、その人にソースを提供 |
| 改変して自社のサーバーで動かし、Web サービスとして提供 | 配布にあたらない(FAQ) | 配布にあたらない | 使う人全員にソースを受け取る機会を提供 |
| 実行ファイルを製品に入れて客に配る | 対応するソースを提供(同梱か、3年以上有効な書面の申し出など) | ライブラリ部分のソースと、差し替えて再リンクできる形 | GPL と同じ |
| 自分のプログラムに静的・動的リンクして配る | どちらも全体が GPL の条件(FAQ) | 動的リンクなら呼び出し側に及ばない。静的リンクは再リンクできる形で渡す | GPL と同じ |
| 別のプログラムとしてパイプ・ソケット・コマンドの引数でやりとり | 通常は別々のプログラムの間の通信の手段(FAQ) | 同じ | 同じ |
| GPL のプログラムを有料で売る | 売ってよい(FAQ) | 売ってよい | 売ってよい |
判断するときは、次の順に確かめると迷いにくくなります。
- 1使っているソフトのライセンスと版を確かめるGPL-2.0-only か GPL-3.0-or-later か。LGPL・AGPL か
- 2外に配るか(convey)を確かめる製品への組み込み・ダウンロード提供・客への納品は配布になりうる
- 3AGPL なら、ネットワーク越しに使わせるかを確かめる配らなくても、改変版をサーバーで使わせるとソースの提供が要る
- 4自分のコードとどうつながっているかを確かめるリンク・同じプロセス・パイプやソケットで別プログラム、のどれか
- 5迷う場合は社内の決まりと専門家に確かめるGNU の FAQ 自体も、法的助言ではないと明記している
BusyBox の公式サイトは、GPL 第2版での配布で求められることとして、実行ファイルと一緒にソースを渡す(ビルドに使った .config とスクリプトも含む)、3年間有効な書面の申し出を付ける、などを挙げ、実際にビルドに使ったソースと一致している必要があると書いています。機器に Linux と BusyBox を入れて出荷するときに、確かめておきたい点です。
なお、GPL のコードを取り込むと自社のコードまで公開しなければならなくなる、という意味で「GPL 汚染」と呼ばれることがありますが、GPL の義務は配布したときに、結合した著作物に及ぶものです。社内で使うだけなら公開の義務はなく、GNU の FAQ も「GPL は、改変した版の公開を求めていない」と書いています。
GCCで作ったプログラムはGPLになるか
この節では、GPL の GCC でコンパイルしたプログラムのライセンスがどうなるかが、手元の実物とライセンスの原文で分かります。
GCC でコンパイルしても、作ったプログラムが GPL になるわけではありません。 GCC がプログラムに組み込むことがある一部のヘッダーとランタイムライブラリには「GCC ランタイムライブラリ例外」が付いていて、GPL でないプログラム(プロプライエタリを含む)を作れるようにしています。Ubuntu に入っている GCC の copyright ファイルに、FSF の例外の原文がありました。
$ grep -A3 'The purpose of this Exception' /usr/share/doc/gcc-13-base/copyright
program. The purpose of this Exception is to allow compilation of
non-GPL (including proprietary) programs to use, in this way, the
header files and runtime libraries covered by this Exception.
GNU の FAQ も、プログラムの出力(コンパイラが作った実行ファイルなど)には、一般にそのプログラム自体の著作権が及ばないとしています。例外は、プログラムが自分のコードの一部を出力にコピーする場合で、そのコピーされた部分はそのプログラムのライセンスに従います。
手元で C のプログラムをコンパイルし、何とつながっているかを確かめました。
$ gcc -O2 -o hello hello.c && ./hello
hello, GNU
$ readelf -d hello | grep NEEDED
0x0000000000000001 (NEEDED) Shared library: [libc.so.6]
$ readelf -p .comment hello | grep GCC
[ 0] GCC: (Ubuntu 13.3.0-6ubuntu2~24.04.1) 13.3.0
$ ls -l hello hello-static # hello-static は gcc -static で作成
15960 hello
785384 hello-static
実行ファイルが動的にリンクしているのは GNU C ライブラリ(libc.so.6)で、そのライセンスは LGPL です(libc6 の copyright ファイル)。-static で静的にリンクすると、glibc の一部が実行ファイルに入り、大きさは約49倍になりました。LGPL のライブラリを静的リンクして配るときは、前の節の表のとおり、受け取った人がライブラリを差し替えて再リンクできる形で渡す条件があります。
ライセンスの確かめ方(copyrightファイルと--version)
この節では、手元のコマンドがどのライセンスで配られているかを、手順どおりに確かめる方法が分かります。
コマンドの実体を探す
readlink -f "$(command -v sed)" でリンクをたどり、本当のファイルの場所を出す。awk や sh はリンクの先が別のソフトのことがある。
どのパッケージのファイルか調べる
Debian・Ubuntu は dpkg -S /usr/bin/sed。パッケージ名(sed・dash・mawk など)が分かる。
copyright ファイルを読む
/usr/share/doc/パッケージ名/copyright の License: の行を見る。ファイルごとにライセンスが違うことがあるので、Files: の行と組で読む。
--version の表示と照らし合わせる
GNU のコマンドなら「License GPLv3+」の行が出る。版の「+」の有無も確かめる。
ライセンスの全文を確かめる
Debian・Ubuntu では、GPL・LGPL・Apache などの全文が /usr/share/common-licenses に入っている。
$ dpkg -S /usr/bin/sed /usr/bin/dash /usr/bin/mawk
sed: /usr/bin/sed
dash: /usr/bin/dash
mawk: /usr/bin/mawk
$ grep -nE '^(Files|License):' /usr/share/doc/sed/copyright | head -6
7:Files: *
10:License: GPL-3+
12:License: GPL-3+
21:Files: build-aux/install-sh
23:License: X11
47:Files: doc/*
主なパッケージの copyright ファイルの License: の行(最初の3つ)を並べました。
| パッケージ | GNU か | copyright の License |
|---|---|---|
| coreutils・bash・grep・make | GNU | GPL-3+ |
| sed | GNU | GPL-3+(一部 X11) |
| tar | GNU | GPL-3+(一部 LGPL-2.1+ など) |
| libc6(glibc) | GNU | LGPL(本文の形式で記載) |
| dash(/bin/sh) | GNU ではない | BSD-3-Clause・public-domain・GPL-2+ |
| mawk(awk) | GNU ではない | GPL-2.0-only(GPL だが GNU の作ではない) |
| busybox-static | GNU ではない | GPL 第2版(本文の形式で記載) |
| toybox | GNU ではない | 0BSD(一部 GPL-2) |
mawk や BusyBox は GPL ですが GNU のソフトではなく、toybox は著作権表示も求めない 0BSD です。「GPL=GNU」ではありません。
この環境の1,023個の copyright ファイルを数えると、GPL(LGPL を含む)に触れているのは747個でした。最初の License: の行で多かったのは LGPL-2.1+ と GPL-2+(各79個)、Expat(47個)、MPL-2.0(43個)、GPL-3+(39個)で、218個は機械で読める形式ではありませんでした。
よくあるエラーと誤解(GNU版を前提にしたスクリプト)
この節では、GNU 版を前提に書いたコマンドやスクリプトが別の環境で失敗したときの文言と、直し方が分かります。
| 表示された文言(原文) | 起きた場所 | 原因と直し方 |
|---|---|---|
sed: 1: "f.txt": invalid command code f |
macOS の sed(ソースで確認) | GNU 向けの sed -i 's/…/…/'。-i.bak の形にする |
sed: can't read s/apple/APPLE/: No such file or directory |
GNU sed | Mac 向けの sed -i ''。-i.bak の形にする |
date: invalid option -- 'v' |
GNU date・BusyBox | Mac 向けの date -v-1d。GNU では date -d '1 day ago' |
date: invalid date '1 day ago' |
BusyBox date | 相対表現を読めない。秒数で計算するか、決まった形の日時を渡す |
grep: invalid option -- 'P' |
BusyBox grep | Perl 互換の正規表現が無い。grep -oE と sed で書き直す |
ls: unrecognized option '--time-style=long-iso' |
BusyBox ls | GNU だけの長いオプション。ls の出力を加工しない書き方にする |
awk: line 2: function gensub never defined |
mawk(Ubuntu の既定の awk) | gensub は gawk だけ。gsub で書くか、gawk を明示する |
*** missing separator. Stop. |
GNU make に BSD の Makefile | .if などの BSD の書き方。make の種類を合わせる |
-e a b(-e がそのまま表示) |
dash(/bin/sh) | echo -e は bash の機能。printf を使う |
よくある誤解
- 「GNU は Linux の会社・製品の名前」:GNU は自由ソフトウェアのプロジェクトと OS の名前で、Linux はカーネルの名前です。どちらも会社名ではありません。
- 「GPL のソフトを使うと、自分のソースも全部公開しなければならない」:義務が出るのは配布したとき(AGPL はネットワーク越しに使わせたときも)で、範囲は結合した著作物です。社内で使うだけなら公開の義務はありません。
- 「Linux ならどこでも同じコマンドが動く」:Alpine Linux のような BusyBox を使う環境や、Android の toybox では、GNU 版のオプションが動かないことがあります。
どの版を前提に書くか(判断表)
| 状況 | 書き方 | 理由 |
|---|---|---|
| Ubuntu・Debian・RHEL 系のサーバーだけで動かす | GNU 版のオプションを使ってよい | GNU coreutils・GNU sed が標準で入っている |
| Mac と Linux の両方の開発者が使う | POSIX の範囲で書く(sed -i.bak・printf) |
macOS は BSD 系のコマンドと zsh が既定 |
| Mac でも GNU 版を使いたい | Homebrew の gnu-sed などを入れ、gsed の名前で呼ぶ |
Homebrew の説明では gsed の名前で入り、sed として使うには PATH の設定が要る |
| Alpine などの小さなコンテナで動かす | BusyBox で動くか確かめる。要るなら GNU 版を追加 | date -d・grep -P などが無い |
| 日付の計算や複雑な処理 | Python など、どこでも同じ動きの言語に寄せる | date の違いが大きい |
| 製品の機器に入れて配る | ライセンスの一覧とソースの提供方法を先に決める | BusyBox・Linux は GPL 第2版 |
macOS の既定のシェルは、Apple サポートによると macOS 10.15 から zsh です。
よくある質問
Q. GNU とは何ですか? A. 自由ソフトウェアだけで Unix 互換の OS を作るために、1983年にリチャード・ストールマンが始めたプロジェクトと、その OS の名前です。bash・coreutils・grep・sed・GCC・make・glibc などを作っています。
Q. GNU と Linux の違いは何ですか? A. Linux はカーネル(OS の中核)の名前で、GNU はその上で動くシェル・コマンド・ライブラリなどの大部分です。両方を組み合わせた OS を、GNU プロジェクトは「GNU/Linux」と呼んでいます。
Q. 自分の Linux のコマンドが GNU 版か確かめるには?
A. sed --version や ls --version の1行目に「GNU」が出れば GNU 版です。BusyBox は「This is not GNU sed」と表示したり、--version がエラーになったりしました。readlink -f で実体を確かめるのも確実です。
Q. Mac の sed で -i がエラーになります。
A. macOS の sed は -i の次の引数を必ずバックアップの拡張子として読みます。sed -i.bak 's/a/b/' ファイル のように拡張子を -i にくっつけると、Mac と Linux の両方で動く形になります。
Q. GPL のソフトを会社で使っても問題はありませんか? A. 社内で使うだけなら、改変していても公開の義務はないと GNU の FAQ は書いています。外に配るとき、AGPL のソフトをネットワーク越しに使わせるときに義務が出ます。具体的な判断は、社内の決まりと専門家に確かめるのが確実です(この記事は法的助言ではありません)。
Q. GPL と LGPL の違いは? A. LGPL はライブラリ向けで、そのライブラリにリンクして使う側のプログラムには条件が及びません(静的リンクでは差し替えて再リンクできる形で渡す条件があります)。GPL のライブラリにリンクすると、全体が GPL の条件になります。
Q. AGPL はなぜあるのですか? A. GPL では、改変版をサーバーで動かして使わせるだけなら配布にあたらず、使う人にソースが渡りません。AGPL は、ネットワーク越しに使う人にも改変版のソースを受け取れるようにするため、GPL 第3版に条項を1つ加えたライセンスです。
Q. BusyBox を機器に入れて販売するとき、何が要りますか? A. BusyBox は GPL 第2版です。公式サイトは、ビルドに使ったソース(.config やスクリプトを含む)を実行ファイルと一緒に渡すか、3年間有効な書面の申し出を付けるなどの方法を挙げています。
まとめ
- GNU は「GNU's Not Unix」の略で、1983年に始まった自由ソフトウェアの OS のプロジェクト。Linux はカーネルで、組み合わせた OS を GNU は「GNU/Linux」と呼ぶ。
- GNU の free は「自由」の意味。4つの自由(実行・研究と変更・再配布・改変版の配布)がそろったものが自由ソフトウェア。
- GNU 版のコマンドは
--versionに「GNU」と出る。Ubuntu でも /bin/sh は dash、awk は mawk で GNU ではなかった。 - BusyBox・toybox・macOS では
sed -i・date -d・grep -P・ls の長いオプションが動かないか、意味が違った。両方で動かすならsed -i.bakや printf のように POSIX の範囲で書く。 - GPL の義務は配布したとき、AGPL はネットワーク越しに使わせたときにも出る。LGPL はリンクする側に及ばない。GCC で作ったプログラムは例外により GPL にならない。確かめるには copyright ファイルと公式の FAQ を読む(法的助言ではない)。
参考・出典
確認日はいずれも 2026年10月29日です。
- GNU プロジェクト「GNUについて」:https://www.gnu.org/gnu/about-gnu.ja.html
- GNU プロジェクト「最初の声明」(1983年9月27日):https://www.gnu.org/gnu/initial-announcement.ja.html
- GNU プロジェクト「GNUプロジェクト」(リチャード・ストールマン):https://www.gnu.org/gnu/thegnuproject.ja.html
- GNU プロジェクト「GNU宣言」:https://www.gnu.org/gnu/manifesto.ja.html
- GNU プロジェクト「自由ソフトウェアとは?」:https://www.gnu.org/philosophy/free-sw.ja.html
- GNU プロジェクト「なぜ、オープンソースは自由ソフトウェアの的を外すのか」:https://www.gnu.org/philosophy/open-source-misses-the-point.ja.html
- GNU プロジェクト「LinuxとGNUシステム」:https://www.gnu.org/gnu/linux-and-gnu.ja.html
- GNU プロジェクト「GNU/Linux FAQ」:https://www.gnu.org/gnu/gnu-linux-faq.ja.html
- GNU プロジェクト「ライセンス」:https://www.gnu.org/licenses/licenses.ja.html
- GNU プロジェクト「GNUライセンスに関してよく聞かれる質問」:https://www.gnu.org/licenses/gpl-faq.ja.html
- GNU プロジェクト「なぜアフェロGPLか」:https://www.gnu.org/licenses/why-affero-gpl.ja.html
- GNU プロジェクト「様々なライセンスとそれらについての解説」:https://www.gnu.org/licenses/license-list.ja.html
- GNU Coding Standards「Standards for Command Line Interfaces」:https://www.gnu.org/prep/standards/html_node/Command_002dLine-Interfaces.html
- GPL 第2版・第3版、LGPL 第2.1版・第3版の原文(Ubuntu 24.04 の /usr/share/common-licenses)
- GCC Runtime Library Exception 3.1 の原文(Ubuntu 24.04 の gcc-13-base の copyright ファイル)
- Debian「GNU/Linux とは?」(インストールガイド 1.2):https://www.debian.org/releases/stable/amd64/ch01s02.ja.html
- The Linux Kernel documentation「Linux kernel licensing rules」:https://docs.kernel.org/process/license-rules.html
- BusyBox「BusyBox is licensed under the GNU General Public License, version 2」:https://busybox.net/license.html
- toybox「Toybox License」:https://landley.net/toybox/license.html
- toybox 公式サイト:https://landley.net/toybox/
- Apple のソースコード text_cmds(sed)・shell_cmds(date)・file_cmds(ls・stat):https://github.com/apple-oss-distributions
- Alpine Linux「About」:https://alpinelinux.org/about/
- Homebrew Formulae「gnu-sed」:https://formulae.brew.sh/formula/gnu-sed
- Apple サポート「Mac で zsh をデフォルトのシェルとして使う」:https://support.apple.com/ja-jp/102360
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「GNUとは?GNU/Linux・GPLの意味とBusyBox・Macとの違い」
株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。
WE ARE HIRING
RJCで一緒に開発しながら、
成長を楽しみませんか?
RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!
- 127日年間休日
- 12時間平均残業時間
- 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!
ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。