知識ベース

メイクファイル

メイクファイルは、 メイクビルド自動化ツールがターゲット/目標を生成するために使用する一連のディレクティブを含むファイル(デフォルトでは「メイクファイル」という名前)です。

概要

ほとんどの場合、 メイクファイルは、プログラムをコンパイルおよびリンクする方法をMakeに指示します。 メイクファイルは、依存関係が作成/再作成されるファイルよりも新しい場合にのみ、ファイルの再作成が必要という原則に基づいて機能します。 makefileは、すべてが更新され(更新が必要)、プライマリ/最終ターゲットが完了するまで、再帰的に実行されます(依存関係は各ターゲットの前に準備されます)。これらの命令とその依存関係は、 メイクファイルで指定されます。プログラムが最後にコンパイルされてから前提条件であるファイルが変更されていない場合、アクションは実行されません。大規模なソフトウェアプロジェクトの場合、Makefileを使用すると、少数のソースファイルのみが変更された場合にビルド時間を大幅に短縮できます。

C / C ++を例として使用すると、C / C ++ソースファイルが変更された場合、再コンパイルする必要があります。ヘッダーファイルが変更された場合は、ヘッダーファイルを含む各C / C ++ソースファイルを安全に再コンパイルする必要があります。コンパイルごとに、ソースファイルに対応するオブジェクトファイルが生成されます。最後に、ソースファイルが再コンパイルされた場合、すべてのオブジェクトファイルは、新しく作成されたものでも、以前のコンパイルで保存されたものでも、新しい実行可能プログラムを作成するためにリンクする必要があります。

オペレーティング・システム

Unixライク

MakefileはUnixライクなシステムで作成されたものであり、このような環境では依然として主要なソフトウェアビルドメカニズムです。

マイクロソフトウィンドウズ

Windowsは、 nmakeユーティリティを使用してさまざまなメイクファイルをサポートしています。標準のUnixライクなmakefileは、Cygwin環境またはMingwのWindowsで実行できます。

内容

Makefileには、 明示的ルール暗黙的ルール変数定義ディレクティブコメントの 5種類が含まれます

  • 明示的なルールは、ルールのターゲットと呼ばれる1つまたは複数のファイルをいつ、どのようにリメイクするかを指示します。ターゲットの前提条件と呼ばれる、ターゲットが依存する他のファイルをリストし、ターゲットの作成または更新に使用するレシピを提供する場合もあります。
  • 暗黙のルールは、名前に基づいてファイルのクラスをいつ、どのようにリメイクするかを指示します。ターゲットがターゲットに似た名前のファイルにどのように依存するかを説明し、そのようなターゲットを作成または更新するためのレシピを提供します。
  • 変数定義は、後でテキストに置き換えることができる変数のテキスト文字列値を指定する行です。
  • ディレクティブとは、makeが別のmakefileを読み込むなど、makefileを読み込むときに特別なことを行うようにmakeに指示することです。
  • makefileの行にある「#」はコメントを開始します。それと行の残りは無視されます。

ルール

メイクファイルは、次の形式の「ルール」で構成されます。

ターゲット:依存関係システムコマンド

ターゲットは通常、プログラムによって生成されるファイルの名前です。ターゲットの例は、実行可能ファイルまたはオブジェクトファイルです。ターゲットは、実行するアクションの名前(「クリーン」など)にすることもできます。

依存関係前提条件とも呼ばれます)は、ターゲットを作成するための入力として使用されるファイルです。ターゲットは多くの場合、いくつかのファイルに依存しています。ただし、ターゲットのレシピを指定するルールに前提条件はありません。たとえば、ターゲット「クリーン」に関連付けられた削除コマンドを含むルールには前提条件がありません。

システムコマンド( レシピとも呼ばれます )は、makeが実行するアクションです。レシピには、同じ行またはそれぞれの行に複数のコマンドがある場合があります。コマンドを指定する際に意味のあるインデントを使用していることに注意してください。また、インデントは単一のtab>文字で構成する必要があることに注意してください。

実行

makeコマンドはmakeファイルで実行されます(例:make)。デフォルトでは、makeがmakefileを検索するときに、makefile名がパラメーターとして含まれていなかった場合、 makefileMakefileの順に名前を試します。

次に、 編集と呼ばれる実行可能ファイルが4つのオブジェクトファイルに依存する方法を説明するメイクファイルを示します。これらのオブジェクトファイルは、4つのCソースファイルと2つのヘッダーファイルに依存します。具体的には、editがターゲットであり、edit.o、kbd.o、command.o、display.oは実行可能ファイルを作成するためにリンクするオブジェクトであり、defs.hおよびcommand.hはオブジェクトを正しくコンパイルするために必要なヘッダーです。 、および$(CC)-c -o $ @ $ $(CCFLAGS)はシステムコマンドです。

  • $ @はターゲットを参照するマクロです
  • $ は、最初の依存関係を参照するマクロです
  • $ ^はすべての依存関係を参照するマクロです
  • %は、ターゲットと依存関係の両方で監視するパターンを作成するマクロです

ヘッダーのいずれかが変更された場合、メイクファイルはすべてのオブジェクトを再コンパイルしますが、個々の.cファイルが変更された場合、そのファイルを再コンパイルしてからすべてのオブジェクトを再リンクする必要があります。よく書かれたmakeルールは、何が変化し、何が変化しなかったかを検出することにより、コンパイル時間を短縮するのに役立ちます

メイクファイルをより拡張可能かつ読みやすくするために変数と静的パターンルールが使用される方法に注意してください。各.cから各.oを作成し、オブジェクトから各ターゲットを作成するために、同じ再利用可能なルールを定義します。

また、一度に1つのメインのみをリンクできるため、リンク時に他のメインを除外する必要があることに注意してください。

ターゲットallおよびcleanは、実際のファイルを参照しないため、.PHONYという名前になりますが、実行したいものです。

CC:= gcc CCFLAGS:= LDFLAGS:= TARGETS:= edit MAINS:= $(addsuffix .o、$(TARGETS))OBJ:= kbd.o command.o display.o $(MAINS)DEPS:= defs.h command.h .PHONY:all clean all:$(TARGETS)clean:rm -f $(TARGETS)$(OBJ)$(OBJ):%.o:%.c $(DEPS)$(CC)-c- o $ @ $ $(CCFLAGS)$(TARGETS):%:$(filter-out $(MAINS)、$(OBJ))%.o $(CC)-o $ @ $(LIBS)$ ^ $( CCFLAGS)$(LDFLAGS)

このmakefileを使用してeditという名前の実行可能ファイルを作成するには、make allまたはmake editと入力します。このmakefileを使用して実行可能ファイルとすべてのオブジェクトファイルをディレクトリから削除するには、make cleanと入力します。