从 IDE 调用 Makefile 以进行调试/发布
Posted
技术标签:
【中文标题】从 IDE 调用 Makefile 以进行调试/发布【英文标题】:Makefile called from IDE for Debug/Release 【发布时间】:2016-02-27 09:21:04 【问题描述】:我在 IDE 下有 Makefile 项目和两个构建版本:Debug 和 Release。 IDE 发送 make 命令:“make -f Makefile Debug”或“make -f Makefile Release”。 我找不到如何通过参数“Debug”或“Release”更改 ccflags-y 的方法。什么是正确的方法?我的简化 Makefile 如下所示:
ccflags-y += -D__KERNEL__ -DMODULE -DDEFINE1 -DDEFINE2
mkfile_dir := $(dir $(abspath $(lastword $(MAKEFILE_LIST))))
Debug: ccflags-y += -DDEBUG -g3 -O0 # NOT FUNCTIONAL !
Release: ccflags-y += -DNDEBUG -O2 # NOT FUNCTIONAL !
Debug: all
Release: all
cleanDebug: clean
cleanRelease: clean
obj-m := modulesrc.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(mkfile_dir) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(mkfile_dir) clean
【问题讨论】:
【参考方案1】:首先我尝试编写测试 $(MAKECMDGOALS) 的 ifeq 条件,但它不起作用,因为此 Makefile 在构建模块时调用其他 Makefile 并且在子 Makefile 中是除 Debug/Release 之外的其他目标。我找到了其他解决方案,但我仍然不确定它是否正确。我更改了 IDE 命令行开始 make: "make -f Makefile mytarget=Debug" 或 "make -f Makefile mytarget=Release" 然后我将条件添加到 Makefile:
ccflags-y += -D__KERNEL__ -DMODULE -DDEFINE1 -DDEFINE2
mkfile_dir := $(dir $(abspath $(lastword $(MAKEFILE_LIST))))
ifeq ($(mytarget),Debug)
ccflags-y += -DDEBUG -O0
endif
ifeq ($(mytarget),Release)
ccflags-y += -DNDEBUG -O2
endif
cleanDebug: clean
cleanRelease: clean
obj-m := modulesrc.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(mkfile_dir) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(mkfile_dir) clean
【讨论】:
【参考方案2】:您还没有向我们展示其他 makefile,但请尝试一下:
all:
make -C /lib/modules/$(shell uname -r)/build M=$(mkfile_dir) modules ccflags-y=$(ccflagS-Y)
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(mkfile_dir) clean ccflags-y=$(ccflagS-Y)
【讨论】:
其他 makefile 是内核源代码的一部分。即使我已经解决了,我也试过了,它不起作用。在源代码编译编译器不知道所需的定义。以上是关于从 IDE 调用 Makefile 以进行调试/发布的主要内容,如果未能解决你的问题,请参考以下文章
使用 XDebug 设置 Komodo IDE 以进行逐步 PHP 调试