2008-11-27 4 views
17

J'ai un projet avec plusieurs répertoires sources:Autotools: comment définir indicateur global de compilation

src/A 
    /B 
    /C 

Dans chaque cas, le Makefile.am contient

AM_CXXFLAGS = -fPIC -Wall -Wextra 

Comment éviter de répéter cela dans chaque source dossier?

J'ai essayé de modifier src/Makefile.am et configure.in, mais sans succès. Je pensais pouvoir utiliser AC_PROG_CXX pour définir les drapeaux de compilation globalement mais je ne trouve pas beaucoup de documentation sur l'utilisation de ces macros (avez-vous un pointeur vers une telle documentation?).

Merci à l'avance

Répondre

23

Vous pouvez faire plusieurs choses:

(1) Une solution consiste à inclure un fragment de makefile commun sur tous vos Makefile.am s:

include $(top_srcdir)/common.mk 
... 
bin_PROGRAMS = foo 
foo_SOURCES = ... 

dans ce cas, vous écrirait

AM_CXXFLAGS = -fpic -Wall -Wextra 

à common.mk et dans le futur il sera plus facile d'ajouter plus de macros ou de règles à tous les Makefile.am en modifiant simplement ce fichier.

(2) Une autre solution serait de mettre ces variables à l'échelle mondiale dans votre configure.ac (le nom configure.in a été dépréciée depuis longtemps), comme dans:

... 
AC_SUBST([AM_CXXFLAGS], [-fpic -Wall -Wextra]) 
... 

Ensuite, vous n'avez même pas dire quoi que ce soit dans votre Makefile.am s, ils héritent automatiquement de cette définition globale. L'inconvénient est que vous ne pouvez pas désactiver facilement (avec la première solution, il est facile de décider de ne pas inclure common.mk) et la dépendance n'est pas vraiment explicite pour les tiers (quand ils lisent le Makefile.am ils n'ont aucune indication sur où les drapeaux peuvent provenir de).

(3) Une troisième solution serait de faire comme orsogufo suggéré: écraser la variable utilisateur CXXFLAGS dans configure.ac. Je déconseillerais cela, car il détruit l'une des fonctionnalités du système de construction GNU: les utilisateurs sont autorisés à remplacer cette variable à make-time. Par exemple, vous pouvez taper

make CXXFLAGS='-O0 -ggdb' 

lors du débogage d'un morceau de code, et cela écrasera toute définition de CXXFLAGS (mais pas ceux AM_CXXFLAGS). Pour être honnête, la plupart des projets ne le supportent pas correctement car ils jouent des tours avec CXXFLAGS.

Enfin, je devrais mentionner que -fpic, -Wall, et -Werror ne sont pas des options portables. En fonction de la portée de votre projet, vous pouvez ajouter un contrôle de configuration pour ces (gnulib nouvelles macros récemment acquises à des tests pour les indicateurs d'avertissements, et libtool peut être utilisé pour créer des bibliothèques partagées).

+0

Utilisation de l'inclure dans l'idiome Makefile.am va faire cause automake aux dépendances de sortie pour Makefile et Makefile.in qui finissent par revenir à la fichier inclus et le fichier automake. Donc, changer cela conduira à des mises à jour plus tard aussi. – johnny

+1

Il est en fait très facile de désactiver si vous AC_SUBST les drapeaux. Dans Makefile.am, si vous affectez AM_CPPFLAGS, ils sont prioritaires. Vous pouvez choisir de ne rien faire, ou en faisant AM_CPPFLAGS = @ AM_CPPFLAGS @ ..., ou vous désinscrire en ne mettant pas @ AM_CPPFLAGS @ dans l'affectation. –

+1

Les drapeaux d'avertissement n'appartiennent pas à CPPFLAGS comme vous le prétendez, car ils sont utilisés par le compilateur et non par le pré-processeur. – kusma

0

Utilisez EXTRA_CFLAGS dans configure.ac

Par exemple, pour votre cas, il serait ceci:

EXTRA_CFLAGS=-fPIC -Wall -Wextra

Questions connexes