2010-06-25 15 views
19

Je veux savoir comment définir le compilateur/éditeur de liens par défaut/etc. flags si j'utilise le combo Autoconf/Automake. Par exemple, l'indicateur de compilateur par défaut est "-O2 -g" si je ne mets rien en place. Je peux la remplacer par quelque chose d'autre, par exemple si je veux debug:Drapeaux de compilateur par défaut avec Autotools

./configure 'CXXFLAGS=-O0 -g' 

Mais je trouve la configuration par défaut stupide parce que si j'activer l'optimisation, le débogage deviendra impossible. Les indicateurs par défaut doivent donc être "-O2" ou "-O0 -g", si je lance configure sans arguments. Comment fait-on ça?

Edit: J'ai essayé les solutions suivantes:

  • Mettez progname_CXXFLAGS=whatever à Makefile.am. Cela ne fonctionne pas, car il ajoute les indicateurs aux indicateurs par défaut au lieu de les remplacer.
  • Mettez CXXFLAGS=whatever dans configure.ac. Cela fonctionne, mais je ne peux pas le contourner plus tard.
+1

@ utilisateurs-ne-pas-comprendre-pourquoi-cela-ne-fonctionne-pas-dans-un-C-projet: CXXFLAGS devrait être CFLAGS lorsqu'il est passé en argument. ./configure – legends2k

Répondre

6

En attendant j'ai compris comment le faire. Je vais donner une explication à cela. Le principe de base est que Autoconf remplace les variables shell dans Makefile.in. La question est comment puis-je obtenir la valeur de ces variables? La réponse est que la commande initialization substitue les variables qui leur sont dites en ligne de commande (comme ./configure 'CXXFLAGS=-O0 -g'), et sinon elles sont remplacées par n'importe quelle commande qui définit la valeur par défaut (par exemple, CXXFLAGS est définie par AC_PROG_CXX) si elles ne sont pas vides. La solution consiste donc à définir notre nouvelle valeur par défaut avant AC_PROG_CXX mais après avoir effectué des substitutions à partir des lignes de commande. Par exemple:

if test -z $CXXFLAGS; then 
    CXXFLAGS='-O2' 
fi 
AC_PROG_CXX 
+9

Cette solution viole complètement le principe de moindre surprise. Lors de l'exécution de configure sans définir explicitement CXXFLAGS, les utilisateurs s'attendent à ce que CXXFLAGS soit défini sur "-g -O2". Si vous voulez le changer vous-même, faites-le avec un fichier config.site. Ne faites pas la modification dans configure.ac. C'est le mauvais endroit pour le faire. –

+2

