Makefile
Makefile に記された依存関係に基づいて
更新されたファイルの内関連のあるものだけを更新し、コンパイル時間を短くする
make は特定のプログラミング言語に依存したものではない
Makefile特有のマクロ、関数、変数なども用意されている
だから複雑mrsekut.icon
書き方
code:make
target名: 依存ファイル名1 依存ファイル名2 依存ファイル名3
コマンド行1
コマンド行2
コマンド行3
target名は一般的に生成されるファイルのファイル名にする
:のあと、依存ファイル名の間はスペース
依存ファイルに指定したファイルの内どれか一つでも更新されるとコマンドが実行される.
$ make <target名>
実行
$ make
target名を省略すると、makefileの先頭のtargetが実行される
$ make -f <makefile名>
例
code:makefile
hello: hello.o print.o
gcc -Wall -O2 -o hello hello.o print.o
hello.o: hello.c
gcc -c hello.c
.PHONY: clean
clean:
rm -f hello hello.o print.o
.PHONY cleanは$ make cleanした時に、「clean」という名前のファイル存在するとエラーになることを避けるために付与する
マクロ
HOGE = 文字列で定義して、
$(HOGE)か${HOGE}で呼び出す
code:makefile
SRCS = step0_repl.hs step1_read_print.hs
all: $(BINS)
内部マクロ
簡潔にまとまっていてめちゃくちゃ良い
$@
target名
code:makefile
hoge:
@echo $@ # => hoge
@D
@F
$<
依存ファイルの先頭のファイル名を表す
code:makefile
hoge: piyo.hs fuga.hs
@echo $< # => piyo.hs
<D
<F
$%
$?
$^
$+
$*
(@:%.js=%.elm)
target名の~~.jsを~~.elmに変える
コマンド(?)
@echo
これでdebugしてたmrsekut.icon
標準関数
$(関数名 引数,...) か ${関数名 引数,...} で呼び出す
word
$(word N,対象)
n番目の単語を返す
code:makefile
FILES := Spam Ham Eggs
all:
@echo $(word 2,$(FILES)) # => Ham
worldlist
単語のリストを返す
words
文字列の個数
code:makefile
FILES := Spam Ham Eggs
all:
@echo $(words $(FILES)) # => 3
wordと組み合わせて、文字列の一番最後の単語を取り出すのに使ったりする
code:makefile
FILES := Spam Ham Eggs
all:
@echo $(word $(words $(FILES)),$(FILES)) # => Eggs
shell
shell関数を利用する
強制的に再コンパイルする
makeは賢いのでコンパイル済みのやつは変更がないと再コンパイルしない
make: hoge is up to date
これを強制的に再コンパイルさせる
-Bをつける
@echodebugしている時に使ったmrsekut.icon
Suffix Rule
拡張子ごとにルールを定義するもの
code:makefile
SUFFIXES: .o .c
.c.o:
$(CC) $(CFLAGS) -c $<
具体例もあり、概要とノリがわかりやすかった