2016-05-10 2 views
2

Кажется абсурдным, что об этом не было бы вопроса, но я не могу его найти. Во всяком случае, я пишу make-файл, и я просто хочу иметь условный оператор, который устанавливает разные CFLAGS в зависимости от того, используются ли компиляторы GNU или Intel для компиляции программы, заданной переменной CC envrionment.Makefile: изменить флаги компилятора на основе значений CC/CXX/FC

Теперь, есть раздел в ГНУ сделать руководство по этому вопросу, и он говорит, что сделать что-то вроде следующего:

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.

+0

самый разумный и надежный способ (ИМХО) это использовать Makefile компилятор, такие как CMake для генерации Makefile для вас. CMake (и другие) знают о различных платформах и наборах инструментов. –

+0

Однако даже с CMake, если вы хотите установить дополнительные флаги компилятора (или разные библиотеки и т. Д.) В зависимости от компилятора, вам все равно необходимо обнаружить компилятор (обычно в соответствии с CMAKE_CXX_COMPILER_ID). Таким образом, вы все равно не сможете полностью избавиться от обнаружения компилятора (например, если вы хотите принудительно «-Wall -Wextra -Werror» с GCC/CLang, которые другие компиляторы могут не распознать). Но, вернее, я также предпочитаю использовать CMake, если у меня есть опция. – axalis

+0

Yeah CMake определенно лучше, однако я действительно имею дело с некоторым устаревшим кодом, и я просто хочу исправить существующий make-файл, чтобы он не так легко сломался. –

ответ

2

Вы правы, что это не так надежно. Более надежный способ мог бы использовать команду FindString, например:

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

Хм, да, похоже, что это похоже на следующий шаг улучшения :). Но разве это самое лучшее, что можно сделать, не перейдя к полной системе autotools/cmake? –

Смежные вопросы