Rob*_*Rob 4 linux linux-device-driver linux-kernel
我正在尝试能够在命令行执行"make debug",它将使用-DDEBUG_OUTPUT定义构建我的驱动程序模块,这将导致编译某些代码段.
在2.4内核makefile中,这很容易.我只是创建一个debug:target并在该目标的cc编译命令参数中包含"-DDEBUG_OUTPUT".简单.
不幸的是(对我而言),2.6完全改变了模块的编译方式,我只能找到简单的"全部"和"干净"的例子,这些例子没有显示在编译时添加自定义定义.
我试过这个:
debug:
make -C $(KERNEL_DIR) SUBDIRS='pwd' -DDEBUG_OUTPUT modules
Run Code Online (Sandbox Code Playgroud)
并得到了来自make的投诉.
我也尝试过:
.PHONY:调试
debug:
make -C $(KERNEL_DIR) SUBDIRS='pwd' EXTRA_CFLAGS="$(EXTRA_CFLAGS) -DDEBUG_OUTPUT" modules
Run Code Online (Sandbox Code Playgroud)
但它没有看到EXTRA_CFLAGS包含的内容.我可以从命令行输出中看到它确实将-D正确地附加到现有的EXTRA_CFLAGS上,其中包括-I for includes dir.但是,驱动程序文件现在不会编译,因为它找不到包含目录...所以不知何故它没有看到EXTRA_CFLAGS包含的内容.
"-D"选项并不意味着传递给make:它是一个C preprocesseor(cpp)选项.
要为您的构建定义DEBUG_OUTPUT,您必须将以下行添加到Kbuild文件中:
EXTRA_CFLAGS = -DDEBUG_OUTPUT
Run Code Online (Sandbox Code Playgroud)
之后你可以像往常一样打电话:
make -C $(KERNEL_DIR) M=`pwd`
Run Code Online (Sandbox Code Playgroud)
编辑:如果您不想编辑Kbuild文件,您可以拥有这样的调试目标:
INCLUDES="-Imy_include_dir1 -Imy_include_dir2"
.PHONY: debug
debug:
$(MAKE) -C $(KDIR) M=`pwd` EXTRA_CFLAGS="$(INCLUDES) -DDEBUG_OUTPUT"
Run Code Online (Sandbox Code Playgroud)
编辑#2:
MY_CFLAGS=-DFOO -DBAR -Imydir1
all:
$(MAKE) -C $(KDIR) M=`pwd` EXTRA_CFLAGS="$(MY_CFLAGS)"
debug: MY_CFLAGS+=-DDEBUG_OUTPUT
debug:
$(MAKE) -C $(KDIR) M=`pwd` EXTRA_CFLAGS="$(MY_CFLAGS)"
Run Code Online (Sandbox Code Playgroud)