一、模块编译
modbuild:touch_voice_files
//进行内核源码目录,并执行modules目标编译,后面执行modules_install模块安装
//编译
cd$(KERNEL_DIR); $(MAKE) modules && $(MAKE) modules_install
二、模块预处理
touch_voice_files:
//删除endpt目录下临时文件(.a、.lib、.ko、.cmd、.mod)
findbcmdrivers/broadcom/char/endpoint/ \( -name '*.o' -o -name '*.a' -o-name '*.lib' -o
-name'*.ko' -o -name '*.cmd' -o -name '.*.cmd' -o -name '*.c' -o -name'*.mod' \) -print
-execrm -f "{}" ";"
//删除第一阶段endpt模块的临时文件
rm-rf kernel/linux/.tmp_versions/endpointdd.mod
//删除脚本开始生成的内核默认配置
rm-rf kernel/linux/arch/mips/defconfig
//删除中间过程中endpt所有配置对应的头文件项
rm-rf kernel/linux/include/config/bcm/endpoint/
//删除所有临时文件.o、.lib
findkernel/linux/lib/ -name '*.o' -print -exec rm -f "{}" ";"
findkernel/linux/lib/ -name '*.lib' -print -exec rm -f "{}" ";"
三、
//模块编译(因为我们没有使用M=编译宏进行单独指定模块编译,所有KBUILD_EXTMOD
//为空,走为空的编译流程)。
modules:$(vmlinux-dirs-2) $(if $(KBUILD_BUILTIN),vmlinux)
//在如下目录中查找含有modules.order文件的目录,并将所有modules.order文件
//统一合并到内核目录下的单个modules.order文件中
$(Q)$(AWK)'!x[$$0]++' $(vmlinux-dirs:%=%/modules.order) >$(objtree)/modules.order
//输出要进行第二阶段模块编译的打印
@$(kecho)' Building modules, stage 2.';
//调用Makefile.modpost进行第二阶段模块编译
$(Q)$(MAKE)-f $(srctree)/scripts/Makefile.modpos
//主要是特定驱动所需要的二进制固件进行安装,当前ENDPT没有涉及,不关心
$(Q)$(MAKE)-f $(srctree)/scripts/Makefile.fwinst obj=firmware __fw_modbuild
//这时从下面所有变量中获取仅含有目录(就是最后面是\的字符)的变量,并将最后的\
//字符去除,比如BCM驱动变量的字符串为/xxx/bcm6818/bcmdrivers/,则最终字符变换后
//字符串为/xxx/bcm6818/bcmdrivers
vmlinux-dirs :=$(patsubst %/,%,$(filter %/, $(init-y) $(init-m) \
$(core-y) $(core-m) $(drivers-y) $(drivers-m) \
$(brcmdrivers-y) $(brcmdrivers-m) \
$(net-y) $(net-m) $(libs-y) $(libs-m)))
//BCM驱动相关目录,这里我们只关心BRCMDRIVERS_DIR
brcmdrivers-y :=$(INC_BRCMBOARDPARMS_PATH)/$(BRCM_BOARD)/ $(BRCMDRIVERS_DIR)/$(INC_SPI_PATH)/ $(INC_FLASH_PATH)/
//BCM编译环境下的bcmdrivers目录
BRCMDRIVERS_DIR= $(BUILD_DIR)/bcmdrivers
//BUILD_DIR变量在BCM编译环境的主Makefile里定义的
BUILD_DIR= $(shell pwd)
//Linux内核源码目录
objtree :=$(CURDIR)