Хороший способ сделать «переключение» в Makefile - PullRequest
14 голосов
/ 14 октября 2008

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

Я бы хотел сделать что-то вроде

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 ]

21 голосов
/ 14 октября 2008

Как насчет:

CFLAGS_Linux_x86_release        = -O3
CFLAGS_Linux_x86_debug          = -O0 -g


CFLAGS  = ${CFLAGS_${PLATFORM}_${BUILD}}
6 голосов
/ 14 октября 2008

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

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

ifeq ($(PLATFORM)_$(BUILD_TYPE),Linux_x86_release)
    CFLAGS = -O3
endif
ifeq ($(PLATFORM)_$(BUILD_TYPE),Linux_x86_debug)
    CFLAGS = -O0 -g
endif
3 голосов
/ 14 октября 2008

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

2 голосов
/ 14 октября 2008

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

...