2016-05-10 61 views
2

看起来很荒谬,不会有关于此的问题,但我找不到一个。无论如何,我正在编写一个makefile,我只是想要一个条件语句来设置不同的CFLAGS,这取决于GNU或Intel编译器是否被用于编译由环境变量CC设置的程序。Makefile:根据CC/CXX/FC值更改编译器标志

现在,在GNU一个部分进行手动这一点,并说像做了以下内容:

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 

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

那么什么是明智的,健壮的方式来做到这一点?另外,如果它很重要,我也想为C++和Fortran编译器选择做同样的事情。

+0

最明智和最健壮的方法(恕我直言)是使用makefile编译器(如CMake)为您生成makefile。 CMake(和其他人)了解不同的平台和工具集。 –

+0

但是,即使使用CMake,如果您想根据编译器设置其他编译器标志(或不同的库等),仍然需要检测编译器(通常根据CMAKE_CXX_COMPILER_ID)。因此,您仍然可能无法完全摆脱编译器检测(例如,如果您想强制使用其他编译器可能无法识别的GCC/CLang的“-Wall -Wextra -Werror”)。但是,如果我有选择,我也更喜欢使用CMake。 – axalis

+0

是的CMake肯定是更好的,但我实际上处理一些遗留代码,我只是想修复现有的生成文件,以便它不那么容易被破坏。 –

回答

2

你是对的,这不是很强大。例如:更强大的方法可以使用findstring命令,例如:

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

嗯,是这样的东西似乎至少是下一步的改进:)。但是,这是最好的,而不需要完整的autotools/cmake类型的系统呢? –