Aussi (bien que cela ressemble à un cas d'utilisation inhabituel), si un utilisateur définit explicitement CXXFLAGS comme étant vide (configure CXXFLAGS = --prefix ...), ce code remplacera l'utilisateur. Au lieu de tester que CXXFLAGS est vide, vous devriez vérifier s'il est indéfini avec ": $ {CXXFLAGS = -O2}" –

+1

Merci, c'est la solution que je veux aussi Je veux changer l'optimisation par défaut de -O2 à -O3 mais permettez aux gens de faire leurs propres changements. – vy32

0

Sur votre Makefile.am vous pouvez les définir avec

programname_CXXFLAGS=-O0 -g 

Mise à jour: 20100628

Vous devriez essayer d'ajouter les CXXFLAGS dans configure.in avant d'appeler AC_PROG_CXX. Je n'ai pas testé, mais votre configure.in devrait ressembler à

AC_INIT 
... 
CXXFLAGS=-MY -FLAGS 
... 
AC_PROG_CXX 

S'il vous plaît, laissez-moi savoir si cela fonctionne depuis que je suis curieux :-)

+0

J'ai essayé celui-là en premier. Ça ne marche pas. Il ajoute les drapeaux aux drapeaux par défaut, donc il produit "-O2 -g -O0 -g" ou quelque chose de similaire. – petersohn

+3

Tous les fichiers configure.in doivent être vides ou inexistants. Le nom 'configure.in' est obsolète depuis plusieurs années. 'configure.ac' est le nom correct. –

2

Vous pouvez définir les valeurs par défaut spécifiques à la cible dans la Makefile.am, ou vous pouvez définir la valeur par défaut dans le configure.ac, et cela s'appliquera à tout ce que vous construisez dans le projet. Voir la section 4.8.1 (et 5.10.4) dans autoconf manual. Notez les remarques de 4.8.1 sur ne pas deviner l'éventuel utilisateur du paquet: si vous voulez définir des drapeaux que l'utilisateur ne devrait pas concerner, placez-les en utilisant AM_CXXFLAGS, des drapeaux comme celui-ci que l'utilisateur devrait être en mesure de remplacer doit être réglé dans CXXFLAGS.

Mais ... voulez-vous vraiment faire cela?

  1. Vous dites que «le débogage deviendra impossible». Avez-vous essayé cela et vu quelque chose ne va pas? Le compilateur/débogueur est peut-être plus intelligent que ce que vous lui attribuez.
  2. Ce qui est une bonne valeur par défaut au moment du développement n'est pas forcément une bonne valeur par défaut pour l'utilisateur final au moment de la construction. S'il est vraiment nécessaire de désactiver l'optimisation pendant le développement, configurez simplement votre système de développement avec ./configure CXXFLAGS='-O0 -g', exactement comme vous l'avez décrit. Si votre configure.ac est écrit correctement, cela va configurer votre build sans optimisation tout en laissant le (bon) défaut par défaut.

Version courte: la façon dont vous faites maintenant est la bonne.

Edité ajouter:

En général, si une variable shell apparaît comme un argument pour AC_SUBST (soit explicitement ou, comme dans le cas des choses comme CXXFLAGS, implicitement au sein d'une autre commande), il est substitué dans les fichiers de sortie. C'est-à-dire qu'après AC_SUBST(foo), la valeur de la variable $foo dans le script ./configure sera remplacée par @[email protected].

+1

D'abord, vous n'avez pas répondu à ma question. Vous avez commenté pourquoi je veux le faire, et c'est quelque chose dont je ne veux pas discuter, parce que ce n'est pas le but. Le point est que je veux changer les drapeaux de compilateur par défaut. – petersohn

+0

Assez juste. Je ne m'étais pas vraiment rendu compte que votre question portait sur les mécanismes de réglage de la variable, et j'ai édité une remarque supplémentaire utile à ce sujet. –

+0

@NormanGray -O2 optimise un grand nombre de variables, donc oui, le débogueur n'est pas plus malin que le petersohn ne le croit. –

7

Si vous voulez simplement avoir les drapeaux par défaut défini vous-même chaque fois que vous exécutez configure, il y a (au moins) 3 bonnes façons de le faire. Configurez CXXFLAGS dans votre environnement (par exemple, dans .login ou .bashrc), utilisez une variable d'environnement CONFIG_SITE pour spécifier un fichier de configuration ou définissez la valeur souhaitée pour CXXFLAGS dans $ prefix/share/config.site. Si vous souhaitez définir les indicateurs par défaut sur autre chose que «-O2 -g» pour tous les utilisateurs de votre package, vous devez modifier ce que vous voulez car cela viole le principe de la moindre surprise. Toute personne familiarisée avec autoconf s'attend à ce que les indicateurs par défaut soient -O2 -g et vous ne devriez pas changer cela.

Go avec la 3ème option donnée ci-dessus, et il suffit de faire

 
$ echo 'CXXFLAGS="-O0 -g"' > /usr/local/share/config.site 

(ou rediriger vers où vous définissez généralement préfixe $, par exemple $ HOME/share/config.site) En prime, cette va définir CXXFLAGS pour tous les projets autoconfiscalisés que vous configurez, et pas seulement les vôtres. (En supposant que vous définissez le préfixe approprié Si vous voulez un config.site soit valable pour tous les projets, quel que soit le préfixe, puis utiliser un paramètre de CONFIG_SITE.)

18

Selon le manuel de autoconf (environ AC_PROG_CC):

Si En utilisant le compilateur GNU C, définissez la variable shell GCC sur 'yes'. Si la variable de sortie CFLAGS n'est pas déjà définie, définissez-la sur -g -O2 pour le compilateur GNU C (-O2 sur les systèmes où GCC n'accepte pas -g) ou -g pour les autres compilateurs. Si votre colis n'aime pas cette valeur par défaut, alors il est acceptable d'insérer la ligne

: ${CFLAGS=""}

après AC_INIT et avant AC_PROG_CC pour sélectionner un défaut vide à la place.

De même, selon le manuel d'autoconf (environ AC_PROG_CXX):

Si vous utilisez le compilateur GNU C++, shell définir la variable à GXX « oui ». Si la variable de sortie CXXFLAGS n'était pas déjà définie, définissez -g -O2 pour le compilateur GNU C++ (-O2 sur les systèmes où G ++ n'accepte pas -g), ou -g pour les autres compilateurs. Si votre colis n'aime pas cette valeur par défaut, alors il est acceptable d'insérer la ligne

: ${CXXFLAGS=""}

après AC_INIT et avant AC_PROG_CXX pour sélectionner un défaut vide à la place.

0

Se fondant sur les réponses ci-dessus, je l'a ajouté à configure.ac:

AC_ARG_WITH(debug, [ --with-debug   add the debugging module], [AC_DEFINE(WITH_DEBUG,1,0) 
AC_SUBST(WITH_DEBUG,1) 
CXXFLAGS="-O0 -ggdb"]) 

Il définit également WITH_DEBUG dans le AC_CONFIG_HEADERS (config.h) et ajoute à la Makefile avec AC_SUBST().