[ < ] [ > ]   [ << ] [] [ >> ]         [冒頭] [目次] [見出し] [ ? ]

9. makeをどのように実行するか

プログラムを再コンパイルする方法を示すmakefileは複数の方法で用いられます。 もっとも簡単なものは期限切れのすべてのファイルを再コンパイルするものです。 通常は、引数なしでmakeを実行できるようにmakefileは記述されます。

しかし、ファイルのいくつかだけをアップデートしたい、異なったコンパイラを 使用したい、異なるコンパイラオプションを用いたい、ファイルを変更せずに 期限切れのファイルをみつけたいといった要求があります。

makeの実行時に引数を与えることで、多くのことが可能になります。

makeの終了ステータスはつねに3つの値のうちのどれか1つです。

0

makeが成功したときの終了ステータスは0です。

2

なんらかのエラーが起きたときの終了ステータスは2で、エラーについての メッセージが表示されます。

1

-q’フラグを使用してmakeがターゲットの更新ができなかった場合の 終了ステータスは1です。 See section コマンド実行の代替.。


[ < ] [ > ]   [ << ] [] [ >> ]         [冒頭] [目次] [見出し] [ ? ]

9.1 Makefile指定の引数

makefileの名前を指定するには‘-f’あるいは‘--file’オプションを 使用します。(‘--makefile’も同じです)たとえば、‘-f altmake’は ファイル‘altmake’をmakefileとして指定します。

-f’フラグを数回用い、引数にそれぞれ‘-f’を使用する場合は、 すべての指定されたファイルはmakefileとして使用されます。

-f’あるいは‘--file’フラグを使用しない場合、デフォルトの設定では、 ‘GNUmakefile’、‘makefile’そして‘Makefile’がこの順序で試され、 存在する最初のものが使用されます(see section Makefileの記述.)。


[ < ] [ > ]   [ << ] [] [ >> ]         [冒頭] [目次] [見出し] [ ? ]

9.2 ゴールを指定する引数

ゴールとは、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 ユーザーにとっての標準ターゲット.。

all

makefileの認識するトップレベルのターゲットのすべての作成。

clean

makeの実行によって通常作成されるすべてのファイルの削除。

mostlyclean

clean’に似ていますが、再コンパイルを望まないわずかなファイルの削除を やめます。たとえば、GCCに対する‘mostlyclean’ターゲットは‘libgcc.a’を 削除しません。なぜならば、その再コンパイルはめったに必要がなく、時間が かかるからです。

distclean
realclean
clobber

これらのターゲットは、‘clean’よりももっと多くのファイルの削除を 行なうように定義されます。たとえば、makefile自身が作成できないときでさえ、 コンパイルのための準備として通常作成されたファイルへのリンクや コンフィギュレーションファイルを削除してしまいます。

install

ユーザーが一般的にコマンドをサーチするディレクトリに実行ファイルを コピーします。また実行ファイルが使用する補助的なファイルも そのディレクトリにコピーします。

print

変更のあったソースファイルのリストの出力。

tar

ソースファイルのtarファイルの作成。

shar

ソースファイルのシェルアーカイブ(shar file)の作成。

dist

ソースファイルの配布用ファイルの作成。これはtarファイル、sharファイル あるいはその圧縮形式であるかもしれませんし、それ以外である場合もあります。

TAGS

プログラムに対するタグテーブルのアップデート。

check
test

プログラムのmakefileの自己テスト。


[ < ] [ > ]   [ << ] [] [ >> ]         [冒頭] [目次] [見出し] [ ? ]

9.3 コマンド実行の代替

makefileはmakeに対してターゲットが最新かどうかをどのように知り、 どのように個々のターゲットをアップデートするかを知らせます。しかし、 ターゲットのアップデートはつねに希望どおりというわけではありません。 オプションによっては、makeのほかの動作を指定します。

-n
--just-print
--dry-run
--recon

“No-op”。その動作は、ターゲットをアップデートするためにどのコマンドが 用いられるかを出力しますが、実際にそれらを実行はしません。

-t
--touch

“Touch”。その動作は、実際の変更は行なわずに最新のターゲットをマークします。 いいかえれば、makeは中身を変えずにコンパイルだけを試みようとします。

-q
--question

“Question”。その動作は、ターゲットがすでに最新であるかどうかを静かに 見きわめます。しかし、どんな場合でもコマンドの実行は行ないません。 いいかえれば、コンパイルも出力も何もしません。

