Makefile に依存関係とコンパイル方法を記述しておくこことで、コンパイルを自動化するツール。
ネタ元:
web上を検索するとCPPをC++コンパイラの指定に使っている例が散見されるので注意。
リンカは不明
LD だったり LINK だったり、LINK.o だったりと、
May 22, 2016 の GNU make Version 4.2 版マニュアル見る限りでは良く分からない。
前は LK とかも見かけた気がしてたんだが、今のマニュアルには見当たらなかった。
詳細は、自動変数を参照
- GNU Make Manual
- GNU make 日本語訳(Coop編) (GNU Make 3.77)
- 私的文書置場 / GNU Make 3.79.1 ドキュメント (Monday, 21 September 2009)
- O'REILLY / GNU Make 第3班 ※1
ネタ元:
- ※1: 組込みエンジニアの思うところ / 2016-08-27: GNU Make 第3版 日本語版(オライリー)のPDF版電子書籍の無料ダウンロード【マニュアル代わりにどうぞ】
AS | アセンブラ |
CC | C コンパイラ |
CPP | C プリプロセッサ |
CXX | C++ コンパイラ |
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 に直接渡すフラグを指定する。
C/C++ コンパイラには CFLAGS, CXXFLAGS でフラグを渡す。
リンカについては
LDFLAGS には -L のように ld を呼ぶコンパイラに渡すフラグ
LDLIBS には -l のように ld に直接渡すフラグを指定する。
$@ | ターゲットのファイル名(アーカイブ名) |
$% | アーカイブのターゲットメンバ名 |
$< | 最初の依存関係名 |
$? | ターゲットより新しい全ての依存関係名 |
$^ | 全ての依存関係名(重複なし) |
$+ | 全ての依存関係名(重複あり) |
$* | 暗黙のルールで一致した語幹 |
ディレクトリをなめる場合は以下のようにすれば良いらしい。
参考:
.PHONY: all $(SUBDIRS) all: $(SUBDIRS) $(SUBDIRS): $(MAKE) -C $@ただし $(PWD) は親の pwd、$(CURDIR) は再帰先の子の pwd になるらしいので注意が必要とのこと。
参考:
- いもあらい。/ 2010-05-24: 再帰的なMakefileの例。
- とあるエンジニアの備忘log / 2012-06-07: make の -C オプションについて
-f オプションで Makefile 以外の名前の入力を与えている時は、
$(MAKEFILE_LIST) で、ファイル名を取れる。
自己再帰は以下のようにすれば良いようだ。
$(MAKEFILE_LIST) で、ファイル名を取れる。
自己再帰は以下のようにすれば良いようだ。
foo: $(MAKE) -f $(firstword $(MAKEFILE_LIST)) bar参考:
- Stack Overflow / 2009-09-09: Getting the name of the makefile from the makefile
- GNU Make Manual / 6 How to Use Variables / 6.14 Other Special Variables
time は bash の内部コマンド扱いと言うか、正確には pipelines の予約語らしい。
で、少なくとも 2014-02-12 現在 cygwin64 の GNU Make 4.0 で試した範囲では、make が直接アクションを呼ぼうとした場合、例えば、
これを回避するには eval を使うと良いらしい。
また、ファイル名展開が含まれる場合には eval なしでも動く模様。
で、少なくとも 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*参考:
- github / elixir-lang / elixir / issue / make: time: command not found #439
- Bash Reference Manual # 3.2.2 Pipelines
- JM / bash(1) # パイプライン (Pipeline)
「GNU make 和訳」でググってたら、
2013 年の話なので今更なんだけど、
は!?って思ったらマジだった。
Lisp というところがいかにも GNU らしいけど、なんて変態なんだ。
凄ぇわ GNU make。
- 本の虫 / 2013-10-10: GNU Make 4.0にGNU Guileが組み込まれた
2013 年の話なので今更なんだけど、
は!?って思ったらマジだった。
- GNU Make manual / 12 Extending GNU make / 12.1 GNU Guile Integration
Lisp というところがいかにも GNU らしいけど、なんて変態なんだ。
凄ぇわ GNU make。
タグ
コメントをかく