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

发布于 2024-08-04 14:42:20 字数 421 浏览 2 评论 0原文

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

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

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

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

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

In my C++ project, I have a convention where whenever the macro DEBUG is defined, debugging printf-esque statements are compiled into the executable.

To indicate whether or not I want these compiled into the executable, I normally would pass the macro name to gcc with the -Dmacro option. So, in the Makefile I (currently) have:

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

However, this is not very flexible; if I didn't want debug statements in my final program, I'd have to modify the Makefile to remove the -DDEBUG.

Is there a way to modify the Makefile such that I can conditionally select whether to compile with -D in the CXXFLAGS at compile time by passing in, say, another target name or a commandline switch? Not sure how'd I go about doing that.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

八巷 2024-08-11 14:42:20

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

all:    target
debug:  target

debug:  DEBUG=PLOP

target:
        @echo "HI $(DEBUG)"

所以现在:

> make
HI
>
> make debug
HI PLOP
>

You can conditionally define other variables based on the target in the makefile.

all:    target
debug:  target

debug:  DEBUG=PLOP

target:
        @echo "HI $(DEBUG)"

So now:

> make
HI
>
> make debug
HI PLOP
>
心凉 2024-08-11 14:42:20

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

$ cat Makefile
CXXFLAGS += $(CLIFLAGS)

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

Append another variable that you can set from the CLI or environment

$ cat Makefile
CXXFLAGS += $(CLIFLAGS)

maintarget:
    echo $(CXXFLAGS)
$ make CLIFLAGS=-DDEBUG
echo -DDEBUG
-DDEBUG
$ 
无声静候 2024-08-11 14:42:20

在思考 make 文档之后,我尝试将这在我的 Makefile 中:

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

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

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

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

After meditating upon the make documentation, I tried putting this in my Makefile:

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

Then, when you run make -d, -DDEBUG is set.

Now, mind you, it works, but I had to use a normal flag that make usually accepts (you can't make up your own). Using -d also spews (harmless) verbose make-level debugging statements to the screen. Which I really don't want; it obscures compile errors. But it does work.

I hope someone can come up with a better idea.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文