1.编译流程

CSDN

2.输出内容和源码分离

NPU模块 kernel5.4 androidP Makefile,target部分如下:

modules:
        echo CC=$(CC)
        echo CROSS_COMPILE=$(CROSS_COMPILE)
        echo M=$(M)
        echo KERNEL_SRC=$(KERNEL_SRC)
        echo O=$(O)
ifeq ($(CC),clang)
        #./aml_buildroot.sh $(M) $(KERNEL_SRC) $(O) $(CC) $(HOSTCC) $(LD) $(NM) $(OBJCOPY) $(KERNEL_ARCH)
        $(MAKE) -C $(KERNEL_SRC) M=$(M)/hal  modules ARCH=$(KERNEL_ARCH)  "EXTRA_CFLAGS+=-I$(INCLUDE) -Wno-error -I$(EXTRA_CFLAGS1) $(CONFIGS_BUILD) $(EXTRA_INCLUDE)" $(CONFIGS)
else
        $(MAKE) -C $(KERNEL_SRC) M=$(M)/hal  modules ARCH=$(KERNEL_ARCH)  "EXTRA_CFLAGS+=-I$(INCLUDE) -Wno-error -I$(EXTRA_CFLAGS1) $(CONFIGS_BUILD) $(EXTRA_INCLUDE)" $(CONFIGS)
endif

all:modules

modules_install:
        echo OUT_DIR=$(OUT_DIR)
ifeq ($(CC),clang)
        #$(MAKE) INSTALL_MOD_STRIP=1 M=$(M) -C $(KERNEL_SRC) modules_install
        $(MAKE) INSTALL_MOD_STRIP=1 M=$(M)/hal -C $(KERNEL_SRC) modules_install
else
        $(MAKE) INSTALL_MOD_STRIP=1 M=$(M)/hal -C $(KERNEL_SRC) modules_install
endif
        mkdir -p ${OUT_DIR}/../vendor_lib/modules
        cd ${OUT_DIR}/$(M)/; find -name "*.ko" -exec cp {} ${OUT_DIR}/../vendor_lib/modules/ \\;

2.1.module目标

上述log中带+的为上层调用npu仓Makefile对应的语句,以第一句Makefile为例

对应就是调用上述Makefile中的默认目标,即modules,可以看到除了指定了KERNEL_SRC变量,还指定了O变量(对应 kernel编译生成的结果所在的目录),由第1部分的实验或参考

Makefile中调用make命令,-C和-f选项的区别

可知,这些命令行中指定的变量是可以传递给更底层的Makefile中的,即kernel中的Makefile

M变量是使用的相对路径,M=../../npu(M=$(M)/hal可知,传到kernel中的M=../../npu/hal),其实这个相对路径会在两个地方起作用,

  1. Kernel中Makefile最终要include NPU仓的Makefile,会根据此相对路径include,以KERNEL_SRC变量+M变量,定位到NPU仓Makefile的路径,即/mnt/fileroot/yuyin.wei/06_android_P/vendor/amlogic/common/kernel_54/common/../../npu/hal
  2. 最终生成的galcore.ko文件会存放到的目录会用到此相对路径,以O变量+M变量的路径为最终存放的路径,即/mnt/fileroot/yuyin.wei/06_android_P/out/android-11/common/../../npu/hal

所以,这就达到了源码和编译生成的ko在不同的目录

2.2.module_install目标

这里提一下modules_install目标,根据如上log android上层Makefile会调用此目标,目的是安装编译生成的galcore.ko,也就是拷贝此ko文件到指定目录,最终测试结果如下: