Edited at

今話題の Makefile を Scheme で書く!をやってみよう (Ubuntu で)

More than 5 years have passed since last update.

今巷で最もホットな話題は,あの Lisp 方言の Scheme を Makefile の中で使うって話です.

GNU make が 3 年ぶりにメジャーアップデートされ,そのいくつかの変更点の中で Guile って処理系を使って Scheme が記述出来るようになったよ〜,というのがあります.

BSD make の方,お許しください.

Lisp は神の言語 であり,それをあのしち面倒臭い Makefile の中で記述出来るようになったというのです.いやぁこれは素晴らしいですね.きっと素晴らしいに違いありません.

Ubuntu 13.10 がそろそろ出る頃ですが,今私のマシンは Ubuntu 13.04 なのでそれで話をします.

Ubuntu 13.04 で build-essentials パッケージをインストールすると GNU make 3.81 がインストールされます.なので Make 4.0 を先取りで試すために手動でビルドしましょう.野良ビルドはあんまりよろしくないような話も聞きますが (Gent○○方面から),まぁあんまり気にし過ぎてもしょうがないような気がします.

https://github.com/kaosf/ubuntu-setup/blob/d7d6c0ae5ef2d7b6cc37340fcdfc386165aa4288/make-4.0-setup.sh

ここに現時点での make のセットアップコマンドのログが置いてあります.make 4.0 を make 3.81 を使ってビルドする,ちょっと,こう,何と言うか楽しいですね.

echo 'export PATH=$HOME/local/bin:$PATH' >> $HOME/.zshenv # or $HOME/.bash_profile

source $HOME/.zshenv # or $HOME/.bash_profile

sudo apt-get install guile-2.0 guile-2.0-dev

mkdir -p $HOME/local/bin
mkdir -p $HOME/local/src
cd $HOME/local/src
wget http://ftp.gnu.org/gnu/make/make-4.0.tar.gz
tar xzf make-4.0.tar.gz
cd make-4.0
./configure --prefix=$HOME/local
make
make install

guile 2.0 のパッケージをインストールして (※guile-2.0guile-2.0-dev のどちらか片方は不要だったかもしれません.調べられないなう.誰かもし分かったら教えて下さい.)

ひとまずこれで ~/local/bin/make が出来上がり,今後 Makefile 内に Scheme のコードを記述することが出来ます.

make --version でバージョンが 4.0.0 になってることを確かめてみるといいかもです.

まず簡単に Scheme コードが書ける例を見てみましょう.


Makefile

$(guile "all:")

echo $(guile (string-append "unk" "ksy"))

これそのままコピペしたらあかんですよ.タブ文字を使って下さい.echo ... の前に.Makefile ってその辺しんどいね.

これで make コマンド実行してみましょう.unkksy と echo されましたか?

string-append という関数については自分でググって見てください.

$(guile ...) と書いたら ... の部分が Scheme のコードとして,Guile という処理系で処理されてそれがそのまま使えるんですね.すばらです!!

ただ,私の試した範囲ではさすがに

$(guile "all:\n\techo \"unkksy\"")

はダメでした.

make: *** No rule to make target 'echo', needed by 'all'.  Stop.

ってエラーでした.残念.

これ以上のことは試してません.

何か面白いことが出来たらいいですね.


References