CROSS_COMPILE:指定编译器的前缀
ARCH:指定平台
export:用于设置或显示环境变量
-C: 指定Linux内核源代码的根目录
M:指定单独编译的模块所在的目录
参考:编译模块命令make -C M=与make -C SUBDIRS=_VClol的博客-CSDN博客_make subdirs
make -C /usr/src/linux-2.6.15.5/ M=/driver_study/ modules编译结果:
make -C /usr/src/linux-2.6.15.5/ M=/driver_study/ modules
make: Entering directory `/usr/src/linux-2.6.15.5'
CC [M] /driver_study/hello.o
Building modules, stage 2.
MODPOST
CC /driver_study/hello.mod.o
LD [M] /driver_study/hello.ko
make: Leaving directory `/usr/src/linux-2.6.15.5'
从中可以看出,编译过程中,经历了这样的步骤:先进入Linux内核所在的目录,并编译出hello.o文件,运行MODPOST会生成临时的hello.mod.c文件,而后根据此文件编译出hello.mod.o,之后连接hello.o和hello.mod.o文件得到模块目标文件hello.ko,最后离开Linux内核所在的目录。
参考:linux指令 make -C ..... M =.... - dos_hello_world - 博客园
2.6内核中,模块的编译需要配置过的内核源码;编译、连接后生成的内核模块后缀为.ko;编译过程首先会到内核源码目录下,读取顶层的Makefile文件,然后再返回模块源码所在目录。
Makefile资料,参考makefile详解 - 一叶飘落尽知秋 - 博客园
1、wifi驱动中的Makefile:
all: modules
modules:
$(MAKE) ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) -C $(KSRC) M=$(shell pwd) modules
当执行make -j32时,因为没有指定目标,默认执行all目标,all指定的modules目标,执行modules目标;注意,此时的modules目标是当前Makefile文件中自己定义的目标,而在自定义的modules目标实现中出现的'make modules'的执行路径只能是内核源码顶层目录,执行结果是:读取内核源码顶层目录(根目录)中的 Makefile 文件,找到里面定义的 modules 目标。
参考:linux make modules 命令详解_滨边美波她男友的博客-CSDN博客_make modules
2、最终单独只编译某个驱动的完整命令
make ARCH=arm CROSS_COMPILE=~/.../gcc/linux-x86/arm/arm-linux-androideabi-4.9/bin/arm-linux-androideabi- -C ~/.../kernel M=~/.../kernel/drivers/wifi/rtl8821CS modules
补充 :
$(ARCH) 、$(CROSS_COMPILE) 、$(KSRC)中的ARCH、CROSS_COMPILE、KSRC都是变量,需要定义变量值,这里给出一个例子:
ARCH := arm
CROSS_COMPILE := ~/xxx/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.9/bin/arm-linux-androideabi-
KSRC := ~/xxx/kernel
obj-y += neon_reverse.o
all: modules
modules:
$(MAKE) ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) -C $(KSRC) M=$(shell pwd)