メイクファイルの役割
Makefileのは多くのファイルがあるプロジェクト、自動的にコンパイルとリンクするために使用されたときにメイク、各ファイルの変更は、再リンクするプロジェクトをリードし、すべてではなく、ファイルの再コンパイルする必要があり、Makefileのファイル情報が記録されますこれは、ファイルを再コンパイルする必要がリンク時に決定されます。Makefileの使命です:コンパイラがどのような他のファイルに依存するファイルの必要性をコンパイルするために知ってみましょう。それらの依存ファイルが変更された場合は、コンパイラが自動的に最終生成されたファイルが古くなっわかりますし、対応するモジュールを再コンパイルする必要があります。メイクことのメリットをもたらす- 「自動コンパイル」書かれたら、あなただけのmakeコマンドを必要とする、プロジェクト全体が大幅にソフトウェア開発の効率を向上させることができる完全自動のコンパイラです。「たGNUmakefile」という名前のファイルを、「メイク」、見つけるために、現在のディレクトリ内のデフォルト、makeコマンドによって 「Makefileの」 ファイルを、この文書の説明を見つけます。コースメイクファイルを指定するには、DIR /メイク-fメイクをも使用すること
二つのmakefile構文概説
2.1 makefileのルール
ターゲット...:依存関係...
コマンド
オブジェクトファイルをすることができ、対象オブジェクト・ファイルは、ファイルもラベルすることができ、実行することができ
、それが必要な対象のファイルまたはターゲットを生成することで、依存関係。
makeコマンドを実行するコマンドです。(任意のシェルコマンドは、いくつかの行があってもよいです)
これはつまり、ファイルの依存関係で、対象ファイルのターゲット一つ以上のコマンドで定義されたその生成規則でファイルの依存関係に依存します。ターゲットファイルよりも新しい単語を提出するために、複数の時間がある場合は、依存関係、コマンド定義されたコマンドが実行されます。これはMakefileののルールです。Makefileはコアコンテンツです。コマンドのMakefileには、[Tab]キーで開始する必要があります。
2.2変数の定義
:Makefileの変数は、一般的に2つです定義さ =と:=。=シンボルのみ使用時に膨張するだけ開い;: =定義が拡張されると、シンボルは、直ちに変数のような変数を定義して、可変遅延と呼ばれる変数を定義しました。+ = =定義された変数は、新しい値を追加するために使用することができます=使用して、追加の新しい値を使用して変数を定義していません
2.3ファイルが示します
使用キーワードは、他のが来た含めることができるのMakefileのMakefileに含め、多くのC言語のように、#includeし、それは場所が含まれている現在のファイルであるとして、ファイルが元のモデルに含まれます。含む構文は次のとおりです含む<ファイル名> ファイル名(セキュリティパスとワイルドカードを含んでいてもよい)シェルのファイルシステムの現在の動作モードとすることができます
2.4 pseudotarget
擬似ターゲットは、ファイルではありませんだけでラベル擬似ターゲットはファイルではありませんので、それが依存関係を生成し、それを実行するか否かを判断することはできません作り、。私たちは、これだけの目標は明示的で有効にするに許可することができますを示しています。それ以外の場合は無意味な擬似ターゲットになり、もちろん、疑似ターゲットは名前を付けることができないと、同じ名前のファイル名。もちろん、同じ名前のこのような状況とファイルを避けるために、我々は特別なマークを使用することができます.PHONYを明示するために擬似ターゲット目標があることを示し、この文書かどうか、指示をするために、目標は擬似ターゲットです。
2.5変数の自動化
$ < 依存の最初のファイルの名前
$? スペース、変更日で区切られたすべての依存ファイルは、これらの依存関係は、ターゲット日付より後に作成することができます
@ $ ターゲットの完全な名前
$ ^ すべての依存ファイルは、スペースで区切って、重複した依存ファイルが含まれていません
3つの一般的なメイクファイルの例
プロジェクトする必要があります。
トップMakefileのトップMakefile.buildサブディレクトリのMakefile
コンパイルプロセス:
.oファイルをビルドin.oにすべての詰めの層、その後、GCCで始まる、リストの一番下に入るときに再帰的にサブディレクトリの中に上から順に、親ディレクトリを再帰的に入力するようにそれを返しますサブディレクトリには、すべてのサブディレクトリをコンパイルし終えたときに、トップ.cファイルをコンパイルし始め、最終的に私たちの先のファイルへの各トップレベルのビルドin.oリンクの.oファイルとサブディレクトリのトップ
トップMakefileの解析(プロジェクトおよび変更を伴います):
#----------------------------------------------指定コンパイルツールチェーン------------------------------------------------- -
CROSS_COMPILE =#コンパイラ指定された種
#としてAS = $(CROSS_COMPILE)
LD = $(CROSS_COMPILE)LD#リンクツール
CC = $(CROSS_COMPILE)のgcc#コンパイラツール
CPP = $(CC)-E#
ツールをパッケージング#AR AR = $(CROSS_COMPILE)
NM = $(CROSS_COMPILE)NM#
STRIP = $(CROSS_COMPILE)ストリップ#最適化ツール
objcopyを= $(CROSS_COMPILE)objcopyを#
objdumpの= $(CROSS_COMPILE)objdumpの#
LD CC CPP AR NMの#変数としてエクスポートは、他のメイクファイルの使用を容易にするために、エクスポートを定義し
輸出STRIP objcopyをobjdumpのの#変数は、他のメイクファイルの使用を容易にするために、エクスポートを定義し
CFLAGS = -Wall -O2 -g#コンパイラの引数
CFLAGS + = -I $(シェルPWD )/#含むヘッダ・ファイルは、コンパイラ指定(手動実際の項目に応じて変更)を
LDFLAGS:= -lm -lfreetype -lvga#コンパイラ指定されたリンクライブラリ(手動で実際のプロジェクトに応じて変更)
輸出CFLAGS LDFLAGSの#変数は、他のメイクファイルの使用を容易にするために、エクスポートを定義し
TOPDIR:= $(シェルPWD)#GET現在のプログラムのトップレベルディレクトリ
出力の最上位ディレクトリの輸出TOPDIRの#
TARGET =プログラム名show_file#コンパイラ後に(手動で実際のプロジェクトに応じて変更)
最上位のフォルダと同様に生成される#-------------------------トップ.oファイル(手動実際のプロジェクトに応じて変更) ------ ------------
OBJ-Y + = main.o
OBJ-Y + =表示/
OBJ-yが+ =ドロー/
OBJ-Y + =エンコーディング/
OBJ-Y + =フォント/
最初のトップレベル#--------------------------------------------ルール(デフォルトルール)-----------------------------------------
すべて :
トップmakefile.buildを使用してコンパイルされ、現在のディレクトリに-C ./ -f $(TOPDIR)/Makefile.build#を作ります
ビルトインin.oコンパイルされたファイルのリンク$(CC)$(LDFLAGS)-o $(TARGET)を内蔵しin.o#私たちのターゲットファイルを生成します
#------------------------------------------------トップパージルール----------------------------------------------- --------
掃除:
RM -f $(シェルのfind -name "* .oの")#は、すべてのファイルを削除するの.o
RM -f $(シェルのfind -name "* .dの")#は、すべてのファイルを削除します.D
RM -f $(TARGET)#は、ターゲットファイルを削除します
.PHONY:すべてきれい
トップMakefile.buildは(変更なし)解決しました:
偽:= __build#変数偽りを定義します
__build:#説明が最初の目標Makefile.build作り、擬似ターゲットの始まりを__build
OBJ-Y:=#カレントディレクトリを定義するターゲット変数は、初期値は空であります
SUBDIR-Y:#カレントディレクトリのサブディレクトリ変数が定義されている=、初期値が空であります
メイクファイル#メイクファイルが現在のディレクトリに来る含めることは、初期化OBJ-Yが含まれています
#オブジェクト - Y:= AO BO C / D /
__subdir-Y:= $(patsubst%/、%、$(フィルタ%/ $(OBJ-Y)))#現在選択されたターゲット変数のサブディレクトリ内のディレクトリ、及び/削除
#$(フィルタ%/ $(OBJ-Y))C / D /
#__ SUBDIR-Y:CD
割り当て開始__subdir-yと定義されるサブディレクトリ-Y + = $(__サブディレクトリ-Y)#サブディレクトリ-Y
#SUBDIR-Y:CD
subdir_objs:= $(foreachのF、$(サブディレクトリ-Y)、$(F)/built-in.o)サブディレクトリ-Y(ディレクトリ)内の各値について#/内蔵ディレクトリにおける対応する増加。変数の値O
#subdir_objs:C /ビルトインin.od /ビルトインin.o
cur_objs:= $(フィルタアウト%/ $(OBJ-Y))OBJ-Yで取得したファイルの.o#
#cur_objs:BO
dep_files:= $(。foreachのF、$(cur_objs)、$(F)・D)すべての.oファイルの場合#、その依存ファイル名を定義
#dep_files:.ad .BD
dep_files:= $(ワイルドカード$(dep_files))
来るの依存性があるかどうかを判断するために、ファイル名に依存するに従ってifneq($(dep_files)、)#が存在するが含まれています
$(dep_files)が含ま
ENDIF
偽+ = $(サブディレクトリ-Y)#$(サブディレクトリ-Y)変数も偽のに添加されます
--------------------------------------------のMakefile。最初のビルドルール------------------------------------------------ --------------
__build:$(サブディレクトリ-y)を内蔵しin.o#最初のルール
$(SUBDIR-Y):#依存関係ルールの最初のルール
作る-C $ @ -f $(TOPDIR)/Makefile.buildの#値はMakefile.buildがコンパイルに使用サブディレクトリ変数、内部に格納され順次入力されました
二番目のルールに依存する$(cur_objs)$(subdir_objs)#最初のルール:ビルトインin.o
$(LD)-r -o $ @ $ ^#このルールを命じる:ビルトインin.oファイルにパッケージディレクトリ下の.oおよび$(subdir_obj)
dep_file = 。$ @。D #
%.O:最初のルールの第依存ルール%.C#依存関係ルール
$(CC)$(CFLAGS)-Wp、-MD、$(dep_file)-c -o $ @ $ <#ディレクトリ内の.oファイルにすべての.cファイルをコンパイルするために使用されます
.PHONY:$(偽の)#は、偽のオブジェクトの意志を偽りとして宣言しました
サブディレクトリのMakefile(プロジェクトおよび変更を伴います):
サブディレクトリMakefileは、ディレクトリ内の宛先ファイル名やフォルダ名のすべてのサブディレクトリを含めることです。
例えば、任意のサブディレクトリは、次のように書くことができます。
OBJS-Y:= AO
OBJS-Y + = BO
OBJS-Y + = C /
OBJS-Y + = D /
プロジェクトの4つの例