プログラマならlsのソースくらい読むべきという言葉を耳にしました。
私は自分のことをプログラマだと思っているのですが、そういえば他人のソースコードを読むことはあまりしません。
良い機会なのでlsのソースコードを眺めてみることにしました。
$ uname -a
Linux archvm 4.20.7-arch1-1-ARCH #1 SMP PREEMPT Wed Feb 6 18:42:40 UTC 2019 x86_64 GNU/Linux
私はArch LinuxをVirtualBoxで仮想化して使っています。
Arch Linuxには、Arch Build System(ABS)というパッケージ作成のための仕組みが用意されており、
これを使えば公式リポジトリやArch User Repository(AUR)に登録されているプログラムのコードを取得できそうです。
普段はpacmanで必要なプログラムをインストールするだけなので、ABSを使うのも初めてでしたが、
ArchWikiを頼りにコマンドを実行しました。
私はSVNよりもGitのほうが好みなので、aspを使用することにしました。
$ sudo pacman -S asp
$ mkdir tmp
$ cd tmp
$ asp checkout coreutils
問題なくチェックアウトされ、coreutilsディレクトリが作成されました。
$ cd coreutils/trunk/
リポジトリの中にはPKGBUILDファイルがあるだけです。
makepkgコマンドを実行すれば必要なソースコードを取得し、ビルドが実行されるはずです。
$ makepkg
==> Making package: coreutils 8.30-1 (XXXXXXXXXXX)
==> Checking runtime dependencies...
==> Checking buildtime dependencies...
==> Retrieving sources...
-> Found coreutils-8.30.tar.xz
-> Found coreutils-8.30.tar.xz.sig
==> Validating source files with md5sums...
coreutils-8.30.tar.xz ... Passed
coreutils-8.30.tar.xz.sig ... Skipped
==> Verifying source file signatures with gpg...
coreutils-8.30.tar.xz ... FAILED (unknown public key XXXXXXXXX)
==> ERROR: One or more PGP signatures could not be verified!
エラーになってしまいました。
確認するとソースコードは取得されていたので目的は達成したのですが、
少し気持ちが悪いので、ビルドを成功させることにしました。
ArchWikiのmakepkgのページを読むと、
署名チェックの内容がエラーメッセージと符号します。
PKGBUILDにvalidpgpkeysエントリが指定されていることも確認できたので間違いなさそうです。
鍵サーバーから公開鍵をインポートすることにします。
$ gpg --search-keys XXXXXXX(PKGBUILDのvalidpgpkeysに記載のあったkey)
該当する鍵の情報が表示されました。
表示された登録者の名前はPKGBUILDに記載されている内容と一致しています。
(署名の確認はこの程度でよいのでしょうか。少し不安が残りました)
$ gpg --recv-keys XXXXXXX(PKGBUILDのvalidpgpkeysに記載のあったkey)
無事、鍵をインポートすることができました。
あらためてビルドします。
$ makepkg
ビルドが成功しました。
すっきりしたところで本題に戻り、lsのソースコードを確認することにします。
$ nvim src/coreutils-8.30/src/ls.c
見事lsのソースコードを確認することができました。
さて、ここからが本番というところなのですが、 lsのソースコードは5000行を超えており、 c言語を雰囲気でしか読めない私はいきなり気持ちをくじかれてしまいました。
私はプログラマを名乗るにはまだまだ未熟なようです。
lsのコードリーディングは少しずつ進めることにします。
読み終わったら、また感想など投稿したいと思います。