シンプルで理解しやすいMakefileエントリ(10)-makeとexportのネストされた実行の使用

1.makeのネストされた実行

大きなプロジェクトファイルでは、さまざまなファイル機能がさまざまなモジュールに分割されているため、各モジュールには独自のコンパイラの順序とルールがあります。Makefileすべてのモジュールの説明がルールファイルをコンパイルすると、実行も不便になるため、必要なのは、さまざまなモジュールで説明されているルールです。各モジュールはMakefileファイルに書き込まれるため、管理が簡単であるだけでなく、問題のあるモジュールをすばやく特定できます。他のモジュールを制御する必要があるだけでMakefilemakeネストされた実行である全体的な制御を実現できます

それを使用する方法?例は次のとおりです。

subsystem:
    cd subdir && $(MAKE)

この例は理解できます。現在のディレクトリにカタログファイルがsubdirあり、Makefileファイルのsubdir下にファイルサブディレクトリがありMakefile、コンパイルされたファイルサブディレクトリのルールを説明するために使用されるファイルがあります。

makeコマンドを使用する場合は、ディレクトリの最外層でのみ実行する必要があります。コマンドが上記のルールに従って実行されると、プログラムはサブディレクトリの実行に入りmakeます。これはネストされた実行でありmake、最も外側でMakefileはトータルコントロールとして知られていMakefileます。

上記のルールは、別の書き方に変更することもできます。

subsystem
    $(MAKE) -C subdir

ではmake、ネストされた実行、我々は変数を知っている必要がありCURDIR、この変数が表す、make作業ディレクトリを。コマンドが指定されたディレクトリに入るときmakeオプションを使用する-Cと、この変数が再割り当てされます。

つまり、Makefileこの変数の割り当てが明示的にない場合は、make作業ディレクトリを表します。Makefileもちろん、この変数の再割り当てがmake作業ディレクトリを表さなくなった後、この変数に新しい値を割り当てることもできます。

2.エクスポートの使用

make変数が渡されるときにネストされた実行を使用することに注意する必要があります。変数を渡す必要がある場合は、次のように使用できます。

export <variable>

あなたがそれを必要としないならば、あなたはそれをこのように書くことができます:

unexport <variable>

<variable>変数の名前です$。この文字は使用しないでくださいすべての変数を渡す必要がある場合は、exportそれを使用するだけでよく、変数の名前を追加する必要はありません。

export VALUE1 := export.c    <-- 用了 export, 此变量能够传递到 ./other/Makefile 中
...
@cd ./other && make
...

export 構文形式は次のとおりです。

export variable = value
export variable := value
export variable += value

Makefile2つの変数があるか、キーワードexportステートメントを使用していないため、常に下Makefile中央に渡されます。これらの二つの変数があるSHELLMAKEFLAGS、特にMAKEFLAGS変数が含まれているmakeパラメータ情報を。

全体的な制御の実行Makefilemakeパラメーターを含むコマンド、またはMakefileこの変数の上位定義の場合、変数のMAKEFLAGS値はmake、コマンドに渡され、Makefileシステムレベルの環境変数である下位層に渡されるパラメーターになります。

make渡されていないパラメータコマンドには、いくつかのオプションがありますが、彼らは:-C-f-o-h-WMAKEFLAGS変数の値を渡したくない場合はMakefile、次のように記述します。

subsystem:
    cd subdir && $(MAKE) MAKEFLAGS=

3.ネストされた実行の例

ディレクトリ構造は次のとおりです。

wohu@ubuntu:~/cpp/func$ tree
.
├── demo.cpp
├── demo.h
├── Makefile
└── subdir
    └── Makefile

1 directory, 4 files
wohu@ubuntu:~/cpp/func$ 

現在のディレクトリのMakefile内容:

export GLOBAL_VAR = 123
SUBDIR = ./subdir 

all:
	echo "this is main Makefile"
	echo $(GLOBAL_VAR)
	cd $(SUBDIR) && $(MAKE)

subdirMakefileコンテンツのディレクトリ

all:
	echo "this is subdir Makefile"
	echo "display GLOBAL_VAR" $(GLOBAL_VAR)

現在のディレクトリmake出力で実行

wohu@ubuntu:~/cpp/func$ make
echo "this is main Makefile"
this is main Makefile
echo 123
123
cd ./subdir  && make
make[1]: Entering directory '/home/wohu/cpp/func/subdir'
echo "this is subdir Makefile"
this is subdir Makefile
echo "display GLOBAL_VAR" 123
display GLOBAL_VAR 123
make[1]: Leaving directory '/home/wohu/cpp/func/subdir'
wohu@ubuntu:~/cpp/func$ 

おすすめ

転載: blog.csdn.net/wohu1104/article/details/111085938
おすすめ