1. Trabajo de configuración del kernel de Linux
Este artículo analiza específicamente lo que realmente hace el Makefile de nivel superior al configurar el código fuente del kernel de Linux.
Este artículo continúa el análisis del artículo anterior, la dirección es la siguiente:
2. hacer el proceso xxx_defconfig
Artículo anterior, analizado:
Al configurar el código fuente del kernel de Linux (es decir, ejecutar el comando "make xxx_defconfig"), el Makefile de nivel superior en realidad ejecuta el siguiente comando:
make -f ./scripts/Makefile.build obj= scripts/basic
make -f ./scripts/Makefile.build obj= scripts/kconfig xxx_defconfig
Analicemos qué hacen exactamente estos dos comandos. Específicamente dividido en dos comandos, se implementan dos funciones.
1. Comando correspondiente al destino scripts_basic
Los comandos correspondientes al destino scripts_basic son:
make -f ./scripts/Makefile.build obj= scripts/basic
Abra el
archivo
scripts/Makefile.build
y tenga el siguiente código:
41 # The filename Kbuild has precedence over Makefile
42 kbuild-dir := $(if $(filter /%,$(src)),$(src),$(srctree)/$(src))
43 kbuild-file := $(if $(wildcard $(kbuild-dir)/Kbuild),$(kbuilddir)/Kbuild,$(kbuild-dir)/Makefile)
44 include $(kbuild-file)
El comando anterior se
expande a:
kbuild-dir=./scripts/basic
kbuild-file= ./scripts/basic/Makefile
include ./scripts/basic/Makefile
Continúe analizando
scripts/Makefile.build
, el siguiente código:
94 __build: $(if $(KBUILD_BUILTIN),$(builtin-target) $(lib-target)
$(extra-y)) \
95 $(if $(KBUILD_MODULES),$(obj-m) $(modorder-target)) \
96 $(subdir-ym) $(always)
97 @:
_build es el destino predeterminado. Debido a que el comando "@make -f ./scripts/Makefile.build obj=scripts/basic" no especifica un destino, se utilizará el destino predeterminado __build .
En el Makefile de nivel superior, KBUILD_BUILTIN es 1 y KBUILD_MODULES está vacío, por lo que el objetivo expandido __build es:
__build:$(builtin-target) $(lib-target) $(extra-y)) $(subdir-ym) $(always)
@:
Se puede ver que el objetivo
__build
tiene
5
dependencias:
buildin-target
,
lib-target
,
extra-y
,
subdir-ym
y
siempre
.
Los contenidos específicos de estas
cinco
dependencias son los siguientes:
builtin-target =
lib-target =
extra-y =
subdir-ym =
always = scripts/basic/fixdep scripts/basic/bin2c
Entonces __build termina siendo:
__build: scripts/básico/fixdep scripts/basic/bin2c@:
__build
depende de
scripts/basic/fixdep
y
scripts/basic/bin2c
, por lo que primero debe agregar
scripts/basic/fixdep
y
Los dos archivos scripts/basic/bin2c.c
se compilan en
fixdep
y
bin2c
.
En resumen, la función de scripts_basic target es compilar scripts/basic/fixdep y scripts/basic/bin2c.
Dos programas.
El siguiente artículo continúa analizando la función del segundo comando.