Хороший способ "переключить" в 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, каждый из которых содержит набор определений переменных .

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
17
0
21 906
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

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

При этом вы можете изучить синтаксис для условные и условные функции. Например, вы можете попробовать следующее:

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

Да, но этот синтаксис специфичен для GNUmake (переносимая часть языка makefile очень мала. Почти каждый нетривиальный Makefile не переносится)

bortzmeyer 14.10.2008 17:54

Ну, либо зависеть от gmake и использовать ifeq / endif, либо зависеть от pmake и использовать # if / # endif, либо зависеть от bmake и использовать .if / .endif, либо зависеть от генератора Makefile.

ephemient 27.10.2008 19:04

Как насчет:

CFLAGS_Linux_x86_release        = -O3
CFLAGS_Linux_x86_debug          = -O0 -g


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

Спасибо, ловкий трюк. Также работает с make-файлами Solaris, что позволяет мне использовать те же make-файлы в Solaris и Linux.

Patrick Schlüter 04.01.2012 17:32
Ответ принят как подходящий

Возможно, проще переключиться на систему, которая сделает это за вас (automake / autoconf) ...

На самом деле мой вариант использования состоит в том, что у меня есть система на основе make-файлов, которая создает большой набор компонентов, некоторые из которых имеют сценарии настройки, которые необходимо правильно запускать. Система сборки хранит вещи отдельно для каждой выходной цели с помощью строки, подобной $ (arch), которую нельзя передать в config.sub, поэтому мне нужен оператор case, который преобразует нашу $ (arch) в значение --host в передаваться в сценарий настройки. Фактически мы получаем $ (arch) от чего-то вроде -include $(PLATFORM)_$(BUILD_TYPE) в верхней части системы сборки.

cardiff space man 24.03.2016 18:59

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

Материал ifeq / endif перемещен в файл config.mak.uname. Обновите свой ответ и приведите несколько примеров. Ура ;-) (С Новым годом)

oHo 06.01.2015 01:04

Эх, нет, я не собираюсь тратить свое время на обновление ответа шестилетней давности только потому, что разработчики Git решили изменить свои make-файлы. У меня есть дела поважнее. :)

JesperE 06.01.2015 22:28

Хорошо, я все равно поддерживаю твой ответ. Если кто-то хочет увидеть обновление, он может прочитать мой комментарий. Тем не менее, я был бы признателен, если бы вы получили удовольствие обновить свои ответы ... Ура и с Новым годом.

oHo 06.01.2015 23:13

Вам следует обновить ответ, поскольку он в значительной степени предназначен только для ссылки (в том смысле, что если ссылка умирает, полезного контента нет)

mjs 23.02.2018 18:55

Другие вопросы по теме