2008-10-14 3 views
8

Я экспериментирую с обновленной системой сборки на работе; В настоящее время я пытаюсь найти хороший способ установить компилятор & флаги в зависимости от целевой платформы.Хороший способ сделать «переключатель» в Makefile

То, что я хотел бы сделать что-то вроде

switch $(PLATFORM)_$(BUILD_TYPE) 
    case "Linux_x86_release" 
    CFLAGS = -O3 
    case "Linux_x86_debug" 
    CFLAGS = -O0 -g 
    case "ARM_release" 
    CC = armcc 
    AR = armlink 
    CFLAGS = -O2 -fx 
    ... 

, который не поддерживается GNU Make. Теперь, моя первая мысль была просто сделать

-include $(PLATFORM)_$(BUILD_TYPE) 

который является довольно приличным решением, однако, это делает его трудно получить обзор того, что отличается от файлов, не говоря уже о том, что я с нетерпением ждет письмо &, поддерживая хорошие 60-80 файлов, каждый из которых содержит набор определений переменных.

Кто-нибудь, возможно, знает, как лучше это сделать? То есть установка набора флагов и других параметров на основе другой переменной?

ответ

4

Переключение в систему, которая делает это для вас (Automake/Autoconf) может быть проще ...

+0

Мое использование-на самом деле состоит в том, что у меня есть система на основе make-файлов, которая строит большой набор компонентов, некоторые из которых имеют настраиваемые сценарии, которые нужно правильно управлять. Система сборки держит вещи отдельно для каждого целевого результата с строкой типа $ (arch), которая не может быть передана в config.sub, поэтому мне нужен оператор case, который преобразует наш $ (arch) в значение -host для передаваться скрипту configure. Мы фактически получаем $ (arch) от чего-то вроде `-include $ (PLATFORM) _ $ (BUILD_TYPE)` в верхней части системы сборки. – 2016-03-24 15:59:31

6

Настройка таких параметров была бы задачей сценария configure.

Это, как говорится, вы можете посмотреть в синтаксисе для conditionals и conditional functions. Например, вы можете попробовать следующее:

ifeq ($(PLATFORM)_$(BUILD_TYPE),Linux_x86_release) 
    CFLAGS = -O3 
endif 
ifeq ($(PLATFORM)_$(BUILD_TYPE),Linux_x86_debug) 
    CFLAGS = -O0 -g 
endif 
+0

Да, но этот синтаксис специфичен для GNUmake (переносная часть языка makefile очень мала. Почти каждый нетривиальный Makefile не переносится) – bortzmeyer 2008-10-14 13:54:30

+2

Ну, либо зависит от gmake, но и от ifeq/endif или зависит от pmake и использовать # if/# endif или зависеть от bmake и использовать .if/.endif, или зависеть от Makefile-генератора. – ephemient 2008-10-27 16:04:40

16

Как насчет:

CFLAGS_Linux_x86_release  = -O3 
CFLAGS_Linux_x86_debug   = -O0 -g 


CFLAGS = ${CFLAGS_${PLATFORM}_${BUILD}} 
+0

Спасибо, аккуратный трюк. Работает также для make-файлов Solaris, что позволяет мне использовать те же make-файлы в Solaris и Linux. – 2012-01-04 13:32:51

4

Makefile, используемый git, является хорошим примером Makefile, который выполняет нетривиальные задачи настройки в самом файле Makefile (например, включение типа хоста). Это на самом деле вполне читаемо и достаточно просто в использовании.

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