Makefile-features
Makefile-その他の機能
この章では、Makefileのその他のさまざまな機能について説明します。
Makeの再帰的な使用
*make* を再帰的に使用するということは、 *make* をメイクファイルのコマンドとして使用することを意味します。 この手法は、より大きなシステムを構成するさまざまなサブシステム用に別々のメイクファイルが必要な場合に役立ちます。 たとえば、独自のmakefileを持つ「subdir」という名前のサブディレクトリがあり、そのディレクトリのmakefileでサブディレクトリで *make* を実行するとします。 あなたは以下のコードを書くことでそれを行うことができます-
subsystem:
cd subdir && $(MAKE)
or, equivalently:
subsystem:
$(MAKE) -C subdir
この例をコピーするだけで、再帰的な make コマンドを作成できます。 ただし、それらがどのように機能し、なぜ、そしてサブメイクがトップレベルのメイクにどのように関連するかについて知る必要があります。
サブメイクへの変数の伝達
最上位の make の変数値は、明示的な要求によって環境を通じてサブメイクに渡すことができます。 これらの変数は、サブメイクでデフォルトとして定義されています。 `-e 'スイッチを使用しない限り、サブmake makefileで使用されるmakefileで指定されているものをオーバーライドすることはできません。
変数を渡す、またはエクスポートするには、 make は変数とその値を環境に追加して、各コマンドを実行します。 サブメイクは、環境を使用して変数値のテーブルを初期化します。
特別な変数SHELLおよびMAKEFLAGSは常にエクスポートされます(エクスポートをアンエクスポートしない限り)。 MAKEFILESは、何かに設定するとエクスポートされます。
特定の変数をサブメイクにエクスポートする場合は、以下に示すように、エクスポートディレクティブを使用します-
export variable ...
変数がエクスポートされないようにする場合は、以下に示すように、unexportディレクティブを使用します-
unexport variable ...
変数MAKEFILES
環境変数MAKEFILESが定義されている場合、 make は、その値を他のメイクファイルの前に読み込まれる追加のメイクファイルの名前(空白で区切られた)のリストと見なします。 これはincludeディレクティブと同じように機能します。さまざまなディレクトリでそれらのファイルが検索されます。
MAKEFILESの主な用途は、 make の再帰呼び出し間の通信です。
異なるディレクトリのヘッダーファイルを含める
ヘッダーファイルを別のディレクトリに配置し、別のディレクトリで make を実行している場合、ヘッダーファイルのパスを指定する必要があります。 これは、メイクファイルの-Iオプションを使用して実行できます。 functions.hファイルが/home/finddevguides/headerフォルダーにあり、残りのファイルが/home/finddevguides/src/フォルダーにあるとすると、makefileは次のように記述されます-
INCLUDES = -I "/home/finddevguides/header"
CC = gcc
LIBS = -lm
CFLAGS = -g -Wall
OBJ = main.o factorial.o hello.o
hello: ${OBJ}
${CC} ${CFLAGS} ${INCLUDES} -o $@ ${OBJS} ${LIBS}
.cpp.o:
${CC} ${CFLAGS} ${INCLUDES} -c $<
変数にさらにテキストを追加する
多くの場合、すでに定義されている変数の値にテキストを追加すると便利です。 これを行うには、次のように「+ =」を含む行を使用します-
objects += another.o
変数オブジェクトの値を取得し、テキスト「another.o」を追加します。次に示すように、スペースを1つ付けます。
objects = main.o hello.o factorial.o
objects += another.o
上記のコードは、オブジェクトを「main.o hello.o factorial.o another.o」に設定します。
`+ = 'の使用は次のようになります。
objects = main.o hello.o factorial.o
objects := $(objects) another.o
Makefileの継続行
Makefileの大きすぎる行が気に入らない場合は、以下に示すようにバックスラッシュ「\」を使用して行を分割できます-
OBJ = main.o factorial.o \
hello.o
is equivalent to
OBJ = main.o factorial.o hello.o
コマンドプロンプトからMakefileを実行する
「Makefile」という名前のMakefileを準備した場合は、コマンドプロンプトでmakeと記述するだけでMakefileファイルが実行されます。 しかし、あなたがMakefileに他の名前を付けている場合は、次のコマンドを使用します-
make -f your-makefile-name