1 无中间输出目录
编译驱动时我们常用下面的Makefile:
obj-m := ./src/imx6ul_ads1278.o
#内核源码目录
KDIR := /home/ding/fsl/imx6ul/system/linux-imx-rel_imx_4.9.x_1.0.0_ga
EXTRA_CFLAGS=-g -o0
MAKE := make
build: kernel_modules
kernel_modules:
${MAKE} -C $(KDIR) M=$(PWD) modules
.PHONY: clean
clean:
${MAKE} -C $(KDIR) M=$(PWD) clean
这个Makefile实际上是调用了Kbuild来完成编译,内容比较简单,但是编译过程中产生的各种中间文件与.c文件混在一起看着不方便,make后的目录结构如下
.
├── Makefile
├── modules.order
├── Module.symvers
├── src
│ ├── imx6ul_ads1278.c
│ ├── imx6ul_ads1278.ko
│ ├── .imx6ul_ads1278.ko.cmd
│ ├── imx6ul_ads1278.mod.c
│ ├── imx6ul_ads1278.mod.o
│ ├── .imx6ul_ads1278.mod.o.cmd
│ ├── imx6ul_ads1278.o
│ └── .imx6ul_ads1278.o.cmd
└── .tmp_versions
└── imx6ul_ads1278.mod
2 增加中间输出目录
下面这个Makefile能够将编译的中间结果输出到build文件夹,Makefile放在根目录
obj-m += src.o
# Specify flags for the module compilation.
#EXTRA_CFLAGS=-g -O0
#内核源码目录
KDIR := /home/ding/fsl/imx6ul/system/linux-imx-rel_imx_4.9.x_1.0.0_ga
BUILD_DIR = $(PWD)/build
SRC = $(PWD)/src
BUILD_DIR_MAKEFILE = $(PWD)/build/Makefile
default: $(BUILD_DIR_MAKEFILE)
make -C $(KDIR) M=$(BUILD_DIR) src=$(SRC) modules
cp $(BUILD_DIR)/*.ko $(PWD)
$(BUILD_DIR):
mkdir -p "$@"
$(BUILD_DIR_MAKEFILE): $(BUILD_DIR)
touch "$@"
clean:
make -C $(KDIR) M=$(BUILD_DIR) src=$(SRC) clean
rm -r $(BUILD_DIR)
其中KDIR 是内核源码的根目录,这是我的交叉编译环境的源码目录,要根据实际情况修改
KDIR := /home/ding/fsl/imx6ul/linux-imx-rel_imx_4.9.x_1.0.0_ga
这是make之后的驱动目录结构,可以看到中间文件全部在build目录,不会与源码混在一起,看着很清爽
.
├── build
│ ├── imx6ul_ads1278.ko
│ ├── .imx6ul_ads1278.ko.cmd
│ ├── imx6ul_ads1278.mod.c
│ ├── imx6ul_ads1278.mod.o
│ ├── .imx6ul_ads1278.mod.o.cmd
│ ├── imx6ul_ads1278.o
│ ├── .imx6ul_ads1278.o.cmd
│ ├── Makefile
│ ├── modules.order
│ ├── Module.symvers
│ └── .tmp_versions
│ └── imx6ul_ads1278.mod
├── imx6ul_ads1278.ko
├── Makefile
└── src
├── imx6ul_ads1278.c
└── Makefile
注:src目录下的Makefile按照Kbuild的要求填写即可,内容如下:
obj-m += imx6ul_ads1278.o