| 日本−日本語 |
|
|
|
![]() |
HP-UX リファレンス: セクション 1 : ユーザーコマンド (A~M) > mmake(1)HP-UX 11i Version 2: September 2004 |
|
名称make ― プログラムグループの保守、アップデート、および再生成 説明makefile の構造makefile には、ターゲット行、シェルコマンド行、マクロ定義、およびインクルード行の 4 種類の行を含めることができます。 ターゲット行 シェルコマンド行 対応するコマンド行があるターゲット行は rules といいます。 マクロ
ならば、 $(OBJS:.o=.c) は file1.c file2.c file3.c の評価値になります。 マクロ値は、他のマクロへの参照を含めることができます ( 「警告」を参照)。
$(TWELVE) の値は $(ONE)2 に設定されますが、これがターゲット、コマンド、インクルード行で使用されると、 12 に拡張されます。makefile またはコマンド行において ONE の値が次にさらに別の定義によって変更されると、 $(TWELVE) への参照はすべてこの変更を反映します。 マクロ定義はコマンド行でも指定でき、これは、makefile の定義より優先します。 (XPG4 専用。 コマンド行のマクロは、 MAKEFLAGS 環境変数に追加されます。 コマンド行マクロを使わずに MAKEFLAGS 環境変数内で定義されたマクロは、環境にマクロを追加して同じ名前の既存環境変数を置き換えます。) make に対して自動的に定義されるマクロもあります (組込みマクロを参照)。 マクロ定義の処理順序の説明については、「環境」の項を参照してください。 マクロに割り当てる値は、条件マクロ定義で変更できます。 条件マクロ定義の形式は target := string1 = string2 です。 ターゲットに対応するターゲット行を処理しているときは、 条件マクロ定義で指定した値が有効です。 string1 を事前に定義していれば、 string1 の新しい値が前の定義と置き換わります。 string1 の新しい値は、 ターゲットまたはターゲットの従属条件のどれかを処理しているときに有効になります。 インクルード行 ターゲットに明示的に対応付けられたコマンドがなく、 .DEFAULT ターゲットが定義されている場合、 make のデフォルトの動作では .DEFAULT 組込みターゲットを使用します。「組込みターゲット」の項を参照してください。 説明make は、あらかじめ makefile に入れられたコマンドを実行して、単一または複数のターゲット名をアップデートします。 ターゲット名は通常はプログラム名です。 -f オプションを指定しなければ、ファイル名 makefile, Makefile, s.makefile, SCCS/s.makefile, s.Makefile, および SCCS/s.Makefile を、この順序で調べます。 -f - を指定すると、標準入力が使用されます。 複数の -f オプションを指定できます。 makefile 引き数は、指定した順序で処理されます。 -f とファイル名との間にはスペースを入れなければならず、 複数の makefile 名の前には、それぞれ個別に -f オプションを付けなければなりません。 makefile の内容は、組込みの規則やマクロがもしあればそれらに優先します。 コマンド行でターゲット名を指定しなければ、 make は (最初の)makefile における最初のターゲットをアップデートします。 これは推論規則ではありません。 ターゲットは、2 つの場合にアップデートされます。 ターゲットが、ターゲットよりも新しいファイルに従属する場合と、 ターゲットが、更新時刻がターゲットと同一のファイルに従属する場合です。 ファイルを省略すると、最新でないものとみなされます。 ターゲットの従属条件はすべて、必要ならばターゲットをアップデートする前に 再帰的にアップデートされます。 これは、ターゲットの従属ツリーの深さ優先アップデートに影響を与えます。 ターゲットが、ターゲット行 (explicit dependents) 上のセパレータの後で従属条件を指定していない場合、 そのターゲットが最新でなければ、 そのターゲットと対応するシェルコマンドが実行されます。 ターゲット行には、単一または複数のターゲット名と明示的な従属名との間に シングルコロンまたはダブルコロンのいずれかを入れることができます。 同じターゲット名を、複数のターゲット行に入れることもできますが、 その行はすべて同じ (シングルコロンまたはダブルコロン) 型でなければなりません。 通常のシングルコロンの場合には、対応する明示的なコマンドを入れられるターゲット行は 1 つだけです。 ターゲットが、任意行にある従属条件のいずれかに関して最新でない場合、 明示的なコマンドが指定されるとこれが実行され、 指定されなければ、デフォルト規則を実行できます。 ダブルコロンの場合には、明示的なコマンドを ターゲット名の入った複数のターゲット行と対応付けることができます。 ターゲットが、特定行の従属条件のいずれかに関して最新でない場合、 その行のコマンドが実行されます。 組込み規則も実行できます。 ターゲット行およびその対応シェルコマンド行は rules ともいいます。 makefile の任意位置にハッシュマーク (#) があれば rules 内を除いてそこから改行までの部分がコメントになります。 rules 内のコメントは SHELL マクロの設定に依存しています。 以下の makefile は、 pgm が 2 つのファイル、つまり a.o と b.o に従属しており、 a.o と b.o は対応するソースファイル (a.c と b.c) 、および共通ファイル incl.h とに従属していることを示します。
コマンド行はそれぞれ、独自のシェルによって一度に 1 つずつ実行されます。 各コマンド行には、 -, @, + の中から、単一また複数のプリフィックスが付けられます。 これらのプリフィックスについては以下に説明があります。 ゼロ以外のステータスを戻すコマンドは正常に make を終了します。 -i オプション、または makefile に特殊ターゲット .IGNORE がある場合、 エラーメッセージは標準出力にプリントされますが、 make は、コマンド行で何回エラーが発生しても makefile の実行を続けます。 - がコマンド行の先頭にある場合、 その行によって戻されるエラーはすべて標準出力にプリントされますが、 make は終了しません。 プリフィックス - を使用すると、makefile において選択的にエラーを無視することができます。 -k オプションが指定されており、コマンド行がエラーステータスを戻す場合、 現在のターゲットに対する作業は放棄されますが、 そのターゲットに従属しない他の分岐は続行されます。 -k オプションが MAKEFLAGS 環境変数に存在する場合、 -S オプションを指定することによって処理をデフォルトに戻すことができます。 -n オプションは、コマンド行を実行ではなくプリントすることを指定します。 ただし、コマンド行に文字列 $(MAKE) または ${MAKE}, またはプリフィックスとして + がある場合、行はつねに実行されます (「環境」の MAKEFLAGS マクロの説明を参照)。 -t (タッチ) オプションは、どんなコマンドも実行せずにファイルの変更日時をアップデートします。 コマンド行は通常、実行される前にプリントされますが、 行の先頭に@ がある場合には、 プリントを行わないようにします。 -s オプション、または makefile に特殊ターゲット .SILENT がある場合、すべてのコマンド行のプリントを行わないようにします。 @ を使用すると、プリントを選択的にオフにすることができます。 (初期タブを除いて) make によってプリントされた内容はすべて変更なしにシェルに直接渡されます。 したがって、
は、シェルが行うように ab を生成します。 -b オプションにより、以前の makefile( make の旧バージョン用に作成されたもの) がエラーなしで動作します。 旧バージョンの make は、ターゲットに対応付けられた明示的なコマンドがなければ、 ユーザーがコマンドをヌルにしたと見なし、 .DEFAULT 規則を定義した可能性があっても実行しません。現在のバージョンの make はデフォルトではこのモードで動作します。 ただし、現在のバージョンの make には、 -B オプションがあり、ターゲットに対応付けられた明示的なコマンドがなく、 .DEFAULT 規則が定義されている場合に .DEFAULT 規則が実行されるようにします。 -b および -B オプションには、ターゲットの検索、可能な位置、および適切な推論規則の実行への影響はないことに注意してください。 .DEFAULT 以外の組込みの推論規則の検索はつねに行われます。 シグナル SIGINT, SIGQUIT, SIGHUP, および SIGTERM ( signal(5) を参照) により、ターゲットが特殊名 .PRECIOUS に従属しない限り、ターゲットは削除されます。 オプション以下に、すべてのオプションといくつかの特殊名について簡潔に説明します。 オプションは、任意の順序で指定できます。 オプションは、別々に指定できます。また、 -f オプション以外は 1 つの - でまとめて指定できます。
並列 Makemake は、-P オプションを付けて呼び出されると、同時に複数のターゲットを並列に作成しようとします (これを行うには、複数のプロセスを同時に実行できる標準的な UNIX のシステムプロセス 装置を使用します)。前の項の例に示した makefile の場合、 a.o および b.o を並列に作成するプロセスを生成します。これらのプロセスが完了した後、 pgm を作成します。 make が並列に作成しようとするターゲットの数は、環境変数 PARALLEL によって決まります。 -P が指定され、 PARALLEL が設定されていない場合、 make が並列に作成しようとするターゲットは 2 つ以下になります。 .MUTEX 指令を使用すると、指定したターゲットのアップデートを順番に実行することができます。これは、lex および yacc で実行されるように、アーカイブにモジュールを挿入する場合、または、同じ名前を持つ中間ファイルを作成する場合などの、2 つ以上のターゲットが共通の出力ファイルを変更する場合に便利です。前の節の makefile に次の形式の .MUTEX 指令が含まれている場合、 make は a.o および b.o を並列に作成しないようにします。 .MUTEX: a.o b.o 環境環境 ( environ(5)を参照) で定義される変数はすべて make によって読み込まれ、マクロ定義として扱われ、処理されます。 ただし、 SHELL 環境変数はつねに無視されます。 SHELL 環境変数の値は、マクロとして使用されることはなく、makefile 内またはコマンド行に SHELL マクロを定義することによって変更されることはありません。 定義のない変数または空の文字列定義は make に含まれます。 マクロ定義の可能な 4 つのソース、つまり 内部 (デフォルト)、現在の環境、(単一または複数の)makefile、およびコマンド行があり、 この順序で読み込まれます。 処理のこの順序のために、makefile におけるマクロ割当ては環境変数より優先します。 -e オプションにより、環境は makefile におけるマクロ割当てに優先します。 コマンド行マクロ定義はつねにその他すべての定義に優先します。 MAKEFLAGS 環境変数は、コマンド行に対して定義された何らかの正当な入力オプション ( -f, -p, -d を除く) が含まれているという仮定のもとに、 make によって処理されます。 また、 MAKEFLAGS 変数は makefile で指定することもできます。 (XPG4 専用。 makefile 中の MAKEFLAGS は、 MAKEFLAGS 環境変数を置き換えます。コマンド行オプションは MAKEFLAGS 環境変数に優先します。) MAKEFLAGS がこれらのいずれの位置でも定義されなければ、 make は自分で変数を構成し、 コマンド行で指定したオプションとデフォルトオプションをすべてそこに入れ、 コマンドの呼び出しに渡します。したがって、 MAKEFLAGS には常に現在の入力オプションがあることになります。 これは、再帰的な makes に非常に便利であることがわかります。 -n オプションが指定されていても、文字列 $(MAKE) または ${MAKE} の入ったコマンド行が実行されます。 したがって、ユーザーは、再帰的にソフトウェアシステム全体に make -n を実行して何が実行されているかを調べることができます。これは、 -n が MAKEFLAGS に入れられ、 $(MAKE) または ${MAKE} の再帰呼び出しに渡されるために可能になります。 これは、実際にどのコマンドも実行せずにソフトウェアプロジェクトに対してすべての makefile をデバッグする 1 つの方法です。 規則における各コマンドは実行するシェルに与えられます。 使用するシェルはシェルコマンド インタプリタ ( sh(1) を参照) であるか、または SHELL マクロによって makefile で指定したものです。 makefile が実行されるごとに同じシェルを使用するようにするには以下の行 SHELL=/usr/bin/sh または適当な同等な行を makefile のマクロ定義セクションに入れる必要があります。 拡張子ターゲットや従属名には、多くの場合拡張子が付いています。 特定の拡張子についての知識は、 make に構築され、ターゲットをアップデートするのに適用される 適切な推論規則の識別に使用されます (「推論規則」の項を参照)。 拡張子の現在のデフォルトリストは以下のとおりです。
これらの拡張子は特殊な組込みのターゲット .SUFFIXES の従属条件として定義されます。 これは make によって自動的に行われます。 追加拡張子は、 .SUFFIXES の従属リストとして makefile で指定できます。 これらの追加値はデフォルト値に追加されます。 複数の拡張子リストは累積されます。 拡張子リストの順序には意味があります (「推論規則」の項を参照)。 ユーザーが拡張子の順序を変更したいときは、ヌル従属リストを使ってまず .SUFFIXES を定義しなければなりません。ヌル従属リストは .SUFFIXES の現在値をクリアします。 次に、必要な順序に拡張子を入れて .SUFFIXES を定義しなければなりません。 すべてのマシン上の make に構築される拡張子のリストは、以下の指定によって表示できます。 make -fp - 2>/dev/null </dev/null mymakefile という与えられた makefile に定義を組み込んだ組込み拡張子のリストは、 以下の指定によって表示できます。 make -fp mymakefile 2>/dev/null </dev/null 推論規則特定のターゲットまたは従属名 ( .o で終わるものなど) には、 .c および .s などの推論できる従属条件があります。 このような名前に対する update コマンドが makefile に現れず、 推論できる従属ファイルが存在する場合、 その従属ファイルは、ターゲットをアップデートするためにコンパイルされます。 この場合、 make には、拡張子を検査し、使用する適切な推論規則を判定することにより、他のファイルからファイルを構築できる推論規則があります。 デフォルト推論規則は現在以下のように定義されています。
ダブル拡張子推論規則 (.c.o) は、 x.c から x.o を構築する方法を定義します。 シングル拡張子推論規則 (.c) は、 x.c. から x を構築する方法を定義します。 実際、最初の拡張子はヌルです。 シングル拡張子規則は、例えばシェルプロシージャや単純な C プログラムなどの 1 つだけのソースファイルからターゲットを構築するのに便利です。 上記の規則におけるティルドは SCCS ファイル ( sccsfile(4) を参照) を参照します。 したがって、規則 .c~.o は SCCS C ソースファイルをオブジェクトファイル (.o) に変換します。 SCCS ファイルの s. がプレフィックスであるため、これには make の拡張子参照との互換性はありません。 したがって、ティルドは、任意のファイル参照を SCCS ファイル参照に変更する方法です。 拡張子 .c の付いたファイルから拡張子 .o の付いたファイルを作成する規則は、ターゲットとして .c.o があり、従属条件のないエントリーとして指定されます。 ターゲットと対応するシェルコマンドは .c ファイルから .o ファイルを作成のための規則を定義します。 スラッシュのないドットから始まるターゲット名はすべて、ターゲット (explicit) 規則ではなく推論 (implicit) 規則として認識されます。 ドットが 1 つあるターゲットはシングル拡張子推論規則です。 ドットが 2 つあるターゲットはダブル拡張子推論規則です。 ユーザーは、makefile でさらに推論規則を定義でき、デフォルトの推論規則の再定義か取消しができます。 .c ファイルを .o ファイルに変更するためのデフォルト推論規則は以下のようになります。 .c.o: そして、 yacc ファイルを C オブジェクトファイルに変更するためのデフォルト推論規則は以下のようになります。 .y.o: 特定のマクロは、生成される任意のコマンドにおいてオプション事項を含めることができるように、デフォルト推論規則で使用されます。例えば、 CFLAGS, LDFLAGS, YFLAGS は、それぞれ cc(1) lex(1) yacc(1) へのコンパイラオプションに使用します。 LDFLAGS は一般にリンカ/ローダオプションを表すのに使用します。 これらのマクロは make によって自動的に定義されますが、 makefile でユーザーが再定義することもできます。 マクロ LIBS は、規約により、コンパイルのリンクフェーズ時に何らかの特殊ライブラリの包含順序を指定するのに使用します。 特定のライブラリセットの特定の包含順序を指定するには、 .c ファイル用の既存のシングル拡張子規則、 $(CC) $(CFLAGS) $< $(LDFLAGS) -o $@ は、makefile で LIBS を定義する場合と同様に $(CC) $(CFLAGS) $< $(LDFLAGS) -o $@ $(LIBS) として再定義できます。 また、いくつかの特殊な組込みマクロも推論規則で使用します ((@, <)。 「組込みマクロ」の項を参照してください。 ターゲットに明示的な従属条件がないか、または従属条件にも対応する明示的な規則によって一致するターゲットがない場合、 make は、ターゲット (従属条件) の拡張子 (ヌルの場合もあります) および規則のもう一方の拡張子に一致するファイルの両方に一致する最初の推論規則を検索します。 これが .SUFFIXES 値のリストを前から後ろに通過することによってこの検索を実施するため、 .SUFFIXES の定義された順序は重要です。 任意のマシン上で make にコンパイルされる規則をプリントアウトするには以下のようにタイプしてください。 make -fp - 2>/dev/null </dev/null make が推論規則 .c.o を定義するため、 概要説明の項にある例は以下のようにより簡単に書けます。 OBJS = a.o b.o ライブラリターゲットまたは従属名に小かっこが含まれる場合、 それはアーカイブライブラリであるものと仮定され、 小かっこ内の文字列はライブラリ内のメンバーを参照します。 したがって、 lib(file.o) および $(LIB)(file.o) は両方とも file.o の入ったアーカイブライブラリを参照します (これは、 LIB マクロが既に定義されているものと仮定します)。 式 $(LIB)(file1.o file2.o) は無効です。 アーカイブライブラリに関連する規則には、 .xx.a という形式があります。 ただし、 xx は、アーカイブメンバーが作成される拡張子です。 現在のインプリメンテーションの使いづらい副作用は、 xx がアーカイブメンバーの拡張子と異なる必要があることです。 したがって、ユーザーは、 lib(file.o) を明示的に file.o に従属させることはできません。 アーカイブインタフェースの最も一般的な使い方は以下のとおりです。 ここでは、ソースファイルはすべて C タイプのソースであるものとします。 lib: lib(file1.o) lib(file2.o) lib(file3.o) ( <, @ , および * シンボルの説明については、「組込みマクロ」に関する項を参照してください。) 実際、上記の .c.a 規則は、 make に構築されるため、この例では不要です。 この規則は、今度は lib の各従属条件に適用されます。 以下の例では、これをさらに効率よく行います。 lib: lib(file1.o) lib(file2.o) lib(file3.o) ここで、マクロにおける置換えを使用します。 $? リストは、その C ソースファイルが最新状態でない ( lib 内の) オブジェクトファイル名のセットとなるように定義されます。 置換えシーケンスは .o を .c に変換します (残念ながら、ユーザーは今のところ .c~ に変換することはできません。 ただし、これは将来できるようになる可能性があります)。 また、各オブジェクトファイルを順々に作成、アーカイブする .c.a 規則をディスエーブルすることにも注意してください。 特にこの構文は、アーカイブライブラリの保守をかなりスピードアップしますが、アーカイブライブラリの内容がアセンブリプログラムと C プログラムの混合である場合には、非常に負荷が高くなります。 シンボルの定義を含むアーカイブメンバーは、シンボル名を二重括弧で囲んで、 lib((entry_name)) のように指定します。 それ以外の場合は、上述したように処理されます。 組込みターゲットmake には、いくつかの特殊ターゲットに関する知識があります。 これは、有効にするには makefile で指定しなければなりません ( .SUFFIXES は除きます。これは make によって自動的に設定されますが、ユーザーが変更できます)。
組込みマクロ内部保守されたマクロは 5 個あり、 これはターゲットを構築するための規則を作成するのに便利です。 これらのマクロの意味を明確に定義するために、用語 target および dependent に対する説明が必要になります。 make がターゲットをアップデートする際、実際にはアップデートする一連のターゲットを生成することがあります。何らかの規則 (明示的または暗黙のいずれか) が、それをアップデートするターゲットに適用される前に、 ターゲットの各従属条件に対して再帰が行われます。 再帰時に従属条件はターゲット自体になり、 独自の従属条件を保持または生成することがあります。 今度は、従属条件のないターゲットが見つかるまでその従属条件の再帰が行われ、 この時点で再帰が停止します。 make によって処理されたすべてのターゲットが、makefile において明示的なターゲットとして表示されるとは限りません。 makefile からの明示的な従属条件もあれば、 make がターゲットを再帰的にアップデートするにつれて生成される暗黙の従属条件もあります。 例えば、以下の makefile が実行されると、 pgm: a.o b.o 以下の一連のターゲットが生成されます。
以下の定義では、 target という用語が指すものは、makefile で指定されるターゲット、 make が再帰してターゲットになった makefile で指定される明示的な従属条件、 または make が再帰してターゲットになった暗黙の従属条件 (推論規則を検索した結果、およびターゲットの拡張子に一致するファイルとして生成されます) です。 「従属条件」という用語は、特定のターゲットの makefile で指定される明示的な従属条件、 または適切な推論規則を検索した結果、およびターゲットの拡張子に一致する対応するファイルとして生成された暗黙の従属条件を指します。 ターゲット規則を特定のターゲット名のためのユーザー指定の規則とみなし、 推論規則をターゲット名の特定のクラスのためのユーザーまたは make 指定の規則とみなすと有用です。 また、 make の明示的および暗黙の両方の従属条件に対して再帰すると、ターゲット名の値および対応する従属名が変化し、推論規則は、makefile でターゲット規則が定義されていない暗黙の従属条件または明示的な従属条件だけに適用されることに注意してください。
これら 5 個のマクロは別の形式をとることができます。 大文字 D または F が 5 個のマクロのいずれかに追加されると、意味は、 D の場合は「ディレクトリ部分」に、また F の場合は「ファイル部分」に変更されます。 したがって、 $(@D) は文字列$@ のディレクトリ部分を参照します。 ディレクトリ部分がなければ、 ./ が生成されます。 $? マクロに複数の従属名がある場合、 $(?D) はディレクトリ名部分のリストに展開され、 $(?F) はファイル名部分のリストに展開されます。 上記の組込みマクロのほかに、 その他の多用されるマクロが make によって定義されます。 これらのマクロはデフォルト推論規則で使用され、 -p オプションを使って表示できます。 これらのマクロは、makefile においてターゲット規則で使用できます。 また、makefile で再定義することもできます。
多言語化対応環境変数LANG は、多言語対応変数が未設定かヌルの場合のデフォルト値を指定します。 LANG が未設定かヌルであれば、デフォルト値の "C" ( lang(5) を参照) を使用します。多言語対応変数のいずれかの設定が不適当な場合、 make はすべての多言語対応変数が "C" に設定されているものとして動作します。 environ(5) を参照してください。 LC_ALL 空以外の文字列値に設定されていれば、他の多言語対応変数すべての値と置き換わります。 LC_CTYPE テキストをシングルバイトまたはマルチバイトのいずれの文字で解釈するか、 文字を印字可能として分類するか、また 正規表現の文字クラス式と照合する文字を決定します。 LC_MESSAGES 標準エラーに書き込んだ診断メッセージ、および標準出力に書き込んだ情報メッセージの形式と内容に影響するロケールを決定します。 NLSPATH は、 LC_MESSAGES の処理に使用するメッセージカタログの位置を求めます。 PROJECTDIR 現在のディレクトリで見つからなかった SCCS ファイルの検索に使用するディレクトリを示します。以下に示す場合ではすべて、 SCCS ファイルの検索は、指定したディレクトリ内のディレクトリ SCCS で行われます。 PROJECTDIR の値がスラッシュで始まっていれば絶対パス名とみなし、そうでなければその名前のユーザーのホームディレクトリで src または source というサブディレクトリを探します。 このようなディレクトリが見つかれば、それを使用します。見つからなければ、その値を相対パス名として使用します。 PROJECTDIR が未設定またはその値がヌルの場合、現在のディレクトリが最初に検索され、次に現在のディレクトリの SCCS ディレクトリが検索されます。 PROJECTDIR の設定は、 SCCS という名前の構成要素をもつファイルに関するこのユーティリティの以降の説明で記載されているすべてのファイルに適用されます。 戻り値make は、正常終了すると 0、 エラーが発生した場合には 0 よりも大きい値を戻します。 -q オプションを指定すると、 make は、ターゲットが最新状態であった場合には 0、 ターゲットが最新状態でなかった場合には 0 よりも大きい値を戻します。 例以下の例では、program.c が現在のディレクトリにある場合に、 makefile のない C ソースコード ファイルから実行可能ファイルを作成します。 make program 以下の例では、複数の makefile の指定といくつかのコマンド行マクロの定義を示し、 module1 で最初のターゲットをアップデートします。 make -f module1 -f module2 RELEASE=1.0 CFLAGS=-g 以下の例では、カレントディレクトリにあるデフォルト makefile で 2 つのターゲットをアップデートします。 make clobber prog 以下の例では、指定した makefile で prog ターゲットをアップデートし、 環境変数は makefile にある共通変数に置き換えます。 また、組込みの拡張子リストをクリアし、 組込み規則を無視し、徹底したデバッギング情報を出力します。 make -erd -f module1 prog 警告アクセス、変更、および最終修正時刻を make-ing プロセスによって変更できない任意のファイル (インクルードファイルなど) に注意してください。 例えば、プログラムがあるインクルードファイルに従属し、今度はそれが別のインクルードファイルに従属する場合、 また、これらのファイルの一方または両方が最新状態でない場合、 make は、これらのファイルを実行されるごとにアップデートしようとします。 したがって、インクルードファイルに従属する最新のファイルを re-makeing する必要はありません。 この解決法は、 make を実行する前に touch コマンドを使って、このようなファイルを手作業でアップデートしておくことです ( touch(1) を参照)。 不適当にゼロ以外のステータスを戻すコマンドもあります。この問題は、 -i を使用して解決します。 文字 = : @ $ を含むファイル名は使えません。 cd ( cd(1) を参照) などのシェルによって直接実行される内蔵コマンドは、 make では改行をはさむと無効になります。 構文 (lib(file1.o file2.o file3.o) は不正です。 file.o から lib(file.o) を構築することはできません。 マクロ $(a:.o=.c~) は動作しません。 展開したターゲット行には、終わりの改行を含めて 16384 文字以上を入れることはできません。 makefile が現在のディレクトリにない場合、 make filename とタイプすると、 make は、 filename.c から filename を構築しようとします。 make がシェルスクリプトで呼び出されたときに、引用符で囲んだ引き数の 評価値が NULL ($\@ など) になると、 make は異常終了します。 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||