hack のためのネタ帳, etc,,,

Makefile に依存関係とコンパイル方法を記述しておくこことで、コンパイルを自動化するツール。

公式ページ等

コンパイラ等

ASアセンブラ
CCC コンパイラ
CPPC プリプロセッサ
CXXC++ コンパイラ

web上を検索するとCPPをC++コンパイラの指定に使っている例が散見されるので注意。

リンカは不明
LD だったり LINK だったり、LINK.o だったりと、
May 22, 2016 の GNU make Version 4.2 版マニュアル見る限りでは良く分からない。
前は LK とかも見かけた気がしてたんだが、今のマニュアルには見当たらなかった。

フラグ等

C プリプロセッサには CPPFLAGS で
C/C++ コンパイラには CFLAGS, CXXFLAGS でフラグを渡す。
リンカについては
LDFLAGS には -L のように ld を呼ぶコンパイラに渡すフラグ
LDLIBS には -l のように ld に直接渡すフラグを指定する。

自動変数

$@ターゲットのファイル名(アーカイブ名)
$%アーカイブのターゲットメンバ名
$<最初の依存関係名
$?ターゲットより新しい全ての依存関係名
$^全ての依存関係名(重複なし)
$+全ての依存関係名(重複あり)
$*暗黙のルールで一致した語幹
詳細は、自動変数を参照

再帰呼び出し

ディレクトリをなめる場合は以下のようにすれば良いらしい。
.PHONY: all $(SUBDIRS)
all: $(SUBDIRS)
$(SUBDIRS):
	$(MAKE) -C $@
ただし $(PWD) は親の pwd、$(CURDIR) は再帰先の子の pwd になるらしいので注意が必要とのこと。
参考:

処理中の Makefile のファイル名

-f オプションで Makefile 以外の名前の入力を与えている時は、
$(MAKEFILE_LIST) で、ファイル名を取れる。
自己再帰は以下のようにすれば良いようだ。
foo:
	$(MAKE) -f $(firstword $(MAKEFILE_LIST)) bar
参考:

time による実行時間計測

time は bash の内部コマンド扱いと言うか、正確には pipelines の予約語らしい。
で、少なくとも 2014-02-12 現在 cygwin64 の GNU Make 4.0 で試した範囲では、make が直接アクションを呼ぼうとした場合、例えば、
test:
	time cat stamp-h1
のようなアクションを書いていると
$ make test
...
time cat stamp-h1
make: time: コマンドが見つかりませんでした
Makefile:801: recipe for target 'test' failed
make: *** [test] Error 127||=

$ LANG=C make test
...
time cat stamp-h1
make: time: Command not found
Makefile:801: recipe for target 'test' failed
make: *** [test] Error 127
みたいな感じでエラーになる
これを回避するには eval を使うと良いらしい。
また、ファイル名展開が含まれる場合には eval なしでも動く模様。
test:
	eval time cat stamp-h1
test2:
	time cat stamp-h1*
参考:
GNU make 和訳」でググってたら、 なんて記事を見つけた。
2013 年の話なので今更なんだけど、
は!?って思ったらマジだった。 ruby → rake の真逆を行ってるというか、Matz lisp が make になるなら、make は lisp になる的なノリなんだろうか?
Lisp というところがいかにも GNU らしいけど、なんて変態なんだ。
凄ぇわ GNU make。
タグ

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Wiki内検索

フリーエリア

管理人/副管理人のみ編集できます