この記事は、bashのソースを読みたいがコンパイルの仕方を知らない人向けに書きます。
bashは以下の手順でコンパイルできます。
$ wget https://ftp.gnu.org/gnu/bash/bash-5.1.tar.gz
$ tar -xzf bash-5.1.tar.gz
$ cd bash-5.1
$ CFLAGS="-g -O0" ./configure
$ make -j 7
この手順が完了すると、カレントディレクトリ内にbashという実行ファイルができています。
[追記]
akinomyogaさんから教えていただきました。
ソースを読むには、開発版のほうが適しているそうです。
(デバッグ用のコードやデバッグ用のmallocが有効になる。)
上記のコードの以下のように変更します。
$ git clone git://git.savannah.gnu.org/bash.git
$ cd bash
$ CFLAGS="-g -O0" ./configure
$ make -j 7
以下に各行の大まかな意味を書きます。
$ wget https://ftp.gnu.org/gnu/bash/bash5.1.tar.gz
このコマンドでbashのソースをダウンロードします。
wgetとはnetwork downloaderです。
詳しくはman wgetとかで調べるといいと思いますが、
適当に
$ wget https://google.com
とかをやってみると、何をやっているのか解ると思います。
$ tar -xzf bash-5.1.tar.gz
これでファイルを展開します。(man tarを参照)
$ cd bash-5.1
カレントディレクトリを変更します。
$ CFLAGS="-g -O0" ./configure
このコマンドで、Makeというビルドツールに使う
Makefileというファイルを生成します。
Makeは内部でgccを呼び出しています。
$ ./configure
だけでもMakefileは生成されますが、
コンパイル時に使うフラグを指定するために
$ CFLAGS="-g -O0" ./configure
とします。
フラグ -g を使うことで、コンパイルされるオブジェクトファイルにデバッグ情報を埋め込みます。
フラグ -O0 を使うことで、最適化レベルを最低にします。
gccはコンパイル時に最適化という処理を行っており、
このフラグがない場合、ソースコードとオブジェクトファイルの対応が
変わってしまい、ソースの追跡が難しいです。
$ make -j 7
ビルドします。
フラグ" -j n "を使うことで、マルチプロセスでビルドしてくれるため、ビルドが早く終わります。nは整数です
この場合は7を指定することで7つのプロセスで分割してビルドしています。
以上が終わると、カレントディレクトリ内にbashという実行ファイルができています。
すべてをもとに戻したい場合は
$ make clean
とすれば、実行ファイル、Makefileなどがすべて消えるので、またはじめからやり直せます。
適当なフラグを指定して、実験してみると何が起こっているのかわかります。
ビルド = コンパイルやリンクなど様々な処理を経て、実行ファイルを生成すること
コンパイル = ソースコードからリンクする前のオブジェクトファイルを生成すること