makeコマンドのオプションについての続きになります。
また、makeについては以下の記事で紹介しています。
目次
- 1 実行するコマンドを表示しない (-sオプション)
- 2 実行するコマンドを表示(dry-runモード) (-nオプション)
- 3 更新が必要かどうか終了ステータスに保存 (-qオプション)
- 4 全てのデバッグ情報を表示 (-dオプション)
- 5 デバッグ情報を指定し表示 (--debugオプション)
- 6 makeのトレース情報を表示 (--traceオプション)
- 7 makeのデータベースを出力 (-pオプション)
- 8 未定義変数の参照時に警告を表示 (--warn-undefined-variablesオプション)
- 9 指定されたファイルを変更されていると仮定 (-Wオプション)
- 10 インクルードするmakefileのディレクトリの指定 (-Iオプション)
- 11 レシピの並列実行 (-jオプション)
- 12 並列実行時の出力メッセージをグループ化 (-Oオプション)
- 13 参考
実行するコマンドを表示しない
(-sオプション)
-sオプションを用いると、makeで実行するコマンドのエコーを表示しません。
makefile
1 2 3 4 5 |
target.txt : file.txt echo "target.txt process ..." file.txt : echo "file.txt process ..." |
コマンド例と実行結果
1 2 3 4 5 6 7 8 9 10 11 |
$ls makefile $make echo "file.txt process ..." file.txt process ... echo "target.txt process ..." target.txt process ... $ $make -s file.txt process ... target.txt process ... |
また、makefileでのコマンドの文頭に'@'をつけるとそのコマンドの部分ではコマンドのエコーが表示を抑制できます。
makefile
1 2 3 4 5 |
target.txt : file.txt @echo "target.txt process ..." file.txt : @echo "file.txt process ..." |
コマンド例と実行結果
1 2 3 4 5 |
$ls makefile $make file.txt process ... target.txt process ... |
実行するコマンドを表示(dry-runモード)
(-nオプション)
-nオプションを用いるとコマンドを実行しないで、実行されるコマンドを表示できます。
makefile
1 2 3 4 5 6 7 |
target.txt : file.txt echo "target.txt process ..." touch $@ file.txt : @echo "file.txt process ..." touch $@ |
コマンド例と実行結果
1 2 3 4 5 6 7 8 9 10 11 |
$ls makefile $ $make -n echo "file.txt process ..." touch file.txt echo "target.txt process ..." touch target.txt $ $ls makefile |
更新が必要かどうか終了ステータスに保存
(-qオプション)
-qオプションはquestionモードになり、makeでレシピの処理を行わず、出力もしません。
終了ステータスを確認することで、makeでの更新が必要であるかどうかやmakefileにエラーが存在するかを確認できます。
更新が必要ない場合は、終了ステータスが0に、
更新が必要な場合は、終了ステータスが1に、
エラーが起きた場合は、終了ステータスが2になります。
makefile
1 2 3 4 5 6 7 |
target.txt : file.txt echo "target.txt process ..." touch $@ file.txt : @echo "file.txt process ..." touch $@ |
コマンド例と実行結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
$ls makefile $make -q $echo $? 1 $ $make file.txt process ... touch file.txt echo "target.txt process ..." target.txt process ... touch target.txt $make -q $echo $? 0 $ $make --eval='error example' -q make: *** missing separator. Stop. $echo $? 2 |
全てのデバッグ情報を表示
(-dオプション)
-dオプションはmakeの全てのデバッグ情報を表示します。これは--debug=aと同じになります。
また、コマンド例では、デバッグ情報で表示される暗黙的なルールの情報を削除するために-Rオプションを利用しています。
makefile
1 2 3 4 5 6 7 |
target.txt : file.txt echo "target.txt process ..." touch $@ file.txt : @echo "file.txt process ..." touch $@ |
コマンド例と実行結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
$make -d -R GNU Make 4.1 Built for x86_64-pc-linux-gnu Copyright (C) 1988-2014 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Reading makefiles... Reading makefile 'makefile'... Updating makefiles.... Considering target file 'makefile'. Looking for an implicit rule for 'makefile'. No implicit rule found for 'makefile'. Finished prerequisites of target file 'makefile'. No need to remake target 'makefile'. Updating goal targets.... Considering target file 'target.txt'. File 'target.txt' does not exist. Considering target file 'file.txt'. File 'file.txt' does not exist. Finished prerequisites of target file 'file.txt'. Must remake target 'file.txt'. Putting child 0x24818a0 (file.txt) PID 3162 on the chain. Live child 0x24818a0 (file.txt) PID 3162 file.txt process ... Reaping winning child 0x24818a0 PID 3162 touch file.txt Live child 0x24818a0 (file.txt) PID 3163 Reaping winning child 0x24818a0 PID 3163 Removing child 0x24818a0 PID 3163 from chain. Successfully remade target file 'file.txt'. Finished prerequisites of target file 'target.txt'. Must remake target 'target.txt'. echo "target.txt process ..." Putting child 0x2482370 (target.txt) PID 3164 on the chain. Live child 0x2482370 (target.txt) PID 3164 target.txt process ... Reaping winning child 0x2482370 PID 3164 touch target.txt Live child 0x2482370 (target.txt) PID 3165 Reaping winning child 0x2482370 PID 3165 Removing child 0x2482370 PID 3165 from chain. Successfully remade target file 'target.txt'. |
デバッグ情報を指定し表示
(--debugオプション)
--debugオプションは表示するデバッグ情報を指定して表示できます。
表示できるデバック情報の種類は以下のようになります。複数のデバッグ情報を指定する場合は、記号をカンマ区切りまたはスペース区切りで指定します。ただし、スペース区切りの場合は記号をシェルによって解釈されないように--debug='v j'のように引用符で囲む必要があります。
デバッグ情報の種類
記号 | 意味 |
a (all) |
全てのデバック情報を出力(-dオプションと同等) |
b (basic) |
ターゲットの更新が必要かどうかを出力 |
v (verbose) |
basicに追加して更に詳しい情報を出力 |
i (implicit) |
ターゲットに対して暗黙的なルールの検索情報を出力 |
j (jobs) |
実行されるコマンドの詳細を出力 |
m (makefile) |
makefileについての情報を出力 |
n (none) |
現在有効になっているデバッグ情報をオフにする |
また、--debugオプションを用いた例で使用するmakefileは以下のようになります。
makefile
1 2 3 4 5 6 7 8 |
%.txt : @echo "$@ process ..." touch $@ target.txt : file.txt echo "target.txt process ..." touch $@ |
--debug=b (basic)
--debug=bオプションはターゲットの更新が必要かどうかのデバッグ情報を表示します。
コマンド例と実行結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
$make --debug=b GNU Make 4.1 Built for x86_64-pc-linux-gnu Copyright (C) 1988-2014 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Reading makefiles... Updating goal targets.... File 'target.txt' does not exist. File 'file.txt' does not exist. Must remake target 'file.txt'. file.txt process ... touch file.txt Successfully remade target file 'file.txt'. Must remake target 'target.txt'. echo "target.txt process ..." target.txt process ... touch target.txt Successfully remade target file 'target.txt'. |
--debug=v (verbose)
--debug=vオプションは--debug=bオプションの情報に加えて、さらに依存ファイルの情報についてのデバッグ情報を表示します。
コマンド例と実行結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
$make --debug=v GNU Make 4.1 Built for x86_64-pc-linux-gnu Copyright (C) 1988-2014 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Reading makefiles... Reading makefile 'makefile'... Updating goal targets.... Considering target file 'target.txt'. File 'target.txt' does not exist. Considering target file 'file.txt'. File 'file.txt' does not exist. Finished prerequisites of target file 'file.txt'. Must remake target 'file.txt'. file.txt process ... touch file.txt Successfully remade target file 'file.txt'. Finished prerequisites of target file 'target.txt'. Must remake target 'target.txt'. echo "target.txt process ..." target.txt process ... touch target.txt Successfully remade target file 'target.txt'. |
--debug=i (implicit)
--debug=iオプションは--debug=bオプションの情報に加えて、さらに暗黙的なルールの検索などのデバッグ情報を表示します。
コマンド例と実行結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
$make --debug=i GNU Make 4.1 Built for x86_64-pc-linux-gnu Copyright (C) 1988-2014 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Reading makefiles... Updating goal targets.... File 'target.txt' does not exist. File 'file.txt' does not exist. Looking for an implicit rule for 'file.txt'. Trying pattern rule with stem 'file'. Found an implicit rule for 'file.txt'. Must remake target 'file.txt'. file.txt process ... touch file.txt Successfully remade target file 'file.txt'. Must remake target 'target.txt'. echo "target.txt process ..." target.txt process ... touch target.txt Successfully remade target file 'target.txt'. |
--debug=j (jobs)
--debug=jオプションはmakeによって実行されるコマンドのプロセス情報などのジョブ情報についてのデバッグ情報を表示します。
コマンド例と実行結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
$make --debug=j Putting child 0x1fdf360 (file.txt) PID 3784 on the chain. Live child 0x1fdf360 (file.txt) PID 3784 file.txt process ... Reaping winning child 0x1fdf360 PID 3784 touch file.txt Live child 0x1fdf360 (file.txt) PID 3785 Reaping winning child 0x1fdf360 PID 3785 Removing child 0x1fdf360 PID 3785 from chain. echo "target.txt process ..." Putting child 0x1fdeed0 (target.txt) PID 3786 on the chain. Live child 0x1fdeed0 (target.txt) PID 3786 target.txt process ... Reaping winning child 0x1fdeed0 PID 3786 touch target.txt Live child 0x1fdeed0 (target.txt) PID 3787 Reaping winning child 0x1fdeed0 PID 3787 Removing child 0x1fdeed0 PID 3787 from chain. |
--debug=m (makefile)
--debug=mオプションは--debug=bオプションの情報に加えて、さらにmakefileの読み込みなどのデバッグ情報を表示します。
コマンド例と実行結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
$make --debug=m GNU Make 4.1 Built for x86_64-pc-linux-gnu Copyright (C) 1988-2014 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Reading makefiles... Updating makefiles.... Updating goal targets.... File 'target.txt' does not exist. File 'file.txt' does not exist. Must remake target 'file.txt'. file.txt process ... touch file.txt Successfully remade target file 'file.txt'. Must remake target 'target.txt'. echo "target.txt process ..." target.txt process ... touch target.txt Successfully remade target file 'target.txt'. |
makeのトレース情報を表示
(--traceオプション)
makeでファイルを生成するときに、レシピが定義されているmakefileのファイル名や行番号、生成する場合の利用が表示されます。
また、makefile行頭での'@'や.SILENTでコマンドのエコーが非表示になっているコマンドも表示されます。
makefile
1 2 3 4 5 6 7 |
target.txt : file.txt echo "target.txt process ..." touch $@ file.txt : @echo "file.txt process ..." touch $@ |
コマンド例と実行結果
1 2 3 4 5 6 7 8 9 |
$make --trace makefile:6: target 'file.txt' does not exist echo "file.txt process ..." file.txt process ... touch file.txt makefile:2: update target 'target.txt' due to: file.txt echo "target.txt process ..." target.txt process ... touch target.txt |
makeのデータベースを出力
(-pオプション)
-pオプションを用いると、makefileを処理した後に環境変数やルールの定義などのmakeのデータベースを出力します。
-qオプションと組み合わせるとmakeの処理を実行させずにmakeのデータベースを確認できます。
コマンド例では、環境変数をクリアするためにenvコマンドを通し、makeコマンドを-qオプションと暗黙的なルールをクリアする-Rオプションをつけて実行し、grepコマンドでコメント行や空行を削除して出力を整形しています。
makefile
1 2 3 4 5 6 7 |
target.txt : file.txt echo "target.txt process ..." touch $@ file.txt : @echo "file.txt process ..." touch $@ |
コマンド例と実行結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
$env -i make -p -q -R | grep -v -e '^#' -e '^$' <D = $(patsubst %/,%,$(dir $<)) ?F = $(notdir $?) .SHELLFLAGS := -c ?D = $(patsubst %/,%,$(dir $?)) @D = $(patsubst %/,%,$(dir $@)) @F = $(notdir $@) CURDIR := /home/ubuntu/test_makeoptions SHELL := /bin/sh MAKEFILE_LIST := makefile GNUMAKEFLAGS := MAKE_HOST := x86_64-pc-linux-gnu .FEATURES := target-specific order-only second-expansion else-if shortest-stem undefine oneshell archives jobserver output-sync check-symlink load %F = $(notdir $%) ^D = $(patsubst %/,%,$(dir $^)) MAKELEVEL := 0 MAKE = $(MAKE_COMMAND) MAKE_VERSION := 4.1 .DEFAULT_GOAL := target.txt %D = $(patsubst %/,%,$(dir $%)) MAKE_COMMAND := make .VARIABLES := *F = $(notdir $*) MAKEFLAGS = pqrR MFLAGS = -pqrR *D = $(patsubst %/,%,$(dir $*)) +D = $(patsubst %/,%,$(dir $+)) +F = $(notdir $+) MAKEFILES := <F = $(notdir $<) ^F = $(notdir $^) SUFFIXES := .INCLUDE_DIRS = /usr/include /usr/local/include /usr/include .RECIPEPREFIX := MAKE_TERMERR := /dev/pts/2 file.txt: @echo "file.txt process ..." touch $@ .SUFFIXES: makefile: target.txt: file.txt echo "target.txt process ..." touch $@ .DEFAULT: |
未定義変数の参照時に警告を表示
(--warn-undefined-variablesオプション)
makeで未定義変数を参照しても、通常、警告は表示されません。
--warn-undefined-variablesオプションは、makeで未定義変数を参照したときに警告を表示します。
makefile
1 2 3 4 5 6 7 |
target.txt : file.txt echo "target.txt process ..." touch $@ file.txt : @echo "$(var) process ..." touch $@ |
コマンド例と実行結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
$ls makefile $make --warn-undefined-variables makefile:6: warning: undefined variable 'var' process ... touch file.txt echo "target.txt process ..." target.txt process ... touch target.txt $ $rm file.txt target.txt $make process ... touch file.txt echo "target.txt process ..." target.txt process ... touch target.txt |
指定されたファイルを変更されていると仮定
(-Wオプション)
-Wオプションでファイルを指定すると、指定されたファイルが変更されていると仮定して、makeを実行します。
makefile
1 2 3 4 5 6 7 |
target.txt : file.txt echo "target.txt process ..." touch $@ file.txt : @echo "file.txt process ..." touch $@ |
コマンド例と実行結果
1 2 3 4 5 6 7 8 9 |
$ls file.txt makefile target.txt $make make: 'target.txt' is up to date. $ $make -W file.txt echo "target.txt process ..." target.txt process ... touch target.txt |
インクルードするmakefileのディレクトリの指定
(-Iオプション)
makefileで相対パスで記述されたファイルをインクルードを行うときに、ファイル検索を行うディレクトリとして、-Iオプションでインクルードディレクトリを指定できます。
makefile
1 |
include make.mk |
dir/make.mk
1 2 3 4 5 6 7 |
target.txt : file.txt echo "target.txt process ..." touch $@ file.txt : @echo "file.txt process ..." touch $@ |
コマンド例と実行結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
$ls -R .: dir makefile ./dir: make.mk $ $make -I dir file.txt process ... touch file.txt echo "target.txt process ..." target.txt process ... touch target.txt $ $ls dir file.txt makefile target.txt |
また、-Iオプションを利用しなくてもmakefileに単純にパスを記述してもファイルをインクルードできます。
makefile
1 |
include dir/make.mk |
コマンド例と実行結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
$ls -R .: dir makefile ./dir: make.mk $ $make file.txt process ... touch file.txt echo "target.txt process ..." target.txt process ... touch target.txt $ $ls dir file.txt makefile target.txt |
レシピの並列実行
(-jオプション)
-jオプションで数値を指定すると、指定した数だけmakeのレシピを同時に実行できます。
makefile
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
target.txt : file.txt file2.txt echo "$@ process ..." touch $@ file.txt : @echo "$@ process ...1" @echo "$@ process ...2" @echo "$@ process ...3" @echo "$@ process ...4" @echo "$@ process ...5" @echo "$@ process ...6" @echo "$@ process ...7" @echo "$@ process ...8" @echo "$@ process ...9" @echo "$@ process ...10" touch $@ file2.txt : @echo "$@ process ...1" @echo "$@ process ...2" @echo "$@ process ...3" @echo "$@ process ...4" @echo "$@ process ...5" @echo "$@ process ...6" @echo "$@ process ...7" @echo "$@ process ...8" @echo "$@ process ...9" @echo "$@ process ...10" touch $@ |
コマンド例と実行結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
$ls makefile $make -j2 file.txt process ...1 file2.txt process ...1 file.txt process ...2 file2.txt process ...2 file.txt process ...3 file2.txt process ...3 file.txt process ...4 file2.txt process ...4 file.txt process ...5 file2.txt process ...5 file.txt process ...6 file2.txt process ...6 file.txt process ...7 file2.txt process ...7 file.txt process ...8 file2.txt process ...8 file.txt process ...9 file2.txt process ...9 file.txt process ...10 file2.txt process ...10 touch file.txt touch file2.txt echo "target.txt process ..." target.txt process ... touch target.txt $ls file.txt file2.txt makefile target.txt |
並列実行時の出力メッセージをグループ化
(-Oオプション)
-jオプションでレシピを並列実行した場合、出力されるメッセージが分かりずらいものになる場合があります。
-Oオプションを用いると出力を同期して、レシピの処理の終了時などのタイミングでその出力をグループ化して表示できます。
-Oオプションでグループ化できる出力メッセージの種類には以下のようなものがあります。
グループ化の種類
記号 | 意味 |
none | コマンドの出力タイミングと同時に出力される (-jオプションのみの場合のデフォルト) |
line | コマンドの処理が完了した時点で出力される |
target | ターゲットの処理が完了した時点で出力される (-Oオプションで何も指定しない場合のデフォルト) |
recurse | 再帰的なmakeの処理が完了した時点で出力される |
コマンド例と実行結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
$make -j2 -O file.txt process ...1 file.txt process ...2 file.txt process ...3 file.txt process ...4 file.txt process ...5 file.txt process ...6 file.txt process ...7 file.txt process ...8 file.txt process ...9 file.txt process ...10 touch file.txt file2.txt process ...1 file2.txt process ...2 file2.txt process ...3 file2.txt process ...4 file2.txt process ...5 file2.txt process ...6 file2.txt process ...7 file2.txt process ...8 file2.txt process ...9 file2.txt process ...10 touch file2.txt echo "target.txt process ..." target.txt process ... touch target.txt $ $rm file* target.txt $make -j2 -Onone file.txt process ...1 file2.txt process ...1 file.txt process ...2 file2.txt process ...2 file.txt process ...3 file2.txt process ...3 file2.txt process ...4 file.txt process ...4 file.txt process ...5 file2.txt process ...5 file.txt process ...6 file2.txt process ...6 file.txt process ...7 file2.txt process ...7 file.txt process ...8 file2.txt process ...8 file.txt process ...9 file2.txt process ...9 file.txt process ...10 touch file.txt file2.txt process ...10 touch file2.txt echo "target.txt process ..." target.txt process ... touch target.txt |