1.makeのネストされた実行
大きなプロジェクトファイルでは、さまざまなファイル機能がさまざまなモジュールに分割されているため、各モジュールには独自のコンパイラの順序とルールがあります。Makefile
すべてのモジュールの説明がルールファイルをコンパイルすると、実行も不便になるため、必要なのは、さまざまなモジュールで説明されているルールです。各モジュールはMakefile
ファイルに書き込まれるため、管理が簡単であるだけでなく、問題のあるモジュールをすばやく特定できます。他のモジュールを制御する必要があるだけでMakefile
、make
ネストされた実行である全体的な制御を実現できます。
それを使用する方法?例は次のとおりです。
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
Makefile
2つの変数があるか、キーワードexport
ステートメントを使用していないため、常に下Makefile
中央に渡されます。これらの二つの変数があるSHELL
とMAKEFLAGS
、特にMAKEFLAGS
変数が含まれているmake
パラメータ情報を。
全体的な制御の実行Makefile
、make
パラメーターを含むコマンド、またはMakefile
この変数の上位定義の場合、変数のMAKEFLAGS
値はmake
、コマンドに渡され、Makefile
システムレベルの環境変数である下位層に渡されるパラメーターになります。
make
渡されていないパラメータコマンドには、いくつかのオプションがありますが、彼らは:-C
、-f
、-o
、-h
と-W
。MAKEFLAGS
変数の値を渡したくない場合は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)
subdir
Makefile
コンテンツのディレクトリ:
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$