Makefile:根据 CC/CXX/FC 值更改编译器标志

Posted

技术标签:

【中文标题】Makefile:根据 CC/CXX/FC 值更改编译器标志【英文标题】:Makefile: change compiler flags based on CC/CXX/FC values 【发布时间】:2016-05-10 14:12:13 【问题描述】:

目前还没有关于此的问题似乎很荒谬,但我找不到。无论如何,我正在编写一个 makefile,我只想有一个条件语句,根据环境变量 CC 设置的是 GNU 还是 Intel 编译器来设置不同的 CFLAGS。

现在,GNU make 手册中有一节对此进行了说明,它说要执行以下操作:

https://ftp.gnu.org/old-gnu/Manuals/make-3.79.1/html_chapter/make_7.html

ifeq ($(CC),gcc)
  libs=$(libs_for_gcc)
else
  libs=$(normal_libs)
endif

(好的设置库不是标志,但无论如何,同样的想法)。好的,但这肯定只是条件如何工作的一个例子,因为在实践中这显然是一种愚蠢的方法。 CC 变量可以包含除 'gcc' 之外的所有内容,并且仍然可以有效地使用 GNU C 编译器。即使只是在 CC 中指定编译器的绝对路径也会破坏这个例子。

那么,什么是明智、稳健的方法呢?另外,如果重要的话,我也想为 C++ 和 Fortran 编译器选择做同样的事情。

【问题讨论】:

最明智和最可靠的方法(恕我直言)是使用诸如 CMake 之类的 makefile 编译器为您生成 makefile。 CMake(和其他人)了解不同的平台和工具集。 但是即使使用 CMake,如果您想根据编译器设置额外的编译器标志(或不同的库等),您仍然需要检测编译器(通常根据 CMAKE_CXX_COMPILER_ID)。因此,您仍然可能无法完全摆脱编译器检测(例如,如果您想使用 GCC/CLang 强制“-Wall -Wextra -Werror”,而其他编译器可能无法识别)。但确实,如果可以选择,我也更喜欢使用 CMake。 是的,CMake 肯定更好,但我实际上正在处理一些遗留代码,我只想修复现有的 makefile,这样它就不会那么容易被破坏。 【参考方案1】:

你是对的,这不是那么健壮。更稳健的方法是使用 findstring 命令,例如:

ifneq (,$(findstring gcc,$(CC)))
  libs=$(libs_for_gcc)
else
  libs=$(normal_libs)
endif

【讨论】:

嗯,是的,这样的事情似乎至少是改进的下一步:)。但是,如果不使用完整的 autotools/cmake 类型的系统,这是最好的吗?

以上是关于Makefile:根据 CC/CXX/FC 值更改编译器标志的主要内容,如果未能解决你的问题,请参考以下文章

makefile 变量前后加 @是啥意思?例如 prefix=@prefix@

makefile之call函数

如何为使用 makefile 构建的整个项目生成一个大型依赖映射?

更改目标主体内的 Makefile 变量值

用于在头文件更改时构建简单 c 项目重新编译的示例 makefile

如何更改我的 makefile 以进行调试构建?