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 构建的整个项目生成一个大型依赖映射?