2008-10-14 7 views
8

J'expérimente avec un système de construction mis à jour au travail; Actuellement, j'essaie de trouver un bon moyen de définir les drapeaux du compilateur & en fonction de la plate-forme cible.Bon moyen de faire un "switch" dans un Makefile

Ce que je voudrais faire est quelque chose comme

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 
    ... 

qui ne sont pas pris en charge par GNU Make. Maintenant, ma première pensée était de le faire

-include $(PLATFORM)_$(BUILD_TYPE) 

qui est une solution assez décente, cependant, il est difficile d'obtenir un aperçu de ce qui diffère entre les fichiers, sans oublier que je suis impatient de l'écriture & en conservant un bon 60-80 fichiers, chacun contenant un ensemble de définitions de variables.

Est-ce que quelqu'un connaît une meilleure façon d'accomplir cela? C'est à dire. définir un ensemble de drapeaux et d'autres options basées sur une autre variable?

Répondre

4

Le passage à un système qui fait pour vous (automake/autoconf) peut-être plus simple ...

+0

Mon cas d'utilisation est en fait que j'ai un système basé sur makefile qui construit un grand ensemble de composants, dont certains ont des scripts de configuration qui doivent être conduits correctement. Le système de construction conserve les éléments séparés par cible de sortie avec une chaîne semblable à $ (arch) qui ne peut pas être transmise à config.sub, j'ai donc besoin d'une instruction case qui convertit notre $ (arch) en valeur de --host à être passé au script configure. Nous obtenons en fait le $ (arch) de quelque chose comme '-include $ (PLATFORM) _ $ (BUILD_TYPE)' en haut du système de construction. –

6

La configuration de ces paramètres serait la tâche d'un script configure. Cela étant dit, vous pouvez regarder dans la syntaxe conditionals et conditional functions. Par exemple, vous pouvez essayer ce qui suit:

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

Oui, mais cette syntaxe est spécifique à GNUmake (la partie portable du fichier makefile est très petite Presque tous les Makefile non triviaux sont non portables) – bortzmeyer

+2

Eh bien, dépendez de gmake et utilisez ifeq/endif, ou dépendez de pmake et utilisez # if/# endif, ou dépendez de bmake et utilisez .if/.endif, ou dépendez d'un générateur Makefile. – ephemient

16

Que diriez-vous:

CFLAGS_Linux_x86_release  = -O3 
CFLAGS_Linux_x86_debug   = -O0 -g 


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

Merci, bonne astuce. Fonctionne également pour les makefiles Solaris, ce qui me permet d'utiliser les mêmes makefiles sur Solaris et Linux. –

4

Le Makefile utilisé par git est un bon exemple d'un Makefile qui effectue des tâches de configuration non triviales dans le Makefile lui-même (comme la commutation sur le type d'hôte). C'est en fait assez lisible et raisonnablement simple à utiliser.

+0

Le fichier 'ifeq' /' endif' a été déplacé dans le fichier ['config.mak.uname'] (https://git.kernel.org/cgit/git/git.git/tree/config.mak.uname). Veuillez mettre à jour votre réponse et fournir quelques exemples. Salutations ;-) (Bonne année) – olibre

+3

Eh, non, je ne vais pas passer mon temps à mettre à jour une réponse de six ans juste parce que les développeurs Git ont décidé de changer leurs makefiles. J'ai des choses plus amusantes à faire. :) – JesperE

+0

Très bien, j'ai voté votre réponse de toute façon. Si quelqu'un veut voir la mise à jour, il/elle peut lire mon commentaire. Cependant j'apprécierais que vous preniez plaisir à mettre à jour vos réponses ... Bravo et bonne année. – olibre

Questions connexes