FreeBSDの/usr/src/sbin/gbde.c

勉強目的でmake buildworldするとgbde.cでコンパイルエラーになると昔書いた。別にどうでも良かったのだけど、誰もいっこうに直さない。いい加減、buildworldってやつをやってみたかったので、エラーを直すことにした。
エラーの原因はgetoptのグローバル変数optargが宣言されていないことだった。これはMakefile

CFLAGS+= -I${.CURDIR}/../../sys

と書いているために、/usr/src/sys/unistd.hが使われてしまい、このunistd.hにはoptargが宣言されていないのだ。正しい作法を調べるのが面倒なので、横着をして/usr/sys/unistd.hに

#include "/usr/include/unistd.h"

を追加してしまった。そもそも、

% locate unistd.h

/usr/include/ssp/unistd.h
/usr/include/sys/unistd.h
/usr/include/unistd.h
/usr/src/contrib/gcclibs/libssp/ssp/unistd.h
/usr/src/include/unistd.h
/usr/src/sys/i386/ibcs2/ibcs2_unistd.h
/usr/src/sys/unistd.h

ってどんだけ〜。手作業でインストールしたシステムならいざ知らず。この辺の歴史的な経緯をよく知らないんだよな。
あと、他にもsbin以下でエラーが出るので横着して直していった。そうすると、buildworldは完了したのだけど、今度はbuildkernelががコンパイルエラーで失敗する。FreeBSDの流儀が良くわからん。