あるプログラムを再コンパイルする方法を記述した makefile は、いろいろな使い方ができます。もっとも単純な使い方は、古くなった(更新が必要な)ファイルをすべて再コンパイルすることです。たいていの makefile は、引数を何もつけずに make を実行すると、ちょうどこの動作をするように書かれています。
しかし、一部のファイルだけを更新したいこともあるでしょう。あるいは別のコンパイラや別のコンパイラオプションを使いたいこともあるでしょうし、ファイルそのものは変更せず、どのファイルが古くなっているかを調べたいだけのこともあるでしょう。
make を実行するときに引数を与えることで、こうしたことや、その他多くのことを実現できます。
make の終了ステータスは、つねに次の3つの値のいずれかになります:
0 make が成功した場合、終了ステータスはゼロになります。
2 make が何らかのエラーに遭遇した場合、終了ステータスは2になります。このとき、個々のエラーを説明するメッセージが表示されます。
1 ‘-q’ フラグを使い、なおかつ make がいずれかのターゲットはまだ最新でないと判断した場合、終了ステータスは1になります。レシピを実行する代わりの動作を参照してください。
使用する makefile の名前を指定するには、‘-f’ または ‘--file’ オプションを使います(‘--makefile’ も同じ働きをします)。例えば、‘-f altmake’ は、altmake というファイルを makefile として使うように指示します。
‘-f’ フラグを何度も使い、その都度 ‘-f’ のうしろに引数を続けると、指定したすべてのファイルがまとめて makefile として使われます。
‘-f’ や ‘--file’ フラグを使わなかった場合は、デフォルトとして GNUmakefile、makefile、Makefile の順に試し、この3つのうち最初に存在するもの、あるいは生成できるものが使われます(Makefileの書き方を参照してください)。
ゴールとは、make が最終的に更新しようとするターゲットのことです。それ以外のターゲットも、ゴールの前提条件であったり、ゴールの前提条件の前提条件であったり、というふうに連なっている場合には、あわせて更新されます。
デフォルトでは、ゴールは makefile の中の最初のターゲットです(ピリオドで始まるターゲットは数に入れません)。そのため makefile は、最初のターゲットがプログラム全体(あるいは複数のプログラム)のコンパイルになるように書かれるのが普通です。makefile の最初のルールに複数のターゲットがある場合、デフォルトゴールになるのはそのルールの最初のターゲットだけであり、リスト全体ではありません。デフォルトゴールの選び方は、makefile の中で .DEFAULT_GOAL 変数を使って制御することもできます(その他の特別な変数を参照してください)。
また、make へのコマンドラインの引数によって、別のゴールを1つ、あるいは複数指定することもできます。ゴールの名前を引数として与えてください。複数のゴールを指定した場合、make はそれらを名前を挙げた順に1つずつ処理していきます。
makefile 内のどのターゲットでもゴールとして指定できます(ただし ‘-’ で始まる場合、または ‘=’ を含む場合は除きます。これらはそれぞれスイッチ、変数定義として解釈されてしまうためです)。さらに、makefile に載っていないターゲットでも、その作り方を示す暗黙のルールが make に見つかれば、ゴールとして指定できます。
make は、コマンドラインで指定されたゴールのリストを、特別な変数 MAKECMDGOALS に設定します。コマンドラインでゴールが何も与えられなかった場合、この変数は空になります。この変数は特別な状況でのみ使うべきものだという点に注意してください。
適切な使い方の一例は、clean ルールの実行中に .d ファイルを include してしまわないようにすることです(前提条件を自動生成するを参照してください)。これにより、make がせっかく生成した .d ファイルを直後に削除してしまう、という無駄を避けられます:
sources = foo.c bar.c ifeq (,$(filter clean,$(MAKECMDGOALS)) include $(sources:.c=.d) endif
ゴールを指定する使い道の一つは、プログラムの一部分だけ、あるいは複数あるプログラムのうちの1つだけをコンパイルしたい場合です。作り直したいファイルをそれぞれゴールとして指定してください。例えば、複数のプログラムを含むディレクトリで、makefile が次のように始まっているとしましょう:
.PHONY: all all: size nm ld ar as
もしあなたが size というプログラムの作業をしているなら、‘make size’ と打つことで、そのプログラムに関係するファイルだけを再コンパイルできます。
ゴールを指定するもう一つの使い道は、ふだんは作られないファイルを作ることです。例えば、デバッグ用の出力ファイルや、テスト用に特別にコンパイルされたバージョンのプログラムなどがあり、makefile にはそのルールがあるものの、デフォルトゴールの前提条件にはなっていない、というケースです。
ゴールを指定するさらにもう一つの使い道は、偽りのターゲット(Phony)(偽りのターゲット(Phony)を参照)や空のターゲット(イベントを記録する空のターゲットファイルを参照)に対応するレシピを実行することです。多くの makefile には、ソースファイル以外のすべてを削除する clean という名前の偽りのターゲットが含まれています。当然ながら、これは ‘make clean’ と明示的に要求したときにだけ実行されます。以下に、よく使われる偽りのターゲットおよび空のターゲットの名前を一覧で示します。GNU ソフトウェアパッケージで使われる標準的なターゲット名の詳細な一覧については、ユーザ向けの標準ターゲットを参照してください。
その makefile が知っているトップレベルのターゲットをすべて作ります。
make を実行することで通常作られるファイルを、すべて削除します。
‘clean’ に似ていますが、通常は再コンパイルしたくないと思われる一部のファイルは削除せずに残すことがあります。例えば、GCC の ‘mostlyclean’ ターゲットは libgcc.a を削除しません。これを再コンパイルする必要はめったになく、しかも多くの時間がかかるためです。
これらのターゲットはいずれも、‘clean’ よりも多くのファイルを削除するように定義されることがあります。例えば、コンパイルの準備として通常あなたが作る設定ファイルやリンクを削除する、といった具合です。makefile 自身がそれらのファイルを作れない場合であっても、削除はします。
実行可能ファイルを、ユーザがコマンドを探すときに通常検索するディレクトリにコピーします。また、その実行可能ファイルが使う補助ファイルがあれば、それらを実行可能ファイルが探しに行くディレクトリへコピーします。
変更されたソースファイルのリストを印刷します。
ソースファイルの tar ファイルを作成します。
ソースファイルのシェルアーカイブ(shar ファイル)を作成します。
ソースファイルの配布用ファイルを作成します。これは tar ファイル、shar ファイル、あるいはそれらを圧縮したもの、さらには上記のうち複数を組み合わせたものになることもあります。
このプログラム用のタグテーブルを更新します。
この makefile がビルドするプログラムに対してセルフテストを実行します。
makefile は、あるターゲットが最新かどうかを判断する方法と、各ターゲットを更新する方法を make に伝えます。しかし、ターゲットを更新することがつねに望みどおりの動作とは限りません。いくつかのオプションは、make に更新とは別の作業をさせるためのものです。
「何もしない(No-op)」。ターゲットを最新にするために必要なレシピを make に表示させますが、実際には実行しません。ただし、このフラグをつけても実行されるレシピがある点に注意してください(MAKE 変数の働きを参照してください)。また、include された makefile を更新するために必要なレシピも、やはり実行されます(Makefileが作り直される仕組みを参照してください)。
「タッチ(Touch)」。ターゲットを実際には変更せずに、最新であるとマークします。言い換えれば、make はターゲットを更新したふりをするだけで、中身は実際には変えず、更新時刻だけを書き換えます。
「質問(Question)」。ターゲットが最新かどうかを何も出力せずに調べますが、レシピは実行しません。更新が必要かどうかは終了コードに示されます。
「もし〜だったら(What if)」。‘-W’ フラグのそれぞれにはファイル名を続けます。指定されたファイルの実際の更新時刻はそのままに、make はそれらのファイルの更新時刻を現在時刻として記録します。‘-W’ フラグを ‘-n’ フラグと組み合わせて使えば、特定のファイルを変更したらどうなるかを確かめることができます。
‘-n’ フラグをつけると、make は通常なら実行するはずのレシピを表示しますが、たいていの場合それを実行はしません。
‘-t’ フラグをつけると、make はルール内のレシピを無視し、作り直す必要のあるターゲットそれぞれに対して、(実質的に)touch コマンドを使います。‘-s’ や .SILENT が使われていない限り、その touch コマンドも表示されます。なお速度のため、make は実際に touch プログラムを起動するわけではありません。その作業を直接行います。
‘-q’ フラグをつけると、make は何も表示せず、レシピも一切実行しませんが、対象となるターゲットがすでに最新である場合に限って終了ステータスコードとしてゼロを返します。終了ステータスが1なら、何らかの更新が必要だということです。make がエラーに遭遇した場合は終了ステータスが2になるので、エラーと「最新でないターゲット」を区別できます。
これら3つのフラグのうち2つ以上を、同じ make の起動で使うとエラーになります。
‘-n’、‘-t’、‘-q’ の各オプションは、‘+’ 文字で始まるレシピ行、または ‘$(MAKE)’ や ‘${MAKE}’ という文字列を含むレシピ行には影響しません。これらのオプションにかかわらず実行されるのは、‘+’ 文字を含む行、または ‘$(MAKE)’・‘${MAKE}’ という文字列を含む行だけだという点に注意してください。同じルール内の他の行は、それ自身が ‘+’ で始まるか、‘$(MAKE)’ や ‘${MAKE}’ を含んでいない限り、実行されません(MAKE 変数の働きを参照してください)。
‘-t’ フラグは、偽りのターゲット(Phony)(偽りのターゲット(Phony)を参照)が更新されるのを防ぎます。ただし、‘+’ で始まるレシピ行、または ‘$(MAKE)’ や ‘${MAKE}’ を含むレシピ行がある場合は別です。
‘-W’ フラグは、2つの機能を提供します:
make が何をするかを確かめることができます。
make が実際にレシピを実行しているときは、‘-W’ フラグによって、一部のファイルがあたかも変更されたかのように make をふるまわせることができます。このとき、それらのファイルのためのレシピは実際には実行されません。
なお、‘-p’ や ‘-v’ オプションを使えば、make 自身や使用中の makefile に関する別の情報を得られます(オプション一覧を参照してください)。
あるソースファイルを変更したものの、それに依存するファイルをすべて再コンパイルしたくはない、ということがあるかもしれません。例えば、多くのファイルが依存しているヘッダファイルに、マクロや宣言を1つ追加したとしましょう。make は安全側に倒すため、ヘッダファイルが少しでも変わったら、依存するすべてのファイルの再コンパイルが必要だと仮定します。しかし、それらは再コンパイルする必要がないとあなたには分かっていて、コンパイルが終わるのを待って時間を無駄にしたくない、というわけです。
ヘッダファイルを変更する前にこの問題が予想できるなら、‘-t’ フラグを使えます。このフラグは make に対し、ルール内のレシピを実行せず、代わりに最終更新日時を書き換えることでターゲットを最新とマークするように指示します。次の手順を踏みます:
make を実行したとき、ヘッダファイルの変更が再コンパイルを引き起こすことはありません。
もし、いくつかのファイルが本当に再コンパイルを必要とするタイミングで、すでにヘッダファイルを変更してしまっていたら、この方法はもう手遅れです。その場合は代わりに ‘-o file’ フラグを使えます。これは指定したファイルを「古い(old)」とマークするものです(オプション一覧を参照してください)。これにより、そのファイル自体は作り直されず、またそのファイルが変わったことを理由として他のものが作り直されることもなくなります。次の手順を踏みます:
‘=’ を含む引数は、変数の値を指定します。‘v=x’ は、変数 v の値を x に設定します。この方法で値を指定すると、makefile 内の同じ変数に対する通常の代入はすべて無視されます。これを、コマンドライン引数によってオーバーライド(上書き)されたと表現します。
この機能のもっとも一般的な使い方は、コンパイラに追加のフラグを渡すことです。例えば、きちんと書かれた makefile では、変数 CFLAGS が C コンパイラを実行する各レシピに含まれているので、foo.c というファイルは次のようにしてコンパイルされます:
cc -c $(CFLAGS) foo.c
したがって、CFLAGS にどんな値を設定しても、それは行われる各コンパイルに影響します。makefile には、おそらく CFLAGS の通常の値が、次のように指定されているでしょう:
CFLAGS=-g
make を実行するたびに、望むならこの値をオーバーライドできます。例えば、‘make CFLAGS='-g -O'’ と打てば、各 C コンパイルは ‘cc -c -g -O’ で行われます。(これは同時に、変数をオーバーライドする際に、その値に含まれる空白やその他の特殊文字を、シェルのクォートで囲んで扱う方法も示しています。)
変数 CFLAGS は、まさにこのように変更できるようにと用意された多くの標準変数のうちの1つにすぎません。完全な一覧は 暗黙のルールが使う変数を参照してください。
また、makefile をプログラムして、あなた独自の変数を追加で参照させることもできます。これにより、利用者は変数を変えることで makefile の動作の他の側面を制御できるようになります。
コマンドライン引数で変数をオーバーライドするとき、再帰展開変数と単純展開変数のどちらでも定義できます。上に示した例では再帰展開変数を作っています。単純展開変数を作るには、‘=’ の代わりに ‘:=’ または ‘::=’ と書きます。とはいえ、指定する値の中に変数参照や関数呼び出しを含めたいのでなければ、どちらの種類の変数を作っても違いはありません。
makefile が、あなたがオーバーライドした変数を変更できる方法が一つだけあります。それは override ディレクティブを使うことです。これは次のような形をした行です。‘override variable = value’(override ディレクティブを参照してください)。
通常、シェルコマンドの実行中にエラーが起きると、make はただちに作業を諦め、ゼロでないステータスを返します。それ以降、どのターゲットに対してもレシピは実行されません。エラーが起きたということは、ゴールを正しく作り直すことができないということを意味するので、make はそれが分かった時点ですぐに報告するのです。
しかし、たった今変更したばかりのプログラムをコンパイルしているときには、これは望みどおりの動作ではありません。むしろ、make には試せるだけのファイルをコンパイルさせて、できるだけ多くのコンパイルエラーを見せてほしいところです。
そういう場合には、‘-k’ または ‘--keep-going’ フラグを使うべきです。これは make に対し、諦めてゼロでないステータスを返す前に、処理中のターゲットの他の前提条件も引き続き検討し、必要なら作り直すように指示します。例えば、あるオブジェクトファイルのコンパイルでエラーが起きたあとでも、‘make -k’ は、それらをリンクすることがもはや不可能だと分かっていても、他のオブジェクトファイルのコンパイルを続けます。失敗したシェルコマンドのあとで処理を続けるのに加えて、‘make -k’ は、あるターゲットや前提条件ファイルの作り方が分からないと判明したあとも、できる限り処理を続けます。これは必ずエラーメッセージを引き起こしますが、‘-k’ がなければ致命的なエラーとなるところです(オプション一覧を参照してください)。
make の通常の動作は、あなたの目的がゴールを最新にすることだと想定しています。そのため、それが不可能だと make が分かった時点で、すぐに失敗を報告したほうがよい、というわけです。‘-k’ フラグは、本当の目的はプログラムに加えた変更をできるだけ多くテストすることであり、おそらくは互いに独立した複数の問題を見つけ出して、次のコンパイルを試みる前にそれらをまとめて修正したいのだ、ということを表しています。これが、Emacs の M-x compile コマンドがデフォルトで ‘-k’ フラグを渡す理由です。
状況によっては、make が独自の一時ファイルを作成する必要があります。これらのファイルは、make の実行中(再帰的に呼び出されたすべての make インスタンスを含みます)、かき乱されてはなりません。
環境変数 MAKE_TMPDIR が設定されている場合、make が作成するすべての一時ファイルはそこに置かれます。
MAKE_TMPDIR が設定されていない場合は、現在のオペレーティングシステムにおける一時ファイルの標準的な場所が使われます。POSIX システムの場合、これは環境変数 TMPDIR に設定された場所か、あるいはシステムのデフォルトの場所(例えば /tmp)になります。Windows では、まず TMP、次に TEMP、続いて TMPDIR が調べられ、最後にシステムのデフォルトの一時ファイル置き場が使われます。
このディレクトリは、あらかじめ存在していなければならない点に注意してください。さもないと make は失敗します。make はそのディレクトリを作成しようとはしません。
これらの変数は makefile の中から設定することはできません。GNU make は、makefile を読み始める前にこの場所へアクセスできる必要があるからです。
以下は、make が理解するすべてのオプションの一覧です:
これらのオプションは、他のバージョンの make との互換性のために無視されます。
すべてのターゲットを古い(更新が必要な)状態とみなします。GNU make は通常のアルゴリズムでターゲットとその前提条件を検討していきますが、こうして検討されたターゲットは、前提条件の状態にかかわらず、つねに作り直されます。無限再帰を避けるため、MAKE_RESTARTS(その他の特別な変数を参照)が0より大きい数に設定されている場合は、makefile を作り直すべきかどうかを検討する際にこのオプションが無効になります(Makefileが作り直される仕組みを参照してください)。
makefile を読み込む前にディレクトリ dir に移動します。複数の ‘-C’ オプションが指定された場合、それぞれは直前のものからの相対として解釈されます。‘-C / -C etc’ は ‘-C /etc’ と等価です。これは通常、make の再帰的な呼び出しで使われます(makeの再帰的な利用を参照してください)。
通常の処理に加えて、デバッグ情報を表示します。デバッグ情報は、どのファイルが作り直しの対象として検討されているか、どのファイルの時刻が比較され結果はどうだったか、どのファイルが実際に作り直す必要があるか、どの暗黙のルールが検討されどれが適用されたか、といった、make が何をすべきかをどう決めているかに関する興味深いことを、すべて教えてくれます。-d オプションは ‘--debug=a’(下記参照)と等価です。
通常の処理に加えて、デバッグ情報を表示します。出力のレベルや種類はさまざまに選べます。引数なしの場合は、「基本(basic)」レベルのデバッグを表示します。指定できる引数は以下のとおりです。判定されるのは最初の1文字だけで、値はカンマまたは空白で区切る必要があります。
a (all)すべての種類のデバッグ出力を有効にします。これは ‘-d’ を使うのと等価です。
b (basic)基本デバッグ。古いと判定された各ターゲットと、ビルドが成功したかどうかを表示します。
v (verbose)‘basic’ の一段上のレベルです。どの makefile が解析されたか、再ビルドが不要だった前提条件、などに関するメッセージを含みます。このオプションは ‘basic’ のメッセージも有効にします。
i (implicit)各ターゲットに対する暗黙のルールの探索を説明するメッセージを表示します。このオプションは ‘basic’ のメッセージも有効にします。
j (jobs)個々のサブコマンドの起動に関する詳細を伝えるメッセージを表示します。
m (makefile)デフォルトでは、上記のメッセージは makefile を作り直そうとしている間は有効になりません。このオプションは、makefile を再ビルドしている間もメッセージを有効にします。なお、‘all’ オプションはこのオプションも有効にします。このオプションは ‘basic’ のメッセージも有効にします。
p (print) 通常は(.SILENT や ‘@’ のために)出力されないレシピであっても、実行されるレシピを表示します。また、そのレシピが定義された makefile 名と行番号も表示します。
w (why)どの前提条件がターゲットより新しいかを示すことで、各ターゲットを作り直さなければならない理由を説明します。
n (none)現在有効になっているすべてのデバッグを無効にします。これより後に追加のデバッグフラグが現れた場合は、それらは引き続き有効になります。
環境から取り込んだ変数を、makefile 内の変数より優先させます。環境から取り込む変数を参照してください。
string を makefile の構文として評価します。これは eval 関数(eval 関数を参照)のコマンドライン版です。評価は、デフォルトのルールと変数が定義されたあと、makefile が読み込まれる前に行われます。
file という名前のファイルを makefile として読み込みます。Makefileの書き方を参照してください。
make が理解するオプションを思い出させてくれて、その後終了します。
ファイルを作り直すために実行されるレシピ内の、すべてのエラーを無視します。レシピのエラーを参照してください。
include される makefile を探索するディレクトリ dir を指定します。他のMakefileをインクルードするを参照してください。複数のディレクトリを指定するために ‘-I’ オプションを複数使った場合、ディレクトリは指定した順に探索されます。ディレクトリ dir が単一のダッシュ(-)の場合は、その時点までにすでに指定されているディレクトリ(デフォルトのディレクトリパスを含みます)がすべて破棄されます。探索対象となる現在のディレクトリ一覧は、.INCLUDE_DIRS 変数で調べられます。
同時に実行するレシピ(ジョブ)の数を指定します。引数がない場合、make は可能な限り多くのレシピを同時に実行します。‘-j’ オプションが複数ある場合は、最後のものが有効になります。レシピがどう実行されるかについての詳しい情報は、並列実行を参照してください。なお、このオプションは MS-DOS では無視されます。
使用するジョブサーバの方式を選びます。このオプションは、並列ビルドが有効になっている場合にのみ効果があります(並列実行を参照)。POSIX システムでは style は fifo(デフォルト)または pipe のいずれかです。Windows では受け付けられる style は sem(デフォルト)のみです。このオプションは、古いバージョンの GNU make や、特定のジョブサーバ方式を必要とする別のツールを使う必要がある場合に役立ちます。
エラーのあとも可能な限り処理を続けます。失敗したターゲットと、それに依存するターゲットは作り直せませんが、それらのターゲットの他の前提条件はそのまま処理できます。プログラムのコンパイルをテストするを参照してください。
他に実行中のレシピがあり、なおかつ負荷平均(ロードアベレージ)が少なくとも load(浮動小数点数)に達している場合は、新しいレシピを開始しないように指定します。引数なしの場合は、以前の負荷制限を解除します。並列実行を参照してください。
シンボリックリンクをサポートするシステムで、このオプションは make に対し、リンクが参照するファイルのタイムスタンプに加えて、シンボリックリンク自体のタイムスタンプも考慮させます。このオプションが指定されると、ファイルとシンボリックリンクのうちもっとも新しいタイムスタンプが、そのターゲットファイルの更新時刻として採用されます。
実行されるはずのレシピを表示しますが、(特定の状況を除いて)実行はしません。レシピを実行する代わりの動作を参照してください。
ファイル file が前提条件より古くても作り直さず、また file の変更を理由に他のものを作り直すこともしません。本質的には、そのファイルはきわめて古いものとして扱われ、そのルールは無視されます。一部のファイルの再コンパイルを避けるを参照してください。
各レシピからの出力全体が、途切れることなくひとまとまりの並びで表示されるようにします。このオプションは、複数のレシピを同時に実行するために --jobs オプションを使っているときにのみ役立ちます(並列実行を参照)。このオプションがないと、出力はレシピが生成するそばから表示されます。
type を指定しないか type が ‘target’ の場合、各ターゲットのレシピ全体からの出力がひとまとめにされます。type が ‘line’ の場合、レシピの各行からの出力がひとまとめにされます。type が ‘recurse’ の場合、再帰的な make 全体からの出力がひとまとめにされます。type が ‘none’ の場合、出力の同期は行われません。並列実行中の出力を参照してください。
makefile を読み込んだ結果として得られるデータベース(ルールと変数の値)を表示します。その後は通常どおり、あるいは別途指定されたとおりに実行します。これは ‘-v’ スイッチ(下記参照)が示すバージョン情報も表示します。ファイルを作り直そうとせずにデータベースを表示するには、‘make -qp’ を使います。あらかじめ定義されているルールと変数のデータベースを表示するには、‘make -p -f /dev/null’ を使います。データベースの出力には、レシピや変数の定義についてファイル名と行番号の情報が含まれているので、複雑な環境では役立つデバッグツールになります。
「質問モード(Question mode)」。レシピを一切実行せず、何も表示もしません。指定されたターゲットがすでに最新ならゼロ、何らかの作り直しが必要なら1、エラーに遭遇したら2、という終了ステータスを返すだけです。レシピを実行する代わりの動作を参照してください。
組み込みの暗黙のルールの使用を取りやめます(暗黙のルールの使い方を参照)。パターンルール(パターンルールの定義と再定義を参照)を書けば、自分自身のルールを定義することは引き続き可能です。‘-r’ オプションは、サフィックスルール用のデフォルトのサフィックス一覧も消去します(旧式のサフィックスルールを参照)。ただし、.SUFFIXES のルールで自分自身のサフィックスを定義し、それから自分のサフィックスルールを定義することは引き続き可能です。なお、-r オプションの影響を受けるのはルールだけで、デフォルトの変数は引き続き有効である点に注意してください(暗黙のルールが使う変数を参照)。下記の ‘-R’ オプションも参照してください。
組み込みのルール固有変数の使用を取りやめます(暗黙のルールが使う変数を参照)。もちろん、自分自身の変数を定義することは引き続き可能です。‘-R’ オプションは、‘-r’ オプション(上記参照)も自動的に有効にします。暗黙のルールが使う変数の定義が一切ないまま暗黙のルールだけがあっても意味がないからです。
静かに動作します。レシピを実行するときに、それを表示しません。レシピのエコー表示を参照してください。
‘-k’ オプションの効果を打ち消します。これが必要になるのは、再帰的な make において ‘-k’ が MAKEFLAGS を通じて最上位の make から受け継がれている場合(makeの再帰的な利用を参照)や、環境変数 MAKEFLAGS に ‘-k’ を設定している場合くらいで、それ以外ではまずありません。
このオプションは、前提条件の関係に対する一種のファズテストを有効にします。並列実行が有効(‘-j’)になっていると、ターゲットがビルドされる順序の決定性が下がります。前提条件が makefile の中で完全に宣言されていないと、これは断続的で原因を突き止めにくいビルド失敗につながることがあります。
‘--shuffle’ オプションは、ゴールと前提条件を make に意図的に並べ替えさせます。ターゲットと前提条件の関係は保たれますが、あるターゲットの前提条件の並び順は、以下に説明するように並べ替えられます。
自動変数の中で前提条件が並ぶ順序は、このオプションによっては変わりません。
.NOTPARALLEL 疑似ターゲットは、その makefile に対するシャッフルを無効にします。また、.WAIT を含む前提条件リストはシャッフルされません。並列実行を無効にするを参照してください。
‘--shuffle=’ オプションは以下の値を受け付けます:
randomシャッフルに使うランダムな種(シード)を選びます。これは mode を指定しなかった場合のデフォルトです。選ばれたシードはサブmake コマンドにも引き渡されます。シードはエラーメッセージにも含まれるので、将来の実行で再利用して問題を再現したり、問題が解消したことを確認したりできます。
reverseランダムなシャッフルではなく、ゴールと前提条件の順序を逆にします。
seed指定したシード値で初期化した ‘random’ シャッフルを使います。seed は整数です。
noneシャッフルを無効にします。これにより、それ以前の ‘--shuffle’ オプションが打ち消されます。
レシピを実行する代わりに、ファイルをタッチします(実際には変更せずに最新としてマークします)。これは、将来の make の起動をだますために、レシピが実行されたふりをするのに使われます。レシピを実行する代わりの動作を参照してください。
make の実行のトレース情報を表示します。--trace を使うのは --debug=print,why の省略形です。
make プログラムのバージョンに加えて、著作権表示、作者の一覧、そして無保証である旨の告知を表示し、その後終了します。
makefile を実行する前と後の両方で、作業ディレクトリを含むメッセージを表示します。これは、再帰的な make コマンドが複雑に入れ子になっている場合に、エラーの原因を突き止めるのに役立つことがあります。makeの再帰的な利用を参照してください。(実際には、‘make’ が自動的にやってくれるので、このオプションを指定する必要があることはめったにありません。‘--print-directory’ オプションを参照してください。)
-w のもとでの作業ディレクトリの表示を無効にします。このオプションは、-w が自動的に有効になっているものの、その余分なメッセージを見たくない場合に役立ちます。‘--print-directory’ オプションを参照してください。
ターゲット file がたった今変更されたかのように見せかけます。‘-n’ フラグと一緒に使うと、そのファイルを変更したらどうなるかを確かめられます。‘-n’ なしの場合は、make を実行する前に指定したファイルに対して touch コマンドを実行するのとほぼ同じですが、更新時刻が変わるのは make の想像の中だけ、という点が異なります。レシピを実行する代わりの動作を参照してください。
make が未定義の変数への参照を見つけるたびに、警告メッセージを発します。これは、変数を複雑な方法で使う makefile をデバッグしようとしているときに役立ちます。