Makefile
Linux系なら追加package不要で使えるmakeコマンドの設定ファイル 結構便利
使い方
name:でコマンドを定義
$ make nameで実行できるようになる
code:1(Makefile)
name:
実行したいcommandを次の行に書く
先頭にタブを入れること
code:2(Makefile)
name:
command A
別のコマンドをそのまま使いたいときは、コマンド定義の:の後ろにそのコマンドを書く
code:2(Makefile)
name2: name
command B
区切りで複数指定できる
code:3(Makefile)
name3: name2 name
command C
意味
code:txt(makefile)
<name>: <requires>
<command>
<name>は「作成したいファイル」と見なされる
つまり、make <name>は「<name>というファイルを作成しろ」という意味
<requires>には、<name>の作成に必要なファイルを空白区切りで並べる
もし<requires>に書かれたファイルが存在しないか、それらの作成に必要なファイルより作成日時が古ければ、それらのファイルを再帰的に作成する
<command>には<name>を作成するためのコマンドを書く
makeは<command>を実行すれば<name>を作成できると解釈する
実際に作成されたかは確認しない
ここが重要
このことを元に、次のmakefileの挙動を見る
code:makefile
all: main
main: compile sub
echo "Hello!"
mainではHello!を表示するが、mainというファイルは作らない
そのため、常にmainが存在しないという判定を受けるため、allを実行するごとにmainが走る
別のコマンドをそのまま使いたいときは、コマンド定義の:の後ろにそのコマンドを書くと動く仕組みがこれ
compileとsubも同様に同名ファイルを作らないため、mainを実行するたびに実行されることになる
code:makefile
compile: main.o lib.o
gcc -o main.exe main.o lib.o
main.o: main.c
gcc -c main.o
lib.o: lib.c
gcc -c lib.o
main.oは同名ファイルを生成するため、新規作成時かmain.cが更新されたときのみ実行される
cacheを保持してビルド時間を短縮する効果を得ていると思えば良い lib.oも同様
code:makefile
sub:
echo "world!"
必要なファイル及びコマンドが無いときは、:の後は空欄にする
このときはsub:; echo "world!"と1行に短縮することもできる
変数定義
code:makefile
VALUE := 45
ANOTHOR_VALUE := $(VALUE)
$(VALUE)でVALUEを参照する
変数を置換しつつ参照することもできる
code:makefile
x := main.ts mod.ts
y := $(x:.ts=.js) # main.js mod.js
.tsをすべて.jsに変換する
$(x:%.ts=%.js)でもいい
$ $(patsubst %.ts,%.js,$(x))
特殊な変数
実行
code:makefile
all:
echo "Hello world"
# > make
# echo "Hello world"
# Hello world
実行したcommadを出力しないようにするには、commandの頭に@をつける
code:make
all:
@echo "Hello world"
# > make
# Hello world
代入
=の他に、:=と?=がある
一般的なprogram言語の代入に近いのが:=
=は再帰的に代入される
code:makefile
x := foo
y = $(x) bar # foo bar
x = hoge
all:
@echo $(y) # hoge bar
一種のマクロだと思えばいい