-W file
--what-if=file
--assume-new=file
--new-file=file

“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つの機能を提供します。

オプション‘-p’と‘-v’によって、makeや使用するmakefileに ついてのほかの情報を得ることができます (see section オプションのサマリー.)。


[ < ] [ > ]   [ << ] [] [ >> ]         [冒頭] [目次] [見出し] [ ? ]

9.4 いくつかのファイルの再コンパイルの回避

ときには、ソースファイルを変更したものの、それに依存したすべてのファイルを コンパイルしたくない場合があります。たとえば、マクロや宣言文を多くのほかの ファイルが依存するあるヘッダファイルに追加した場合を考えます。 保守的に考えると、変更のあったヘッダファイルは依存するすべてのファイルの 再コンパイルを必要とするとmakeが仮定します。しかし、それらの 再コンパイルの必要がないことがわかっていて、コンパイルの時間を むだにしたくない場合もあります。

ヘッダファイルの変更前に問題がわかっている場合は、‘-t’フラグを 使用します。このフラグは、makeに対して、ルールのなかのコマンドを 実行しないようにさせて、最終更新時刻を変更することによってターゲットを 最新にさせます。

  1. 再コンパイルが本当に必要なソースファイルの再コンパイルには‘make’ コマンドを使用します。
  2. ヘッダファイルの変更をします。
  3. すべてのオブジェクトファイルを最新にするには、‘make -t’コマンドを 使用してください。次回makeを実行する際にヘッダファイルの 変更によって再コンパイルが行なわれることはありません。

いくつかのファイルの再コンパイルが必要なときに、すでにヘッダファイルの変更を していた場合には再コンパイルを行なうのでは遅すぎます。かわりに、 ‘-o file’フラグを使用して、特定のファイルを“old” (see section オプションのサマリー.)に設定できます。これで、 ファイル自身の再構成は行なわれず、ほかにも何も再構成されません。この手続きは 以下のようになります。

  1. 特定のヘッダファイルから独立しているためにコンパイルの必要な ソースファイルを‘make -o headerfile’をつけて再コンパイルします。 いくつかのヘッダファイルが関係する場合には、それぞれのヘッダファイルに 対して‘-o’オプションを使用します。
  2. make -t’を使用してすべてのオブジェクトファイルをtouchします。

[ < ] [ > ]   [ << ] [] [ >> ]         [冒頭] [目次] [見出し] [ ? ]

9.5 変数のオーバーライド

=’を含む引数は変数の値を指定します。たとえば、‘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ディレクティブ.)。


[ < ] [ > ]   [ << ] [] [ >> ]         [冒頭] [目次] [見出し] [ ? ]

9.6 プログラムのコンパイルテスト

シェルコマンドの実行でエラーが発生した際、普通は、makeはただちにゼロ でないステータスを返して終了します。いかなるターゲットに対してもそれ以降の コマンドは実行されません。エラーは、ゴールが正しく再構成されないことを 暗示し、makeはそれをただちにレポートします。

変更したばかりのプログラムをコンパイルする際にはこれは望ましくないことです。 そのかわりにできるだけ多くのコンパイルエラーを提示させるために makeがすべてのファイルのコンパイルを試してみることを望むでしょう。

このような場合は、‘-k’あるいは‘--keep-going’フラグを使用すべき でしょう。そうすると、makeは保留されたターゲットのほかの必要条件を 考慮し続け、ゼロでないステータスを返して終了するまえに必要ならば再構成を 行ないます。たとえば、あるオブジェクトファイルのコンパイルでエラーが 起きたあと、‘make -k’はリンクが不可能であることをすでにわかっていても、 ほかのオブジェクトファイルのコンパイルを続けようとします。加えて、 シェルコマンドの失敗のあとでも、‘make -k’はターゲットや必要条件の ファイルの作成の仕方を知らないことを発見したあとでも可能な限り 継続しようとします。このことによってエラーメッセージが出されますが、 ‘-k’がない場合には致命的なエラーとなってしまいます (see section オプションのサマリー.)。

makeは、通常、ユーザーの目的がゴールを最新にすることだと 仮定しています。いったんそれが不可能であるとmakeが認識すると ただちに失敗のレポートを出します。‘-k’フラグは、実際の目的を、 プログラム中の変更箇所を可能な限り多くテストし、次回のコンパイルのまえに 修正可能ないくつかの独立した問題を発見することとします。これは、 EmacsのコマンドM-x compileがデフォルトで‘-k’フラグに渡す理由です。


