// *Makefile #contents * 変数上書き make VAR=VALUE * makedepend Makefileを書き換えるツール。 Makefileは改行で終わっていないと困ったことになるので注意。 $ makedepend sourcefiles * 特殊変数 |~ 特殊変数 |~ GNU Make |~ nmake | | $@ | ターゲット | ターゲット | | $< | 依存の1番目 | ターゲットより新しい依存(通常のルールでは使えない / サフィックスルールのみ?) | | $? | ターゲットより新しい依存 | ターゲットより新しい依存 | | $^ | 全ての依存(直接の) | | | $+ | 全ての依存(直接の) | | * シェルに変数を渡す $$VAR * GNU make ** ターゲットに合わせて変数を定義 test: TEST=1 test: test.obj ** OSによって分岐 OS = ${shell uname} ifeq (${OS}, Linux) # Linuxなほげほげ endif ** ソースの取得 SRCS = ${shell find ${SRCDIR} -name '*.c'} ** ソースからオブジェクトの一覧を取得 OBJS = ${patsubst ${SRCDIR}/%.c, ${OBJDIR}/%.o, ${SRCS}} ** ソースからオブジェクトを生成するルール ${OBJDIR}/%.o: ${SRCDIR}/%.c @mkdir -p ${dir $@} ${CC} ${CFLAGS} -c -o $@ $< # ver D # # $* は % にマッチしたstem # ${OBJEXT} は .obj or .o ${OBJDIR}/%${OBJEXT}: ${SRCDIR}/%.d @mkdir -p ${dir $@} ${DMD} ${DFLAGS} -c -of$*${OBJEXT} -od${OBJDIR} $< ** 依存関係などの省力化 # Makefileの一部を生成する # #includeから生成した依存関係が書かれたファイル # gcc -M の出力を加工したもの include ${patsubst ${SRCDIR}/%.c, ${DEPDIR}/%.makefile, ${SRCS}} ${DEPDIR}/%.makefile: ${SRCDIR}/%.c @mkdir -p ${DEPDIR} @set -e; gcc -M $< \ | sed 's/${OBJDIR}\/$*\.o[ :]/$*.o $@ : /g' > $@; \ [ -s $@ ] || rm -f $@ @echo generate $@ ** 依存関係解決ファイルの作成 ver2 # -MMによりシステムのヘッダを出力しなくなる # -MTによりいちいちsedを通さなくて良くなる # %の前にディレクトリを指定したりできる include ${patsubst ${SRCDIR}/%.c, ${DEPDIR}/%.makefile, ${SRCS}} ${DEPDIR}/%.makefile: ${SRCDIR}/%.c @mkdir -p ${DEPDIR} @set -e; \ gcc -MM -MT '${OBJDIR}/$*.o $@' $< > $@; \ [ -s $@ ] || rm -f $@ @echo generate $@