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

时间:2009-09-17 18:13:53

标签: c++ build debugging makefile macros

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

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

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

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

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

4 个答案:

答案 0 :(得分:4)

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

all:    target
debug:  target

debug:  DEBUG=PLOP

target:
        @echo "HI $(DEBUG)"

现在:

> make
HI
>
> make debug
HI PLOP
>

答案 1 :(得分:2)

附加可以从CLI或环境

设置的另一个变量
$ cat Makefile
CXXFLAGS += $(CLIFLAGS)

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

答案 2 :(得分:1)

答案 3 :(得分:0)

在冥想make documentation后,我尝试将其放入我的Makefile:

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

然后,当您运行make -d时,-DDEBUG已设置。

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

我希望有人能提出更好的主意。