使用 make 有条件地设置调试宏

Posted

技术标签:

【中文标题】使用 make 有条件地设置调试宏【英文标题】:Set debugging macro conditionally with make 【发布时间】:2009-09-17 18:13:53 【问题描述】:

在我的 C++ 项目中,我有一个约定,每当定义宏 DEBUG 时,调试 printf-esque 语句都会编译到可执行文件中。

为了表明我是否希望将这些编译到可执行文件中,我通常会使用 -Dmacro 选项将宏名称传递给 gcc。所以,在Makefile我(目前)有:

CXXFLAGS += -g -I ../ -Wall -Werror -DDEBUG

但是,这不是很灵活;如果我不想在最终程序中使用调试语句,则必须修改 Makefile 以删除 -DDEBUG。

有没有办法修改Makefile,这样我可以通过传入另一个目标名称或命令行开关有条件地选择是否在编译时使用 CXXFLAGS 中的 -D 进行编译?不知道我是怎么做的。

【问题讨论】:

【参考方案1】:

您可以根据makefile中的目标有条件地定义其他变量。

all:    target
debug:  target

debug:  DEBUG=PLOP

target:
        @echo "HI $(DEBUG)"

那么现在:

> make
HI
>
> make debug
HI PLOP
>

【讨论】:

【参考方案2】:

附加另一个您可以从 CLI 或环境中设置的变量

$ cat Makefile
CXXFLAGS += $(CLIFLAGS)

maintarget:
    echo $(CXXFLAGS)
$ make CLIFLAGS=-DDEBUG
echo -DDEBUG
-DDEBUG
$ 

【讨论】:

【参考方案3】:

考虑这个: http://users.softlab.ece.ntua.gr/~ttsiod/makefile.html

【讨论】:

【参考方案4】:

在沉思 make documentation 之后,我尝试将其放入我的 Makefile 中:

ifneq(,$(findstring d,$(MAKEFLAGS)))
CXXFLAGS += <... all normal options ...> -DDEBUG
else
CXXFLAGS += <... all normal options ...>
endif

然后,当你运行make -d 时,-DDEBUG 被设置。

现在,请注意,它有效,但我必须使用 make 通常接受的普通标志(你不能自己编)。使用 -d 还会向屏幕显示(无害的)冗长的 make 级调试语句。我真的不想要;它掩盖了编译错误。但它确实有效。

我希望有人能想出一个更好的主意。

【讨论】:

Amro 的链接对这个想法有一个变体,比我的要好。

以上是关于使用 make 有条件地设置调试宏的主要内容,如果未能解决你的问题,请参考以下文章

调试 GNU make

preprocessor设置调试宏

扩展宏以进行调试?

如何调试宏?

使用 DEBUG 宏屏蔽调试信息

如何在MTK平台进行驱动调试