なんか会社で技術発表だかっていうのがあって、なんか発表してくれって言われたので、「gccとmakeとscreenの紹介」という非常に趣味に走った発表をしてきた。Windowsな人はヒいていたに違いない。そして、その場のほとんどの人はWindowsな人であった。

  • そういうことするからキモオタは嫌われるんだYo!
  • いや、でも、「GCCでなんか話ないか」って話題振られたので、間違ってなかったと思うけど
  • screenはともかく、gccとmakeは使えるようになればWindowsな人でも便利に違いない

いや、うん、まあ、間違ってなかったと思うんだけど…

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


僕のMakefileテンプレはhigepon氏のに近い。

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)でファイルが無い場合を判断するテクニックは何で見たんだったかな…忘れたけど、何かで、LinuxMakefileを参考にした記憶がある。LinuxMakefileは色々勉強になるかと思う。


ただ、上のテンプレはディレクトリで分けたときと、クロスコンパイルに弱い。
僕は、あんまりディレクトリ分けないし、ディレクトリ分けちゃった時は、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に頼らないといけないのがややダサいけど。


と、いうわけで、次回はMakefileWikiをつくろう編に続く!!続くわけがない!!
こういうくだらない遊びにばっかりコンピュータを使うのはよくない。