[ < ] [ > ]   [ << ] [] [ >> ]         [冒頭] [目次] [見出し] [ ? ]

9.7 オプションのサマリー

makeで使用できるオプションの表を示します。

-b
-m

これらのオプションは、ほかのバージョンのmakeでは互換性がありません。

-C dir
--directory=dir

makefileを読み込むまえにdirディレクトリに移動します。複数の‘-C’ オプションが指定されている場合は、それぞれまえのものと関係付けて解釈されます。 たとえば、‘-C / C etc’は、‘-C /etc’と同じです。これは、 makeの再帰的呼び出しにおいて一般的に用いられます (see section makeの再帰的用法.)。

-d

正常な処理に加えて、デバッグ情報を出力します。デバッグ情報は、どの ファイルが再構成のために考慮されるか、どのファイル日付と結果とが 比較されるか、実際に再構成の必要なのはどのファイルか、どの暗黙のルールが 考慮され、どれが適用されるかなどmakeが行なうべきことの決定に 関するあらゆることです。-dオプションは‘--debug=a’と同等です (下記参照)。

--debug[=options]

正常な処理に加えて、デバッグ情報を出力します。さまざまなレベルとタイプの出力が 選択できます。引数がない場合はbasicレベルのデバッグ情報になります。 とりうる値は以下のとおりで、最初の文字だけが考慮されます。また値は カンマまたはスペースで区切られます。

a (all)

すべてのタイプのデバッグ情報の出力が可能です。‘-d’を使用するのと同じです。

b (basic)

ビルドの成功にかかわらず、期限切れである個々のターゲットについて基本的な デバッグ情報を出力します。

v (verbose)

basic’よりも上のレベルです。どのmakefileをパースするか、再度ビルドの 不要な必要条件などについてです。このオプションは‘basic’による メッセージも有効にします。

i (implicit)

個々のターゲットに対する暗黙のルールのを示すメッセージの出力。この オプションは‘basic’によるメッセージも有効にします。

j (jobs)

指定されたサブコマンドの呼び出しにおける詳細を与えるメッセージの出力。

m (makefile)

デフォルトでは上記のメッセージはmakefileの再構成を試すあいだは有効では ありません。このオプションはmakefileの再構成のあいだは有効です。 注意すべきことは、‘all’オプションがこのオプションを有効にすることです。 また、このオプションは‘basic’によるメッセージも有効にします。

-e
--environment-overrides

makefileから得られる変数よりも優位な環境変数からの変数を与えます。 See section 環境(変数)からの変数の取得.。

-f file
--file=file
--makefile=file

fileという名前のファイルをmakefileとして読み込みます。 See section Makefileの記述.。

-h
--help

makeで使用できるオプションを表示し、終了します。

-i
--ignore-errors

ファイルの再構成を実行するコマンドのエラーを無視します。 See section コマンドのエラー.。

-I dir
--include-dir=dir

インクルードされたmakefileをサーチするためのdirディレクトリを 指定します。See section ほかのMakefileをインクルードする.。 いくつかのディレクトリを指定するために‘-I’オプションが 使用される場合は、そのディレクトリのサーチは指定された順序で行なわれます。

-j [jobs]
--jobs[=jobs]

同時に実行するジョブの数を指定します。引数がない場合は、makeは 可能な限り多くのジョブを同時に実行します。2つ以上の‘-j’オプションが ある場合は最後の1つが有効です。ただし、MS-DOSにおいてはこのオプションは 無視されます。このコマンドの動作についての詳細については、 See section パラレル実行.。

-k
--keep-going

エラーが起きたあとでも可能な限り継続します。ターゲットの作成に失敗し、 依存するファイルの再構成に失敗しても、ターゲットの必要条件は処理されます。 See section プログラムのコンパイルテスト.。

-l [load]
--load-average[=load]
--max-load[=load]

ほかのジョブが実行されていて、ロードアベレージが最低load(小数)よりも 低くなければ新しいジョブ(のコマンド)をスタートさせないように指定します。 See section パラレル実行.。

-n
--just-print
--dry-run
--recon

実行できるコマンドを出力しますが、実際には実行しません。 See section コマンド実行の代替.。

-o file
--old-file=file
--assume-old=file

