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関数を使った次の記法の略記法である
$ $(patsubst %.ts,%.js,$(x))
https://news.mynavi.jp/techplus/article/linux-328/
$@はshell変数の記法
https://se.cite.ehime-u.ac.jp/~aman/memo/bash/shell_prog1.html#4.2_shell_variable
特殊な変数
https://tex2e.github.io/blog/makefile/automatic-variables
実行
code:makefile
all:
echo "Hello world"
# > make
# echo "Hello world"
# Hello world
実行したcommadを出力しないようにするには、commandの頭に@をつける
code:make
all:
@echo "Hello world"
# > make
# Hello world
cf. 自動化のためのGNU Make入門講座 - makeを使ってみよう
代入
=の他に、:=と?=がある
一般的なprogram言語の代入に近いのが:=
=は再帰的に代入される
code:makefile
x := foo
y = $(x) bar # foo bar
x = hoge
all:
@echo $(y) # hoge bar
一種のマクロだと思えばいい
?=はNull合体代入演算子??=と同じ
Makefile の = と := と ?= (makeの基礎) - ハトネコエ Web がくしゅうちょう
SEC59 | GNU make - How to Use Variables
Makefileの解説
#2024-08-17 10:22:05
#2024-08-10 08:26:44
#2024-08-05 23:41:29
#2024-03-26 15:25:26
#2022-01-31 15:08:58