gpt4 book ai didi

makefile - 允许用户覆盖 CFLAGS、CXXFLAGS 和 friend

转载 作者:行者123 更新时间:2023-12-02 01:32:37 28 4
gpt4 key购买 nike

典型的 makefile 通常使用内置变量 CFLAGSCXXFLAGSCPPFLAGS1设置传递给 C、C++ 或其他编译器/工具的标志。原则上,有时这甚至可以让您完全避免编写编译配方,因为各种内置规则使用这些标志。

一般来说,makefile 可能会将编译代码所需的内容添加到 FLAGS 变量中,例如包含目录、指示要使用哪种语言标准的参数等等。这些变量还可能包括“可选”或“默认”参数,例如优化级别、警告级别以及其他可以有效更改或删除的设置。

由于 CFLAGS 和字段是“众所周知的”变量,因此它们显然也是最终用户的配置点。例如,如果默认情况下项目编译时没有调试信息,则 make 命令行上的 CFLAGS=-g 预计会导致 -g添加到 $(CC) 编译器命令行,从而生成调试信息。同样,对于最终用户可能想要控制的其他选项,例如优化级别、gcc 上的 -march 设置等。

但是,这两种用途对我来说似乎不兼容。如果用户覆盖 $(CFLAGS),他们将删除如上所述的任何内部“必需”标志,并且项目可能无法编译或可能编译不正确。

有处理这个问题的最佳实践吗?对于像 $(CC) 这样的“单值”变量来说,实际上不会出现同样的问题,因为它们通常只有一个值:在本例中,是要使用的 C 编译器。如果用户覆盖它,您就使用它们的值。像 $(CFLAGS) 这样的东西原则上是一个值列表,其中一些是内部的,不应该被覆盖,其他的则用户可能想要覆盖。

直观上,解决方案似乎是在 makefile 中将 $(CFLAGS) 和 friend 保留为空且未使用,更喜欢使用 CFLAGS_INTERNAL 作为 makefile 内的参数,然后将两者都放在命令行上。不过,我很好奇是否有最佳实践,或者我是否遗漏了一些明显的东西。

<小时/>

1 对于这个问题的其余部分,我通常会简单地引用 $(CFLAGS),并理解这只是整个系列的方便代表。已知的编译器标志变量,例如 $(CPPFLAGS)$(CXXFLAGS) 等。

最佳答案

在使用 debuginfo 包构建 RPM 时偶然发现了同样的问题。

生成调试信息的要求是在 CFLAGS 中传递 -g,同时保留软件在其 Makefile< 中包含的任何 CFLAGS/.

因此,如果您想向 CFLAGS 添加一些额外的位,而不覆盖 Makefile 中存在的位,您只需使用 CFLAGS 作为环境变量。但前提是相关的 Makefile 使用 CFLAGS += ... 表示法。

例如,假设您的软件的 Makefile 具有:

CFLAGS += $(ARCH) -O3 -std=gnu11 -Wall ...

要使用所有这些标志 -g 构建它,您将执行以下操作:

CFLAGS='-g' make 

请注意,将其作为参数传递给 make 将不起作用,如:make CFLAGS='-g' 是错误的,因为它会覆盖内部CFLAGS

有关 pass -g for building debuginfo packages properly 的解决方案的更多信息

这里是 make: appending to variables 的引用.

关于makefile - 允许用户覆盖 CFLAGS、CXXFLAGS 和 friend ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51606653/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com