Makefileを書こう
それ関連(?)でMakefileの話。
最近、なんかMakefileの話をよく見かけるような。
http://d.hatena.ne.jp/higepon/20050626/1119789542
http://d.hatena.ne.jp/yaneurao/20050910#p1
http://d.hatena.ne.jp/toge/20051004#1128436580
all: do-it-all BIN=key8 include Makefile.common CFLAGS=`sdl-config --cflags` -g -Wall -W LDFLAGS=`sdl-config --libs` $(BIN): $(OBJS) ifeq ($(wildcard .depend),.depend) do-it-all:$(BIN) include .depend else do-it-all: depend recursive recursive: make endif $(BIN): $(OBJS) gcc -o $@ $(OBJS) $(LDFLAGS) depend: gcc $(CFLAGS) -MM $(SOURCES) > .depend .PHONY: clean clean: rm -f $(OBJS) *~ .depend $(BIN)
若干違う点は、cleanしたあと、.dependも生成してくれる部分。$(wildcard)でファイルが無い場合を判断するテクニックは何で見たんだったかな…忘れたけど、何かで、LinuxのMakefileを参考にした記憶がある。LinuxのMakefileは色々勉強になるかと思う。
ただ、上のテンプレはディレクトリで分けたときと、クロスコンパイルに弱い。
僕は、あんまりディレクトリ分けないし、ディレクトリ分けちゃった時は、automakeに頼るような軟弱者なので、ディレクトリはどうでもいいんだけど、クロスコンパイルに弱いのはなんとかしたいところ。上のやつの場合、Mingwクロスコンパイル用に似たようなMakefileをコピペで作ったような覚えがある。
いや、じゃあ、全部automakeでやっちゃえばいいんじゃないか。とか思ったが、忘れよう。あれはあれで結構面倒だし。
と、いうような話はどうでもいい。君達はMakefileの実力を知っているか!?
Makefileの実力をなめてはいけない。LL侍に斬られるくらいの実力はあるのだよ。
dec=$(shell expr $(1) - 1) eq=$(shell if [ $(1) -eq $(2) ] ; then echo 1; fi) mul=$(shell expr $(1) '*' $(2)) sub=$(shell expr $(1) - $(2)) add=$(shell expr $(1) + $(2)) fact=$(if $(call eq, $(1), "1"), 1, $(call mul,$(call fact, $(call dec, $(1))),$(1))) fib=$(if $(call eq, $(1), "1")$(call eq, $(1), "2"), 1, $(call add,$(call fib,$(call sub, $(1), 1)),$(call fib,$(call sub, $(1), 2)))) all: @echo $(call fact, 10 ) @echo $(call fib, 10 )
このぐらいは、定義できる。
数値演算と比較でshellに頼らないといけないのがややダサいけど。
と、いうわけで、次回はMakefileでWikiをつくろう編に続く!!続くわけがない!!
こういうくだらない遊びにばっかりコンピュータを使うのはよくない。