Я экспериментирую с обновленной системой сборки на работе; в настоящее время я пытаюсь найти хороший способ установить компилятор и флаги в зависимости от целевой платформы.
Я бы хотел сделать что-то вроде
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, каждый из которых содержит набор определений переменных .
Кто-нибудь знает лучший способ сделать это? Т.е. установка набора флагов и других параметров на основе другой переменной?





Настройка таких параметров будет задачей сценария configure.
При этом вы можете изучить синтаксис для условные и условные функции. Например, вы можете попробовать следующее:
ifeq ($(PLATFORM)_$(BUILD_TYPE),Linux_x86_release)
CFLAGS = -O3
endif
ifeq ($(PLATFORM)_$(BUILD_TYPE),Linux_x86_debug)
CFLAGS = -O0 -g
endif
Ну, либо зависеть от gmake и использовать ifeq / endif, либо зависеть от pmake и использовать # if / # endif, либо зависеть от bmake и использовать .if / .endif, либо зависеть от генератора Makefile.
Как насчет:
CFLAGS_Linux_x86_release = -O3
CFLAGS_Linux_x86_debug = -O0 -g
CFLAGS = ${CFLAGS_${PLATFORM}_${BUILD}}
Спасибо, ловкий трюк. Также работает с make-файлами Solaris, что позволяет мне использовать те же make-файлы в Solaris и Linux.
Возможно, проще переключиться на систему, которая сделает это за вас (automake / autoconf) ...
На самом деле мой вариант использования состоит в том, что у меня есть система на основе make-файлов, которая создает большой набор компонентов, некоторые из которых имеют сценарии настройки, которые необходимо правильно запускать. Система сборки хранит вещи отдельно для каждой выходной цели с помощью строки, подобной $ (arch), которую нельзя передать в config.sub, поэтому мне нужен оператор case, который преобразует нашу $ (arch) в значение --host в передаваться в сценарий настройки. Фактически мы получаем $ (arch) от чего-то вроде -include $(PLATFORM)_$(BUILD_TYPE) в верхней части системы сборки.
Makefile, используемый мерзавец, является хорошим примером Makefile, который выполняет нетривиальные задачи настройки в самом Makefile (например, включение типа хоста). На самом деле он довольно удобен для чтения и достаточно прост в использовании.
Материал ifeq / endif перемещен в файл config.mak.uname. Обновите свой ответ и приведите несколько примеров. Ура ;-) (С Новым годом)
Эх, нет, я не собираюсь тратить свое время на обновление ответа шестилетней давности только потому, что разработчики Git решили изменить свои make-файлы. У меня есть дела поважнее. :)
Хорошо, я все равно поддерживаю твой ответ. Если кто-то хочет увидеть обновление, он может прочитать мой комментарий. Тем не менее, я был бы признателен, если бы вы получили удовольствие обновить свои ответы ... Ура и с Новым годом.
Вам следует обновить ответ, поскольку он в значительной степени предназначен только для ссылки (в том смысле, что если ссылка умирает, полезного контента нет)
Да, но этот синтаксис специфичен для GNUmake (переносимая часть языка makefile очень мала. Почти каждый нетривиальный Makefile не переносится)