トップレベルのターゲットが前提条件として複数の vmlinux バイナリ (Linux カーネル) を必要とする Make ベースのプロジェクトがあるため、次のようになります。
all: bigfile
bigfile: bigfile.cfg a/vmlinux b/vmlinux c/vmlinux foo bar baz
sometool -obigfile -ibigfile.cfg # other inputs referenced from within the config
各 Linux ルールは多かれ少なかれ次のようになります。
a/vmlinux: a/.config
$(MAKE) -C $(A_LINUX_SRC) O=$(PWD)/a vmlinux
a/.config
mkdir -p a
$(MAKE) -C $(A_LINUX_SRC) O=$(PWD)/a $(A_LINUX_DEFCONFIG)
b および c Linux カーネルの場合も同様です。それぞれが同じまたは異なるソース ツリーを持つ可能性があり、ほぼ確実に異なる defconfig を持つことに注意してください。
これはクリーン ビルドでは機能しますが、再帰呼び出しを行うのはあまり好きではありません。上記の数行をどのように微調整するかによって、次のいずれかになるようです。
- 何も変更されていない場合でも、不必要な再帰がLinuxツリーに作成されます(何もしないのに7秒かかります)
- Linux ソースを編集すると、明示的に .config などに触れない限り、カーネルは再生成されません。
理想的には、最上位の Makefile が各 Linux カーネルの内部依存関係グラフを認識し、あらゆる状況下で「正しいことを行う」ようにしたいと考えています。(つまり、recursive-make-considered-harmful 引数)。
トップレベルの Linux の Makefile が他の誰かにインクルードされるのは好ましくないだろうとは思いますが、特に構成や src ツリーが異なる場合は何度もそうです! (私は baz/makefile.inc bar/makefile.inc を制御しているので、トップレベルに含まれているときにうまく動作するように書くことができます)
または、私は運が悪く、.configs に触れて、各 Linux ビルド ディレクトリに適切なトリガーをトリガーすることを覚えておく必要がありますか?
ありがとう、デイブ
編集:Linuxツリーに7秒間の無駄なまともなものは、私のマシンでは次のようになります。
$ time make
make -C /home/davidm/md/tests/linux O=/home/davidm/md/tests/linux_a vmlinux
make[1]: Entering directory `/home/davidm/linux-2.6.38'
Using /home/davidm/linux-2.6.38 as source for kernel
GEN /home/davidm/md/tests/linux_a/Makefile
CHK include/linux/version.h
CHK include/generated/utsrelease.h
make[3]: `include/generated/mach-types.h' is up to date.
CALL /home/davidm/md/linux-2.6.38/scripts/checksyscalls.sh
CHK include/generated/compile.h
make[1]: Leaving directory `/home/davidm/md/linux-2.6.38'
real 0m6.577s
user 0m2.930s
sys 0m1.360s