Tomemos un ejemplo específico y descubramos qué hace en el kernel 4.1, p. Ej. IHEX
.
Encuentra lo hace un código
Simplemente ejecute:
make SHELL='sh -x'
cómo funciona: https://stackoverflow.com/a/32010960/895245
Si GrEP la salida de IHEX
, nos encontramos con las líneas:
+ echo IHEX firmware/e100/d101s_ucode.bin
IHEX firmware/e100/d101s_ucode.bin
+ objcopy -Iihex -Obinary /home/ciro/git/kernel/src/firmware/e100/d101s_ucode.bin.ihex firmware/e100/d101s_ucode.bin
entonces concluimos que IHEX
hace un objcopy -Iihex
.
encontrar dónde un código se define
Cada comando del núcleo se debe definir con algo como:
quiet_cmd_ihex = IHEX [email protected]
cmd_ihex = $(OBJCOPY) -Iihex -Obinary $< [email protected]
$(obj)/%: $(obj)/%.ihex
$(call cmd,ihex)
para la configuración de cantidad de información (por ejemplo V=1
y make -s
) para trabajar.
Así que, en general, sólo hay que
git grep 'cmd.* = CODE'
encontrar CODE
.
he explicado en detalle cómo funciona este sistema en: https://stackoverflow.com/a/32023861/895245
obtener la lista de todos los códigos
make | grep -E '^ ' | sort -uk1,1
de CC y CC [M]
Definido en scripts/Makefile.build
:
quiet_cmd_cc_o_c = CC $(quiet_modtag) [email protected]
cmd_cc_o_c = $(CC) $(c_flags) -c -o [email protected] $<
y la [M]
proviene de la target specific variables:
$(real-objs-m) : quiet_modtag := [M]
$(real-objs-m:.o=.i) : quiet_modtag := [M]
$(real-objs-m:.o=.s) : quiet_modtag := [M]
$(real-objs-m:.o=.lst): quiet_modtag := [M]
$(obj-m) : quiet_modtag := [M]
Se llama entonces a través de:
$(obj)/%.o: $(src)/%.c $(recordmcount_source) FORCE
[...]
$(call if_changed_rule,cc_o_c)
define rule_cc_o_c
[...]
$(call echo-cmd,cc_o_c) $(cmd_cc_o_c); \
donde if_changed_rule
se define en scripts/Kbuild.include
como:
if_changed_rule = $(if $(strip $(any-prereq) $(arg-check)), \
@set -e; \
$(rule_$(1)))
y Kbuild.include
vaya a incluirse en el archivo Makefile de nivel superior.
LD
Hay algunas versiones, pero la más sencilla parece ser:
quiet_cmd_link_o_target = LD [email protected]
cmd_link_o_target = $(if $(strip $(obj-y)),\
$(LD) $(ld_flags) -r -o [email protected] $(filter $(obj-y), $^) \
$(cmd_secanalysis),\
rm -f [email protected]; $(AR) rcs$(KBUILD_ARFLAGS) [email protected])
$(builtin-target): $(obj-y) FORCE
$(call if_changed,link_o_target)
y en scripts/Kbuild.include
:
# Execute command if command has changed or prerequisite(s) are updated.
#
if_changed = $(if $(strip $(any-prereq) $(arg-check)), \
@set -e; \
$(echo-cmd) $(cmd_$(1)); \
printf '%s\n' '[email protected] := $(make-cmd)' > $(dot-target).cmd)
http://unix.stackexchange.com/questions/199060/what-do-the-terms-cc-ld-and-shipped-refer-to-during-the-kernel-source-compilati –