Linux カーネルのトップレベル Makefile の make xxx_defconfig プロセスの分析

1. Linux カーネルの構成

Linux を初めてコンパイルする前に、「make xxx_defconfig」コマンドを使用して Linux カーネルを構成する必要があります。

「make xxx_defcofig」コマンドが実行されたときに、Linux カーネル ソース コードのトップレベル Makefile が何を行うかを分析してみましょう。

2. Makefileのmake xxx_defconfig処理

Linux を初めてコンパイルする前に、最初make xxx_defconfig 」コマンドを使用してLinuxカーネルを構成する必要があります。

以下に示すように、その中に「 %config 」ターゲット があります
490 config-targets := 0
491 mixed-targets := 0
492 dot-config := 1
493
494 ifneq ($(filter $(no-dot-config-targets), $(MAKECMDGOALS)),)
495 ifeq ($(filter-out $(no-dot-config-targets), $(MAKECMDGOALS)),)
496 dot-config := 0
497 endif
498 endif
499
500 ifeq ($(KBUILD_EXTMOD),)
501 ifneq ($(filter config %config,$(MAKECMDGOALS)),)
502 config-targets := 1
503 ifneq ($(words $(MAKECMDGOALS)),1)
504 mixed-targets := 1
505 endif
506 endif
507 endif
508
509 ifeq ($(mixed-targets),1)
510 # =================================================================
511 # We're called with mixed targets (*config and build targets).
512 # Handle them one by one.
513
514 PHONY += $(MAKECMDGOALS) __build_one_by_one
515
516 $(filter-out __build_one_by_one, $(MAKECMDGOALS)):
__build_one_by_one
517 @:
518
519 __build_one_by_one:
520 $(Q)set -e; \
521 for i in $(MAKECMDGOALS); do \
522 $(MAKE) -f $(srctree)/Makefile $$i; \
523 done
524
525 else
526 ifeq ($(config-targets),1)
527 # ================================================================
528 # *config targets only - make sure prerequisites are updated, and 
529 # descend in scripts/kconfig to make the *config target
530
531 # Read arch specific Makefile to set KBUILD_DEFCONFIG as needed.
532 # KBUILD_DEFCONFIG may point out an alternative default
533 # configuration used for 'make defconfig'
534 include arch/$(SRCARCH)/Makefile
535 export KBUILD_DEFCONFIG KBUILD_KCONFIG
536
537 config: scripts_basic outputmakefile FORCE
538 $(Q)$(MAKE) $(build)=scripts/kconfig $@
539
540 %config: scripts_basic outputmakefile FORCE
541 $(Q)$(MAKE) $(build)=scripts/kconfig $@
...
563 endif # KBUILD_EXTMOD
490行目 から 507行目は ubootと同じ 、変数config-targets mixed-targets 、およびdot-configを設定および定義しています。
これら 3 つの変数の最終値は次のとおりです。
config-targets= 1
mixed-targets= 0
dot-config= 1

config-targets=1なので、534~541行目が成立します。
行 534 は、arch/arm/Makefile ファイルを参照しています。zImage や uImage などのファイルは、arch/arm/Makefile によって生成されるため、このファイルは非常に重要です。
行 535 は、変数 KBUILD_DEFCONFIG KBUILD_KCONFIG をエクスポートします。
537 行目、一致するターゲットがないため実行されません。
540行目「make xxx_defconfig」がターゲットの「%config」と一致するので実行されます。

ターゲット " %config "は scripts_basic outputmakefile およびFORCEに依存しています" %config "の実際に意味のある唯一の依存関係は scripts_basic です。

scripts_basic のルールは次のとおりです。

448 scripts_basic:
449 $(Q)$(MAKE) $(build)=scripts/basic
450 $(Q)rm -f .tmp_quiet_recordmcount

build は ファイル scripts/Kbuild.include で定義されており、値は build := -f $(srctree)/scripts/Makefile.buildです。
obj の場合 上記のコマンドは次のように展開されます。
scripts_basic:
@make -f $(srctree)/scripts/Makefile.build obj=scripts/basic //也可以没有@,视配置而定
@rm -f . tmp_quiet_recordmcount //也可以没有@

%config ターゲットに対応する構成コマンド:

540 %config: scripts_basic outputmakefile FORCE
541 $(Q)$(MAKE) $(build)=scripts/kconfig $@

次のように展開します。

$(Q)$(MAKE) $(build)=scripts/basic
$(Q)$(MAKE) $(build)=scripts/kconfig $@

上記のコマンドの 2 行目の$@は、ターゲット ( %config、つまり xxx_defconfig ) を指します。

$(srctree) パラメータは . .

最後に、%config ターゲットに対応する構成コマンドは次のように展開されます。

make -f ./scripts/Makefile.build obj= scripts/basic 
make -f ./scripts/Makefile.build obj= scripts/kconfig xxx_defconfig

次の記事では、これら 2 つの構成コマンドが実際に何を行うのかを詳しく分析します。

おすすめ

転載: blog.csdn.net/wojiaxiaohuang2014/article/details/133107207
おすすめ