CoreUtilsをビルドしてみる

CoreUtilsとは?

  • pwdとかlsとかのソースが詰まっている。
  • つまり、このソースを改変することで、lsとかの挙動が知ることが出来る。

goj/coreutils git@github.com:goj/coreutils.git

検証環境

OSXでビルドするのは結構インクルードファイルなどの関係で難しいと思う。 自分はVagrant上のCentOSでビルドしてみた。Ubuntuでもビルドしたことあるけど、比較的Linuxの方が簡単だと思う。

ビルドしてみる

$ git clone git@github.com:goj/coreutils.git
$ cd coreutils

$ ./bootstrap 

./bootstrap: Error: 'autoconf' version == 2.63 is too old
       'autoconf' version >= 2.64 is required
./bootstrap: Error: 'gperf' not found
./bootstrap: Error: 'makeinfo' not found
  • autoconfが古い。
  • gperfが無い。
  • makeinfoが無い。

  • autoconfを入れる

$ curl -O http://ftp.gnu.org/gnu/autoconf/autoconf-2.69.tar.gz
$ ./configure --prefix=/usr
$ make
$ sudo make install
  • その他を入れる
$ sudo yum install -y gperf
  • makeinfoはtexinfoってやつに入ってるらしい
$ sudo yum install -y texinfo
  • 再びbootstrapする。今度はgettextが古いと言われる
$ cd coreutils
$ ./bootstrap

./bootstrap: Bootstrapping from checked-out coreutils sources...
./bootstrap: consider installing git-merge-changelog from gnulib
./bootstrap: getting gnulib files...

autopoint: *** The AM_GNU_GETTEXT_VERSION declaration in your configure.ac               file requires the infrastructure from gettext-0.18.1 but this version               is older. Please upgrade to gettext-0.18.1 or newer.
autopoint: *** Stop.
  • gettextyumだったり、gettext-develを入れてもどうやら不可能らしい。大人しくソースからビルドする。0.18.2を入れてみたが、最新でも多分問題無いと思う。
$ wget http://ftp.gnu.org/pub/gnu/gettext/gettext-0.18.2.tar.gz
$ tar zxvf gettext-0.18.2.tar.gz
$ cd gettext-0.18.2
$ ./configure --prefix=/usr
$ make
$ sudo make install
  • すると今度はうまくいく。
$ ./bootstrap
$ ./configure
$ make
  • ビルドしたものからpwdを実行してみる
$ src/pwd
 /home/vagrant/vagrant_data/coreutils
  • pwdのソースを少しいじってみる
$ vim src/pwd.c
  • printfを入れてみる
int
main (int argc, char **argv)
{
  char *wd;
  /* POSIX requires a default of -L, but most scripts expect -P.  */
  bool logical = (getenv ("POSIXLY_CORRECT") != NULL);
  //printfを挟む
  printf("hogehogehogegehoeg\n");
  • 再びビルド
$ src/pwd

hogehogehogegehoeg
/home/vagrant/vagrant_data/coreutils
  • 反映されていることが分かる。