たとえ必要条件が古い場合でさえもfileを再構成しません。またfile の変更による再構成も行ないません。本質的にそのファイルは非常に古いものとして 扱われ、そのルールは無視されます。 See section いくつかのファイルの再コンパイルの回避.。

-p
--print-data-base

makefileから取得したルールと変数の値のデータベースの出力をします。そして、 通常あるいは指定されたとおりに実行します。また、‘-v’スイッチ (下記参照)によってバージョン情報の出力も行ないます。ファイルの再構成を 試すことなしにデータベースの出力をする場合は、‘make -qp’を 使用します。また、事前に定義されたルールと変数のデータベースを出力するには、 ‘make -p -f /dev/null’を使用します。データベースの出力には ファイル名と、コマンドと変数定義に関する情報の行番号が含まれていて、 複雑な環境においてはデバッグツールにとって有益です。

-q
--question

クエスチョンモード。コマンドは何も実行せず、何も出力しません。 指定したターゲットがすでに最新である場合にステータスの0を返し、 なんらかの再構成が必要なときは1、エラーが起きたときは2を返すだけです。 See section コマンド実行の代替.。

-r
--no-builtin-rules

組み込み済みの暗黙のルール(see section 暗黙のルールの使用.) を使用させないようにします。パターンルール (see section パターンルールの定義と再定義.)の 記述によって、独自に定義することができます。‘-r’オプションは サフィックスルール(see section 古いスタイルのサフィックスルール.) に関するデフォルトのサフィックスのリストをクリアします。しかし、 .SUFFIXESで独自のサフィックスとサフィックスルールを定義することが できます。注意すべきことは、-rで影響を受けるのはルールだけで あってデフォルトの変数は有効のまま残されます (see section 暗黙のルールで使用される変数.)。 次の‘-R’オプションを参照してください。

-R
--no-builtin-variables

組み込み済みのルール固有の変数 (see section 暗黙のルールで使用される変数.)の使用を させないようにします。無論独自の変数の定義は可能です。‘-R’オプション は自動的に‘-r’オプション(上述)も有効にします。なぜなら、変数に対して 何も定義がなければ、暗黙のルールは何の意味も持たないからです。

-s
--silent
--quiet

サイレントオペレーション。実行されるコマンドを出力しません。 See section コマンドエコー.。

-S
--no-keep-going
--stop

-k’オプションの効果をキャンセルします。MAKEFLAGSを通して トップレベルのmakeから受け継いだ‘-k’による再帰的なmakeの 場合、あるいは環境変数においてMAKEFLAGS (see section makeの再帰的用法.)に‘-k’をセットする 場合を除いて、必要となる場合はありません。

-t
--touch

コマンドを実行するかわりに、内容を変更することなしにファイルを最新にします。 コマンドが実行されたように見せかけ、次のmakeの呼び出しを騙すのです。 See section コマンド実行の代替.。

-v
--version

makeプログラムのバージョンとコピーライト、作者、無保証である注意を 表示します。

-w
--print-directory

makefileの実行前後の作業用ディレクトリを含むメッセージを出力します。 再帰的なmakeコマンドの複雑なネストにおけるエラーの追跡に役に立ちます。 See section makeの再帰的用法.。 (実際には、このオプションを指定することはめったにないはずです。なぜなら ‘make’がこれを行なってくれるからです。 --print-directory’オプション.を参照。)

--no-print-directory

-wが指定された場合でも作業用ディレクトリの表示をさせないように します。-wが自動的にオンで、メッセージの表示が不要な場合に このオプションは有益です。 See section --print-directory’オプション.。

-W file
--what-if=file
--new-file=file
--assume-new=file

ターゲットfileが直前に修正されたように見せかけます。‘-n’ フラグが用いられるとき、そのファイルを修正すると何が起きるのかを 示してくれます。‘-n’フラグがない場合は、makeが実行される まえに与えられたファイルにtouchコマンドが実行されたのと 同様になります。ただし、修正時刻はあくまでmakeによって 仮想的に変更されるものです。 See section コマンド実行の代替.。

--warn-undefined-variables

makeが未定義の変数に対する参照を行なうときにつねに表示される ワーニングを表示します。複雑な方法で変数を使用していてmakefileのデバッグを する際に有用です。


[ << ] [ >> ]           [冒頭] [目次] [見出し] [ ? ]

この文書は新堂 安孝によって2009年9月22日texi2html 1.82を用いて生成されました。