Make概要Makefile基本構造とルール

3943 ワード

Make概要makeユーティリティは、大規模なプログラムのどの部分を再コンパイルする必要があるかを自動的に決定し、コマンドを発行して再コンパイルします.タスクを記述するために使用できます.一部のファイルは、他のファイルの変更時に他のファイルから自動的に更新する必要があります.すなわち、依存関係と依存関係です.
makeを使用する準備をするには、makefileというファイルを作成する必要があります.このファイルは、プログラム内のファイル間の関係を記述し、各ファイルを更新するコマンドを提供します.
通常、プログラムでは、実行可能ファイルはターゲットファイルから更新され、ターゲットファイルはソースファイルをコンパイルすることによって生成されます.
適切なmakefileが存在すると、ソースファイルを変更するたびに、この簡単なshellコマンドを実行します.makeは必要なすべての再コンパイルを実行するのに十分です.
makeプログラムはmakefileデータベースとファイルの最後の変更時間を使用して、どのファイルが更新されるかを決定します.各ファイルについて、データベースに記録されたリスト(recipe)にパブリッシュされます.コマンドラインパラメータを使用して、再コンパイルするファイルと再コンパイルする方法を制御できます.
Makefileを紹介makefileという名前のファイルが必要です.makeに何をするかを教えてください.ほとんどの場合、makefileはmakeにプログラムのコンパイルとリンク方法を教えます.
8つのCソースファイルと3つのヘッダファイルからなるテキストエディタeditorをコンパイルしてリンクする方法を説明する簡単なmakefileについて説明します.
edit : main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o
cc -o edit main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o
main.o : main.c defs.h
cc -c main.c
kbd.o : kbd.c defs.h command.h
cc -c kbd.c
command.o : command.c defs.h command.h
cc -c command.c
display.o : display.c defs.h buffer.h
cc -c display.c
insert.o : insert.c defs.h buffer.h
cc -c insert.c
search.o : search.c defs.h buffer.h
cc -c search.c
files.o : files.c defs.h buffer.h command.h
cc -c files.c
utils.o : utils.c defs.h
cc -c utils.c
clean :
rm edit main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o

makefileはまた、makeが明示的な要求時に他のコマンドを実行する方法、例えば、クリーンアップ(clean)操作としてファイルを削除する方法を示すこともできます.
makeがeditorを再コンパイルする場合は、変更したCソースファイルを再コンパイルする必要があります.ヘッダファイルが変更されている場合は、ヘッダファイルを含む各Cソースファイルを再コンパイルして安全を確保する必要があります.コンパイルするたびに、ソースファイルに対応するターゲットファイルが生成されます.最後に、ソースファイルが再コンパイルされた場合、すべてのターゲットファイルは、新しく作成されたものでも、以前のコンパイルから保存されたものでも、新しい実行可能editorを生成するためにリンクする必要があります.
  • ルール簡単なmakefileは、
  • という形のルールから構成されています.
    target ... : prerequisites ...
    recipe
    ...
    ...
    

    targetは通常、プログラムによって生成されるファイルの名前である.targetは、実行可能ファイルまたはターゲットファイルを列挙します.targetは、cleanなどの実行する操作の名前であってもよい.
    前提条件(prerequisites)は、作成先の入力として使用されるファイルです.ターゲット(target)は、通常、いくつかのファイルに依存します.
    recipe(リスト)は実施を制定する行動である.1つのrecipeには複数のコマンドがあり、同じラインにあるか、それぞれのラインにあるかのいずれかです.注意:tab(キーボード上のジャンプキーTAB)を各行のrecipeの先頭に置く必要があります.
    通常、recipeには、任意の前提条件(prerequisites)が変更されたときにターゲットファイルを作成するための前提条件(prerequisites)があるルールが含まれます.
    ただし、ターゲットにrecipeを指定するルールには前提条件は必要ありません.たとえば、target「clean」に関連付けられたdeleteコマンドを含むルールには前提条件がありません.
    次に、ルールは、特定のルールのターゲットであるファイルをどのように再生成するかを説明します.makeがこのrecipeを実行する前提条件は、ターゲットの作成または更新です.ルールは、アクションをどのように実行するか、およびいつ実行するかを説明することもできます.
    1つのmakefileにはルール以外のテキストを含めることができますが、簡単なmakefileにはルールを含めるだけです.ルールは、このテンプレートに表示されるよりも複雑に見えるかもしれませんが、多かれ少なかれこのモードに合致しています.
    上記の例は、editという実行可能ファイルが8つのターゲットファイルに依存する方法を記述した簡単なmakefileであり、この8つのターゲットファイルは8つのCソースコードと3つのヘッダファイルに依存する.この例では、すべてのCファイルにdefsが含まれる.hですが、commandは定義編集コマンドにのみ含まれます.h.bufferは、エディタバッファの下位ファイルを変更する場合にのみ含まれる.h. 各長い行を2行に分割するには、反スラッシュ/改行を使用します.これは長い行を使うようですが、読みやすいです.
    このmakefileを使用してeditという実行可能ファイルを作成するには、次のように入力します.
    make
    

    このmakefileを使用してディレクトリから実行可能ファイルとすべてのターゲットファイルを削除するには、次のように入力します.
    make clean
    

    前提条件(prerequisites)はmainのようです.cとdef.hというファイル.
    実際にはoファイルはターゲットであり、前提条件である.
    リスト(recipe)はcc-c mainを含む.cとcc-c kbdc.
    targetがファイルである場合、prerequisitesが変更された場合は、再コンパイルまたは再リンクが必要です.また、自動的に生成されるprerequisitesは、まず更新する必要があります.
    この例では、編集は8つのターゲットファイルのそれぞれに依存します.宛先ファイルmain.oソースファイルmainに依存する.cとヘッダファイルdefs.h.
    recipeはtargetおよびprerequisitesを含む各行に従う可能性があります.これらのrecipeは、ターゲットファイルを更新する方法を示しています.tabは、recipeとmakefileの他の行を区別するためにrecipeの各行の先頭にある必要があります.makeはこれらのrecipeの役割について何も知らないので、ターゲットファイルを正しく更新するrecipeを提供することができます.すべてのmake操作はtargetファイルを更新する必要がある場合に指定したrecipeを実行します.
    target:cleanはファイルではなく、アクションの名前です.通常、このルールの操作を実行したくないため、cleanは他のルールの前提条件prerequisitesではありません.したがって、特に説明しない限り、makeは何もしません.このルールは、前提条件(prerequisites)ではなく、前提条件もないため、指定したリスト(recipe)を実行することが唯一の目的です.ファイルを参照しないが操作するターゲットを偽ターゲット(phony targets)と呼ぶ.