1

カーネルのMakefileはKBUILD_OUTPUT、ターゲットのmakeプロセスの外部と同じように変数を初期化します。コードは次のようになります。

ifeq ("$(origin O)", "command line")
  KBUILD_OUTPUT := $(O)
endif

しかしKBUILD_OUTPUT、ターゲットのmakeプロセス、たとえばターゲットで出力しようとするとhelp、定義されていないことがわかります。私が変更したコードは次のとおりです。

help:
    @echo 'KBUILD_OUTPUT: ${KBUILD_OUTPUT}'

を実行するmake O=../build helpと、KBUILD_OUTPUT変数は空になります。いつ初期化されるのか知りたいですか?

どうもありがとう。

アップデート

ただし、これを使用してMakefileを作成すると、次のようになります。

ifeq ("$(origin O)", "command line")
  KBUILD_OUTPUT := $(O)
endif

help:
    @echo 'KBUILD_OUTPUT: ${KBUILD_OUTPUT}'

それから私は走りますmake O=../build help、私は見るでしょうKBUILD_OUTPUT: ../build

カーネルのMakefileに何か特別なものはありますか?

4

1 に答える 1

2

カーネルの作成プロセスは、ほとんどの作成よりも少し複雑です。メインカーネルのmakefileは、それ自体を再帰的に呼び出します(つまり、makeを呼び出して、それ自体をmakefileとして指定しますが、異なるターゲットセットを指定します)。このため、メインカーネルのMakefileの大部分には条件があり、Makeが最初に呼び出されたときに実行される部分と、makefileがそれ自体の子として呼び出されたときに実行される部分があります。引用しているコードは、実際には次のとおりです。

ifeq ($(KBUILD_SRC),)

# OK, Make called in directory where kernel src resides
# Do we want to locate output files in a separate directory?
ifeq ("$(origin O)", "command line")
  KBUILD_OUTPUT := $(O)
endif

ヘルプターゲットを作成すると、Makefileはそのルールのみを実行するため、再帰的にそれ自体を呼び出すことはありません。したがって、KBUILD_SRCは設定されず、KB​​UILD_OUTPUTは未設定のままになります。

ジョン

于 2013-01-22T15:59:47.570 に答える