设置linux驱动编译的中间目录

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

你可能感兴趣的:(linux,linux,驱动,中间目录,build目录)