1

トップレベルのターゲットが前提条件として複数の 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
4

1 に答える 1

2

これが正しく機能するためには、ビルドごとにカーネル ソース ディレクトリに再帰する必要があります。大規模なカーネル ツリー内のファイルが変更されたかどうかを確認するのに 7 秒という時間は、それほど悪くはありません...

カーネル ビルド自体が再帰的な make を使用するため、ビルドにカーネル makefile を含めても実際には役に立ちません。

おそらく次のようなものです:

a/.config
        mkdir -p a
        $(MAKE) -C $(A_LINUX_SRC) O=$(PWD)/a $(A_LINUX_DEFCONFIG)

.PHONY: kernel-a-build
kernel-a-build: a/.config
        $(MAKE) -C $(A_LINUX_SRC) O=$(PWD)/a vmlinux

bigfile: kernel-a-build

は「偽の」ターゲットであるためkernel-a-build(物理ファイルに対応していません)、すべてのビルドで実行され、カーネル makefile がソース ファイルの変更を認識できるようになります。

于 2012-08-31T14:10:57.107 に答える