makefile チュートリアル
makefileを使い始める
サーチ…
備考
makefileは、 make
プログラムの動作を制御するテキストファイルです。 make
プログラムは通常、ソースファイルからプログラムの作成を管理するために使用されますが、より一般的には、他のファイル(または前提条件 )が変更された後にファイル(またはターゲット )を再生成する必要のあるプロセスを処理するために使用できます。 makefileは、ターゲットと前提条件の関係を記述し、1つ以上の前提条件が変更された場合にターゲットを最新にするために必要なコマンドも指定します。 make
が "期限切れ" make
判断する唯一の方法は、対象ファイルの変更時刻とその前提条件を比較することです。
メークファイルは、いくつかの点でややユニークで、最初は混乱する可能性があります。
まず、メイクファイルは、同じファイル内の全く異なる2つのプログラミング言語で構成されています。ファイルの大部分は言語で書かれているmake
理解することができます:これは、変数の代入や拡張を提供し(他のファイルなど、ファイルのセクションの条件付き解析を含む)いくつかのプリプロセッサ機能だけでなく、ターゲットの定義とその前提条件。さらに、各ターゲットには、そのターゲットを最新の状態にするためにどのコマンドを呼び出さなければならないかを指定するレシピを関連付けることができます。レシピはシェルスクリプト(デフォルトではPOSIX sh)として書かれています。 make
プログラムはこのスクリプトを解析しません。シェルを実行し、実行するシェルにスクリプトを渡します。レシピがmake
によって解析されmake
、代わりに別のシェルプロセスによって処理されるという事実は、makefileを理解する上での中心的な役割を果たします。
第2に、makefileはスクリプトのような手続き型言語ではありません。makeはmakefile make
解析するので、ターゲットがグラフのノードであり、前提条件の関係がエッジである有向グラフを内部的に構築します。すべてのメイクファイルが完全に解析され、グラフが完成した後でのみ、1つのノード(ターゲット) make
選択し、最新のものにしようとします。ターゲットが最新であることを保証するためには、ターゲットの前提条件のそれぞれが最新であることを再帰的に確認する必要があります。
バージョン
名 | としても知られている | 初期バージョン | バージョン | 発売日 |
---|---|---|---|---|
POSIX make | 1992年 | IEEE Std 1003.1-2008、2016版 | 2016-09-30 | |
NetBSD make | bmake | 1988年 | 20160926 | 2016-09-26 |
GNU make | gmake | 1988年 | 4.2.1 | 2016年6月10日 |
SunPro make | dmake | 2006年 | 2015-07-13 | |
MSVS nmake | 2003年 | 2015p3 | 2016年6月27日 |
基本的なMakefile
「こんにちは!」と書いてみましょう。プログラムはc。ソースコードがsource.cというファイルに入っているとしましょう。コンパイルが必要なプログラムを実行するために、通常はLinux上で(gccを使って) $> gcc source.c -o output
と入力する必要があり$> gcc source.c -o output
output生成される実行可能ファイルの名前です。基本的なプログラムではうまくいくが、プログラムが複雑になるにつれてコンパイルコマンドも複雑になる可能性がある。これはMakefileが入っているところで、makefilesは、プログラムをコンパイルする方法のかなり複雑な規則を書き出し、コマンドラインでmakeとタイプすることで単純にコンパイルすることができます。例えば、上のhello woldの例のためのMakefileがあります。
基本的なMakefile
基本的なMakefileを作成し、Makefileの名前の私たちのソースコードと同じディレクトリに、当社のシステムに保存することができます。このファイルはMakefileという名前にする必要がありますが、議院Mはオプションです。それは、キャピトルMを使用することが比較的標準的であると述べた。
output: source.c
gcc source.c -o output
2行目にgccコマンドの前に正確に1つのタブがあることに注意してください(これはメークファイルでは重要です)。ユーザがmake(Makefileと同じディレクトリにある)をタイプするたびにこのMakefileが書き込まれると、makeは出力よりも最近変更された場合にはsource.cが変更されているかどうかをチェックします次の行のコンパイルルール。
Makefileの変数
プロジェクトによっては、makeファイルにいくつかの変数を導入することができます。次に、変数を持つMakefileの例を示します。
CFLAGS = -g -Wall
output: source.c
gcc $< $(CFLAGS) -o $@
今ここで何が起こったのか調べてみましょう。最初の行では、CFLAGSという名前の変数を宣言しました。この変数には、コンパイラに渡す可能性があるいくつかの共通フラグがあります。この変数に好きなだけ多くのフラグを格納できます。それから、source.cを確認して出力よりも最近変更されたかどうかを確認するようにmakeに伝える前と同じ行があります。もしそうなら、コンパイルルールを実行します。私たちのコンパイルルールは以前と同じですが、変数を使って短縮されました。 $<
変数はmakeに組み込まれています(自動変数と呼ばれます) 。https://www.gnu.org/software/make/manual/ html_node / Automatic-Variables.html )、これは常にソースを表します。この場合、 source.cです。 $(CFLAGS)
は前に定義した変数ですが、この$(someVariable)
ように前に$を付けて括弧で$(someVariable)
があることに注意してください。これは、以前に入力したものに変数を展開するようにMakeに指示するための構文です。最後に、$ @記号があります。もう一度これはmakeに組み込まれた変数であり、コンパイルステップのターゲットを表しています 。この場合、 出力を表します 。
クリーン
make cleanは、makeファイルについて学ぶもう1つの便利な概念です。上からMakefileを変更できるようにする
CFLAGS = -g -Wall
TARGETS = output
output: source.c
gcc $< $(CFLAGS) -o $@
clean:
rm $(TARGETS)
ご覧のとおり、 Makefileにルールを1つ追加し、すべてのターゲットを含む変数を1つ追加するだけです。これは、make $> make clean
タイプするだけで、作成したすべてのバイナリをすばやく削除することができるので、makefileにある程度の共通ルールです。 make cleanとタイプすることで、makeプログラムにクリーンルールを実行するよう指示し、makeはrmコマンドを実行してすべてのターゲットを削除します。
この簡単な概要を使って、ワークフローをスピードアップするのに役立つことを願っています。 メークファイルは非常に複雑になりますが、これらのアイディアでは、makeを使い始めることができ、他のプログラマーのMakefilesで何が起こっているのかをよく知ることができます 。優れたリソースを作成する方法の詳細については、 https://www.gnu.org/software/make/manual/を参照してください 。
ルールの定義
クイックスタート
ルールは、特定のファイル(ルールのターゲット )がいつどのように作成されるかを記述します。また、作成に必要なファイル(ターゲットの前提条件 )のいずれかがターゲットよりも新しい場合、ターゲットファイルを更新することもできます。
ルールは以下の構文に従います(ルールに続くコマンドはタブでインデントされます )
targets: prerequisites
<commands>
ターゲットと前提条件がファイル名であるか、特殊な予約名とコマンド (存在する場合)がシェルによって実行され、古くなったターゲットを構築/再構築します。
ルールを実行するには、単にMakefileが置かれているのと同じディレクトリから端末でmake
コマンドを実行します。ターゲットを指定せずにmake
を実行すると、 Makefileに定義されている最初のルールが実行されます 。規約上、 Makefileの最初のルールはallまたはdefaultと呼ばれることが多く、一般的にすべての有効なビルドターゲットを前提条件としてリストします。
make
は、ターゲットが期限切れの場合、ルールが存在しないか、またはその変更時刻が前提条件のどれより古いかを意味するルールを実行します。前提条件のリストが空の場合、ルールは、ターゲットをビルドするために最初に呼び出されたときにのみ実行されます。ただし、ルールがファイルを作成せず、ターゲットがダミー変数の場合、ルールは常に実行されます。
パターンルール
パターンルールは、複数のターゲットを指定し、ターゲット名から前提条件名を構成するために使用されます。それぞれのターゲットが独自の前提条件を持つことができるため、通常のルールと比べてより一般的で強力です。パターンルールでは、ターゲットと前提条件の関係は、パス名と接尾辞、またはその両方を含む接頭辞に基づいて構築されます。
Cのスクリプトfoo.c
とbar.c
をそれぞれコンパイルして、ターゲットfoo.o
とbar.o
をビルドしたいとします。これは以下の通常の規則を使用して行うことができます:
foo.o: foo.c
cc -c $< -o $@
bar.o: bar.c
cc -c $< -o $@
ここで、 自動変数 $<
は最初の前提条件の名前で、 $@
はターゲットの名前です(自動変数の完全なリストはここにあります )。
ただし、ターゲットが同じ接尾辞を共有するため、上記の2つのルールを次のパターンルールに置き換えることができます。
%.o: %.c
cc -c $< -o $@
暗黙のルール
暗黙のルールはmake
通常のメソッドを使用して、非常に頻繁に使用される特定のタイプのターゲットファイルを構築make
方法を教えmake
ます。 make
は、ターゲットファイル名を使用して、どの暗黙のルールを呼び出すかを決定します。
前のセクションで見たパターンルールの例は、 make
がCコンパイルのための暗黙のルールを持っているので、 Makefileで実際に宣言する必要はありません。したがって、次のルールでは、前提条件はfoo.o
とbar.o
構築する前に、Cのコンパイルのための暗黙のルールを使用して構築されますfoo
。
foo : foo.o bar.o
cc -o foo foo.o bar.o $(CFLAGS) $(LDFLAGS)
暗黙的なルールのカタログとそれらが使用する変数は、 ここで見つけることができます 。
ファイルをgzipするジェネリックルール
ディレクトリに2つのファイルが含まれている場合:
$ ls
makefile
example.txt
makefile
には次のテキストが含まれています
%.gz: %
gzip $<
シェルで入力してexample.txt.gz
を入手できexample.txt.gz
$ make -f makefile example.txt.gz
makefileは、同じ名前で接尾辞が.gzのファイルがある場合、名前が.gzで終わるファイルを作成する方法を指示するルールを1つだけ指定します。
makefile Hello World
C:\ makefile:
helloWorld :
[TAB]echo hello world
結果を実行する:
C:\>make
echo hello world
hello world
注意: [TAB]は実際のタブに置き換えてください。stackoverflowはタブをスペースで置き換え、スペースはメークファイルのタブと同じには使用しません。