[ < ] | [ > ] | [ << ] | [上] | [ >> ] | [冒頭] | [目次] | [見出し] | [ ? ] |
make
をどのように実行するかプログラムを再コンパイルする方法を示すmakefileは複数の方法で用いられます。
もっとも簡単なものは期限切れのすべてのファイルを再コンパイルするものです。
通常は、引数なしでmake
を実行できるようにmakefileは記述されます。
しかし、ファイルのいくつかだけをアップデートしたい、異なったコンパイラを 使用したい、異なるコンパイラオプションを用いたい、ファイルを変更せずに 期限切れのファイルをみつけたいといった要求があります。
make
の実行時に引数を与えることで、多くのことが可能になります。
make
の終了ステータスはつねに3つの値のうちのどれか1つです。
0
make
が成功したときの終了ステータスは0です。
2
なんらかのエラーが起きたときの終了ステータスは2で、エラーについての メッセージが表示されます。
1
‘-q’フラグを使用してmake
がターゲットの更新ができなかった場合の
終了ステータスは1です。
See section コマンド実行の代替.。
9.1 Makefile指定の引数 | How to specify which makefile to use. | |
9.2 ゴールを指定する引数 | How to use goal arguments to specify which parts of the makefile to use. | |
9.3 コマンド実行の代替 | How to use mode flags to specify what kind of thing to do with the commands in the makefile other than simply execute them. | |
9.4 いくつかのファイルの再コンパイルの回避 | How to avoid recompiling certain files. | |
9.5 変数のオーバーライド | How to override a variable to specify an alternate compiler and other things. | |
9.6 プログラムのコンパイルテスト | How to proceed past some errors, to test compilation. | |
9.7 オプションのサマリー | Summary of Options |
[ < ] | [ > ] | [ << ] | [上] | [ >> ] | [冒頭] | [目次] | [見出し] | [ ? ] |
makefileの名前を指定するには‘-f’あるいは‘--file’オプションを 使用します。(‘--makefile’も同じです)たとえば、‘-f altmake’は ファイル‘altmake’をmakefileとして指定します。
‘-f’フラグを数回用い、引数にそれぞれ‘-f’を使用する場合は、 すべての指定されたファイルはmakefileとして使用されます。
‘-f’あるいは‘--file’フラグを使用しない場合、デフォルトの設定では、 ‘GNUmakefile’、‘makefile’そして‘Makefile’がこの順序で試され、 存在する最初のものが使用されます(see section Makefileの記述.)。
[ < ] | [ > ] | [ << ] | [上] | [ >> ] | [冒頭] | [目次] | [見出し] | [ ? ] |
ゴールとは、make
がアップデートするために最終的に努力すべき
ターゲットです。ほかのターゲットはゴールの必要条件やゴールの必要条件の
必要条件などとなって現われる場合にアップデートされます。
デフォルトでは、ゴールはmakefileの1番目のターゲットです(ピリオドで始まる ターゲットはカウントしないとして)。したがって、makefileは通常、1番目の ターゲットがプログラムあるいは記述されたプログラム全体のコンパイルの ためであるように記述されます。makefileの最初のルールがいくつかのターゲットを 持つ場合、そのルールの最初のターゲットがゴールとなり、そのすべてがゴールに なるのではありません。
make
の引数で異なるゴール(あるいは複数のゴール)を指定することが
できます。その場合は引数としてゴールの名前を使用します。いくつかの
ゴールを指定した場合、make
は次々にそれらを処理しますが、
順序は名前をつけた順序です。
makefileのなかのどのターゲットもゴールとして指定できます(‘-’で
始まったり、‘=’を含まず、それらがスイッチあるいは変数定義として
解釈される限り)。make
がどのようにmakeするのかの明確なルールさえ
みつけることができれば、makefileにないターゲットでさえ指定することができます。
make
はコマンド行で指定したゴールのリストに対して特別な変数
MAKECMDGOALS
をセットします。コマンド行でゴールを何も与えない場合は
この変数は空になります。注意しなければならないのは、この変数は特別な
場合にだけ用いられるということです。
適切な使用例は、clean
ルール
(see section 必要条件の自動生成.)において
‘.d’ファイルのインクルードを回避する場合です。その結果、make
は
それらを作成せず、たんにふたたび削除するだけです。
sources = foo.c bar.c ifneq ($(MAKECMDGOALS),clean) include $(sources:.c=.d) endif |
ゴールの指定の一例は、プログラムのごく一部をコンパイルしたい、あるいは いくつかのプログラムうちの1つだけコンパイルしたいという場合です。再構成したい それぞれのファイルをゴールとして指定します。たとえば、いくつかのプログラムを 含むディレクトリを考えた場合、makefileを以下のように開始します。
.PHONY: all all: size nm ld ar as |
プログラムsize
で作業している場合、‘make size’と指示して
そのプログラムだけを再コンパイルするようにしたいはずです。
ゴールの指定のもう1つの方法は、通常は作成されないファイルを作ることです。 たとえば、デバッグの出力ファイル、あるいはテストのために特別に コンパイルされたプログラムのバージョンがあるとすると、それらはmakefileの なかにルールを持ちますがデフォルトゴールの必要条件ではないはずです。
さらにゴールの指定のもう1つの方法は、偽のターゲット (see section 偽のターゲット.)あるいは空のターゲット (see section レコードイベントに対する空のターゲットファイル.)を 持つコマンドを実行することです。makefileの多くは‘clean’という名前の 偽のターゲットを持ち、ソースファイル以外のすべてを削除します。もちろん、 これは‘make clean’という明確なリクエストをした場合にだけ 実行されます。以下の例は、一般的な偽あるいは空のターゲットの名前の リストです。GNUソフトウェアパッケージで用いられる、 標準的なターゲットのすべてのリストについては See section ユーザーにとっての標準ターゲット.。
makefileの認識するトップレベルのターゲットのすべての作成。
make
の実行によって通常作成されるすべてのファイルの削除。
‘clean’に似ていますが、再コンパイルを望まないわずかなファイルの削除を やめます。たとえば、GCCに対する‘mostlyclean’ターゲットは‘libgcc.a’を 削除しません。なぜならば、その再コンパイルはめったに必要がなく、時間が かかるからです。
これらのターゲットは、‘clean’よりももっと多くのファイルの削除を 行なうように定義されます。たとえば、makefile自身が作成できないときでさえ、 コンパイルのための準備として通常作成されたファイルへのリンクや コンフィギュレーションファイルを削除してしまいます。
ユーザーが一般的にコマンドをサーチするディレクトリに実行ファイルを コピーします。また実行ファイルが使用する補助的なファイルも そのディレクトリにコピーします。
変更のあったソースファイルのリストの出力。
ソースファイルのtarファイルの作成。
ソースファイルのシェルアーカイブ(shar file)の作成。
ソースファイルの配布用ファイルの作成。これはtarファイル、sharファイル あるいはその圧縮形式であるかもしれませんし、それ以外である場合もあります。
プログラムに対するタグテーブルのアップデート。
プログラムのmakefileの自己テスト。
[ < ] | [ > ] | [ << ] | [上] | [ >> ] | [冒頭] | [目次] | [見出し] | [ ? ] |
makefileはmake
に対してターゲットが最新かどうかをどのように知り、
どのように個々のターゲットをアップデートするかを知らせます。しかし、
ターゲットのアップデートはつねに希望どおりというわけではありません。
オプションによっては、make
のほかの動作を指定します。
“No-op”。その動作は、ターゲットをアップデートするためにどのコマンドが 用いられるかを出力しますが、実際にそれらを実行はしません。
“Touch”。その動作は、実際の変更は行なわずに最新のターゲットをマークします。
いいかえれば、make
は中身を変えずにコンパイルだけを試みようとします。
“Question”。その動作は、ターゲットがすでに最新であるかどうかを静かに 見きわめます。しかし、どんな場合でもコマンドの実行は行ないません。 いいかえれば、コンパイルも出力も何もしません。
“What if”。‘-W’フラグのあとにはファイル名が続きます。そのファイルの
修正時刻は実際にはその修正時刻が残されますが、make
によって現在として
記録されます。特定のファイルを修正した場合に何が起きるのかを理解するために、
‘-n’フラグと組み合わせて‘-W’フラグを使用することができます。
‘-n’フラグがついた場合、実行しようとするコマンドを出力はするものの 実際に実行はしません。
‘-t’フラグがついた場合、make
はルールのなかのコマンドを無視します。
そして再構成の必要な個々のターゲットに対してtouch
コマンドを
使用します。また、‘-s’あるいは.SILENT
が使用されない限り、
touch
コマンドもまた出力されます。スピードの問題から、make
は
実際にはtouch
プログラムを呼び出さず、直接それを実行します。
‘-q’フラグがついた場合、make
は何も出力せず、コマンドも
実行しません。しかし、ターゲットがすでに最新であるとみなされる場合にだけ、
返す終了ステータスを0にします。終了ステータスが1の場合、更新される
必要があります。make
がエラーに遭遇する場合、終了ステータスは2となり、
ターゲットが最新でないためのエラーであると区別がつきます。
これらの3つのフラグの2つ以上を同じmake
の呼び出しで用いるとエラーと
なります。
‘-n’、‘-t’と‘-q’オプションは‘+’文字で始まる場合や
‘$(MAKE)’あるいは‘${MAKE}’文字列を含む場合のコマンド行には
影響を与えません。注意しなければならないのは、‘+’文字や文字列
‘$(MAKE)’あるいは‘${MAKE}’を含む行だけはそれらのオプションを
問わず実行されることです。同じルールのほかの行は‘+’で始まる場合も
‘$(MAKE)’あるいは‘${MAKE}’を含んでいない限り実行されません
(see section MAKE
変数の働き.)。
‘-W’フラグは2つの機能を提供します。
make
が何を行なおうとするかがわかります。
make
が実際に
コマンドを実行しようとする際に、実際にはファイルを変更することなしに、
あたかも変更されたかのように‘-W’フラグによってmake
が動作します。
オプション‘-p’と‘-v’によって、make
や使用するmakefileに
ついてのほかの情報を得ることができます
(see section オプションのサマリー.)。
[ < ] | [ > ] | [ << ] | [上] | [ >> ] | [冒頭] | [目次] | [見出し] | [ ? ] |
ときには、ソースファイルを変更したものの、それに依存したすべてのファイルを
コンパイルしたくない場合があります。たとえば、マクロや宣言文を多くのほかの
ファイルが依存するあるヘッダファイルに追加した場合を考えます。
保守的に考えると、変更のあったヘッダファイルは依存するすべてのファイルの
再コンパイルを必要とするとmake
が仮定します。しかし、それらの
再コンパイルの必要がないことがわかっていて、コンパイルの時間を
むだにしたくない場合もあります。
ヘッダファイルの変更前に問題がわかっている場合は、‘-t’フラグを
使用します。このフラグは、make
に対して、ルールのなかのコマンドを
実行しないようにさせて、最終更新時刻を変更することによってターゲットを
最新にさせます。
make
を実行する際にヘッダファイルの
変更によって再コンパイルが行なわれることはありません。
いくつかのファイルの再コンパイルが必要なときに、すでにヘッダファイルの変更を していた場合には再コンパイルを行なうのでは遅すぎます。かわりに、 ‘-o file’フラグを使用して、特定のファイルを“old” (see section オプションのサマリー.)に設定できます。これで、 ファイル自身の再構成は行なわれず、ほかにも何も再構成されません。この手続きは 以下のようになります。
[ < ] | [ > ] | [ << ] | [上] | [ >> ] | [冒頭] | [目次] | [見出し] | [ ? ] |
‘=’を含む引数は変数の値を指定します。たとえば、‘v=x’は 変数vの値をxにセットします。この方法で値を指定する場合、 makefileにおいて通常の割り当てを同じ変数に行なったものは無視されます。 これを引数による変数のオーバーライドといいます。
この機能を用いるもっとも一般的な方法は、特別なフラグをコンパイラに
渡すことです。たとえば、適切に記述されたmakefileにおいて、変数
CFLAGS
はそれぞれのコマンドに含まれていて、それはCコンパイラを
実行します。その結果、‘foo.c’は以下のようにコンパイルされます。
cc -c $(CFLAGS) foo.c |
したがって、CFALGS
にどんな値をセットしてもコンパイルに影響を与えます。
makfileはおそらく、通常の値を以下のようにCFLAGS
に指定するでしょう。
CFLAGS=-g |
もし望むなら、make
を実行するたびにこの値をオーバーライドすることも
可能です。たとえば、‘make CFLAGS='-g -O'’とした場合、それぞれの
Cコンパイルは、‘cc -c -g -O’として実行されます。(このことは、
オーバーライドするときには、変数の値におけるスペースやほかの特別な文字を
取り囲むことをシェルでどのように引用するかを説明しています。)
変数CFLAGS
は多くの標準的な変数のなかで、この方法で変更できる唯一の
ものです。完全なリストについては、
See section 暗黙のルールで使用される変数.。
また、ユーザーに対して、変数の変更によってmakefileがどのように働くかを コントロールする権限を与えて、追加した変数をmakefileが注目するように プログラムすることができます。
コマンドの引数で変数をオーバーライドする場合、再帰的展開を行なう変数も 単純展開を行なう変数も定義することができます。前記の例では再帰的展開を行なう 変数が示されています。単純展開を行なう変数を作るには‘=’のかわりに ‘:=’を記述します。しかし、指定した値に変数への参照や ファンクションコールをインクルードしようとしない限り、作成した変数の 種類は違いは生じません。
オーバーライドした変数をmakefileが変更する方法が1つあります。override
ディレクティブを使用する方法で、‘override variable = value’
のような1行を記述します
(see section override
ディレクティブ.)。
[ < ] | [ > ] | [ << ] | [上] | [ >> ] | [冒頭] | [目次] | [見出し] | [ ? ] |
シェルコマンドの実行でエラーが発生した際、普通は、make
はただちにゼロ
でないステータスを返して終了します。いかなるターゲットに対してもそれ以降の
コマンドは実行されません。エラーは、ゴールが正しく再構成されないことを
暗示し、make
はそれをただちにレポートします。
変更したばかりのプログラムをコンパイルする際にはこれは望ましくないことです。
そのかわりにできるだけ多くのコンパイルエラーを提示させるために
make
がすべてのファイルのコンパイルを試してみることを望むでしょう。
このような場合は、‘-k’あるいは‘--keep-going’フラグを使用すべき
でしょう。そうすると、make
は保留されたターゲットのほかの必要条件を
考慮し続け、ゼロでないステータスを返して終了するまえに必要ならば再構成を
行ないます。たとえば、あるオブジェクトファイルのコンパイルでエラーが
起きたあと、‘make -k’はリンクが不可能であることをすでにわかっていても、
ほかのオブジェクトファイルのコンパイルを続けようとします。加えて、
シェルコマンドの失敗のあとでも、‘make -k’はターゲットや必要条件の
ファイルの作成の仕方を知らないことを発見したあとでも可能な限り
継続しようとします。このことによってエラーメッセージが出されますが、
‘-k’がない場合には致命的なエラーとなってしまいます
(see section オプションのサマリー.)。
make
は、通常、ユーザーの目的がゴールを最新にすることだと
仮定しています。いったんそれが不可能であるとmake
が認識すると
ただちに失敗のレポートを出します。‘-k’フラグは、実際の目的を、
プログラム中の変更箇所を可能な限り多くテストし、次回のコンパイルのまえに
修正可能ないくつかの独立した問題を発見することとします。これは、
EmacsのコマンドM-x compileがデフォルトで‘-k’フラグに渡す理由です。
[ < ] | [ > ] | [ << ] | [上] | [ >> ] | [冒頭] | [目次] | [見出し] | [ ? ] |
make
で使用できるオプションの表を示します。
これらのオプションは、ほかのバージョンのmake
では互換性がありません。
makefileを読み込むまえにdirディレクトリに移動します。複数の‘-C’
オプションが指定されている場合は、それぞれまえのものと関係付けて解釈されます。
たとえば、‘-C / C etc’は、‘-C /etc’と同じです。これは、
make
の再帰的呼び出しにおいて一般的に用いられます
(see section make
の再帰的用法.)。
正常な処理に加えて、デバッグ情報を出力します。デバッグ情報は、どの
ファイルが再構成のために考慮されるか、どのファイル日付と結果とが
比較されるか、実際に再構成の必要なのはどのファイルか、どの暗黙のルールが
考慮され、どれが適用されるかなどmake
が行なうべきことの決定に
関するあらゆることです。-d
オプションは‘--debug=a’と同等です
(下記参照)。
正常な処理に加えて、デバッグ情報を出力します。さまざまなレベルとタイプの出力が 選択できます。引数がない場合はbasicレベルのデバッグ情報になります。 とりうる値は以下のとおりで、最初の文字だけが考慮されます。また値は カンマまたはスペースで区切られます。
a (all)
すべてのタイプのデバッグ情報の出力が可能です。‘-d’を使用するのと同じです。
b (basic)
ビルドの成功にかかわらず、期限切れである個々のターゲットについて基本的な デバッグ情報を出力します。
v (verbose)
‘basic’よりも上のレベルです。どのmakefileをパースするか、再度ビルドの 不要な必要条件などについてです。このオプションは‘basic’による メッセージも有効にします。
i (implicit)
個々のターゲットに対する暗黙のルールのを示すメッセージの出力。この オプションは‘basic’によるメッセージも有効にします。
j (jobs)
指定されたサブコマンドの呼び出しにおける詳細を与えるメッセージの出力。
m (makefile)
デフォルトでは上記のメッセージはmakefileの再構成を試すあいだは有効では ありません。このオプションはmakefileの再構成のあいだは有効です。 注意すべきことは、‘all’オプションがこのオプションを有効にすることです。 また、このオプションは‘basic’によるメッセージも有効にします。
makefileから得られる変数よりも優位な環境変数からの変数を与えます。 See section 環境(変数)からの変数の取得.。
fileという名前のファイルをmakefileとして読み込みます。 See section Makefileの記述.。
make
で使用できるオプションを表示し、終了します。
ファイルの再構成を実行するコマンドのエラーを無視します。 See section コマンドのエラー.。
インクルードされたmakefileをサーチするためのdirディレクトリを 指定します。See section ほかのMakefileをインクルードする.。 いくつかのディレクトリを指定するために‘-I’オプションが 使用される場合は、そのディレクトリのサーチは指定された順序で行なわれます。
同時に実行するジョブの数を指定します。引数がない場合は、make
は
可能な限り多くのジョブを同時に実行します。2つ以上の‘-j’オプションが
ある場合は最後の1つが有効です。ただし、MS-DOSにおいてはこのオプションは
無視されます。このコマンドの動作についての詳細については、
See section パラレル実行.。
エラーが起きたあとでも可能な限り継続します。ターゲットの作成に失敗し、 依存するファイルの再構成に失敗しても、ターゲットの必要条件は処理されます。 See section プログラムのコンパイルテスト.。
ほかのジョブが実行されていて、ロードアベレージが最低load(小数)よりも 低くなければ新しいジョブ(のコマンド)をスタートさせないように指定します。 See section パラレル実行.。
実行できるコマンドを出力しますが、実際には実行しません。 See section コマンド実行の代替.。
たとえ必要条件が古い場合でさえもfileを再構成しません。またfile の変更による再構成も行ないません。本質的にそのファイルは非常に古いものとして 扱われ、そのルールは無視されます。 See section いくつかのファイルの再コンパイルの回避.。
makefileから取得したルールと変数の値のデータベースの出力をします。そして、 通常あるいは指定されたとおりに実行します。また、‘-v’スイッチ (下記参照)によってバージョン情報の出力も行ないます。ファイルの再構成を 試すことなしにデータベースの出力をする場合は、‘make -qp’を 使用します。また、事前に定義されたルールと変数のデータベースを出力するには、 ‘make -p -f /dev/null’を使用します。データベースの出力には ファイル名と、コマンドと変数定義に関する情報の行番号が含まれていて、 複雑な環境においてはデバッグツールにとって有益です。
クエスチョンモード。コマンドは何も実行せず、何も出力しません。 指定したターゲットがすでに最新である場合にステータスの0を返し、 なんらかの再構成が必要なときは1、エラーが起きたときは2を返すだけです。 See section コマンド実行の代替.。
組み込み済みの暗黙のルール(see section 暗黙のルールの使用.)
を使用させないようにします。パターンルール
(see section パターンルールの定義と再定義.)の
記述によって、独自に定義することができます。‘-r’オプションは
サフィックスルール(see section 古いスタイルのサフィックスルール.)
に関するデフォルトのサフィックスのリストをクリアします。しかし、
.SUFFIXES
で独自のサフィックスとサフィックスルールを定義することが
できます。注意すべきことは、-r
で影響を受けるのはルールだけで
あってデフォルトの変数は有効のまま残されます
(see section 暗黙のルールで使用される変数.)。
次の‘-R’オプションを参照してください。
組み込み済みのルール固有の変数 (see section 暗黙のルールで使用される変数.)の使用を させないようにします。無論独自の変数の定義は可能です。‘-R’オプション は自動的に‘-r’オプション(上述)も有効にします。なぜなら、変数に対して 何も定義がなければ、暗黙のルールは何の意味も持たないからです。
サイレントオペレーション。実行されるコマンドを出力しません。 See section コマンドエコー.。
‘-k’オプションの効果をキャンセルします。MAKEFLAGS
を通して
トップレベルのmake
から受け継いだ‘-k’による再帰的なmake
の
場合、あるいは環境変数においてMAKEFLAGS
(see section make
の再帰的用法.)に‘-k’をセットする
場合を除いて、必要となる場合はありません。
コマンドを実行するかわりに、内容を変更することなしにファイルを最新にします。
コマンドが実行されたように見せかけ、次のmake
の呼び出しを騙すのです。
See section コマンド実行の代替.。
make
プログラムのバージョンとコピーライト、作者、無保証である注意を
表示します。
makefileの実行前後の作業用ディレクトリを含むメッセージを出力します。
再帰的なmake
コマンドの複雑なネストにおけるエラーの追跡に役に立ちます。
See section make
の再帰的用法.。
(実際には、このオプションを指定することはめったにないはずです。なぜなら
‘make’がこれを行なってくれるからです。
‘--print-directory’オプション.を参照。)
-w
が指定された場合でも作業用ディレクトリの表示をさせないように
します。-w
が自動的にオンで、メッセージの表示が不要な場合に
このオプションは有益です。
See section ‘--print-directory’オプション.。
ターゲットfileが直前に修正されたように見せかけます。‘-n’
フラグが用いられるとき、そのファイルを修正すると何が起きるのかを
示してくれます。‘-n’フラグがない場合は、make
が実行される
まえに与えられたファイルにtouch
コマンドが実行されたのと
同様になります。ただし、修正時刻はあくまでmake
によって
仮想的に変更されるものです。
See section コマンド実行の代替.。
make
が未定義の変数に対する参照を行なうときにつねに表示される
ワーニングを表示します。複雑な方法で変数を使用していてmakefileのデバッグを
する際に有用です。
[ << ] | [ >> ] | [冒頭] | [目次] | [見出し] | [ ? ] |
この文書は新堂 安孝によって2009年9月22日にtexi2html 1.82を用いて生成されました。