// *Makefile

#contents

* 変数上書き

Makefileではなくmakeネタだが気にしない

 make VAR=VALUE

そんだけ

* makedepend

Makefileを書き換えるツール。
Makefileは改行で終わっていないと困ったことになるので注意。

 $ makedepend sourcefiles

* 特殊変数

|~ 特殊変数 |~ GNU Make |~ nmake |
| $@ | ターゲット | ターゲット |
| $< | 依存の1番目 | ターゲットより新しい依存(通常のルールでは使えない / サフィックスルールのみ?) |
| $? | ターゲットより新しい依存 | ターゲットより新しい依存 |
| $^ | 全ての依存(直接の) | |
| $+ | 全ての依存(直接の) | |

* 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 $@

トップ   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS