2016-05-10 98 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類型的系統呢? –