Comment ajouter et mettre en œuvre des drapeaux de configurer dans Autotools?
-
18-09-2019 - |
Question
Une partie de notre programme de groupe de recherche a des fonctionnalités auxiliaires fournis par la bibliothèque ctemplate . Sur notre groupe daté, nous ne pouvons pas construire le logiciel en raison de la compilation, donc je voudrais séparer cette fonctionnalité et contrôler si elle est incluse ou non par un drapeau configure
, comme --disable-ctemplate
.
Le logiciel, écrit en C ++, utilise Autotools construire système ni dont j'ai beaucoup d'expérience avec. Je crois comprendre que pour accomplir cette tâche, je dois faire ce qui suit:
-
Ajouter un nouveau drapeau au script de configuration en créant une nouvelle entrée dans
AC_ARG_ENABLE
configure.ac
. -
Ajoutez quelques déclarations
#ifdef
(ou peut-être#ifndef
) autour du code qui utilise la bibliothèquectemplate
et autour de tout code qui appelle ce code.
Je pense que la première étape ressemblerait à quelque chose comme ceci:
AC_ARG_ENABLE(ctemplate,
[ --disable-ctemplate Disable HTML output],
[case "${enableval}" in
yes) ctemplate=false ;;
no) ctemplate=true ;;
*) AC_MSG_ERROR(bad value ${enableval} for --disable-ctemplate) ;;
esac],[ctemplate=true])
AM_CONDITIONAL(NOCTEMPLATE, test x$ctemplate = xfalse)
bien que je ne sais pas si la logique est correcte, puisque je l'ai adapté cet exemple à partir d'exemples qui ont utilisé --enable-FLAG
au lieu de --disable-FLAG
.
Pour la deuxième étape, je vais terminer dans les sections de drapeaux préprocesseur tels que
#ifndef NOCTEMPLATE
void Class::MethodUsingCtemplate(...)
{
...
}
#endif
Est-ce que « câbler » cela correctement tout si je l'ai fait configure --disable-ctemplate
?
En outre, ce sera faire en sorte que le programme ne va pas dans la bibliothèque de ctemplate
pour la compilation? Sinon, tout cela est pour rien; il est impératif que je puisse empêcher la compilation de la bibliothèque ctemplate
et composants dépendants.
Je Réitérons que je ne suis pas familier avec les deux C ++ et Autotools; J'ai pris une première approche très naïve à résoudre ce problème. Si vous avez de l'expérience dans ce domaine, je voudrais vraiment apprécier vos corrections et des explications que vous pourriez offrir.
La solution
Voici la solution que je mets ensemble après avoir lu la documentation, tutoriels, aide les discussions, listes de diffusion, etc., et tout simplement d'essayer des choses jusqu'à ce qu'ils travaillaient je pourrais expliquer pourquoi ils ont travaillé.
configure.ac
, je placé les lignes suivantes de code
# This adds the option of compiling without using the ctemplate library,
# which has proved troublesome for compilation on some platforms
AC_ARG_ENABLE(ctemplate,
[ --disable-ctemplate Disable compilation with ctemplate and HTML output],
[case "${enableval}" in
yes | no ) WITH_CTEMPLATE="${enableval}" ;;
*) AC_MSG_ERROR(bad value ${enableval} for --disable-ctemplate) ;;
esac],
[WITH_CTEMPLATE="yes"]
)
dnl Make sure we register this option with Automake, so we know whether to
dnl descend into ctemplate for more configuration or not
AM_CONDITIONAL([WITH_CTEMPLATE], [test "x$WITH_CTEMPLATE" = "xyes"])
# Define CTEMPLATE in config.h if we're going to compile against it
if test "x$WITH_CTEMPLATE" = "xyes"; then
AC_DEFINE([CTEMPLATE], [], ["build using ctemplate library"])
AC_MSG_NOTICE([ctemplate will be used, HTML output enabled])
else
AC_MSG_NOTICE([ctemplate will not be used, HTML output disabled])
fi
Dans l'étape suivante, j'ai changé le Makefile.am
au niveau supérieur à ce qui suit:
if WITH_CTEMPLATE
MAYBE_CTEMPLATE = ctemplate
endif
SUBDIRS = boost libgsl $(MAYBE_CTEMPLATE) libutil ...
Dans Makefile.am
s de niveau inférieur, j'ai ajouté
if WITH_CTEMPLATE
# some change to the configuration
else
# some other change to the configuration
endif
Enfin, je devais faire en sorte que l'un des fichiers clés d'en-tête ++ C (inclus par d'autres parties du code) avaient les éléments suivants:
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
config.h
contient des nouvelles définitions avec un CRÉE AC_DEFINE
, donc ce fichier doit être inclus dans les parties qui vérifient si une définition de macro créée par cette voie est définie (ou non défini).
Cela a pris beaucoup de temps et de pousser à travers la frustration de ma part; Je ne peux qu'espérer documenter cette explication sauve ici quelqu'un d'autre du même sort.
Autres conseils
Vous êtes certainement sur la bonne voie. Autotools peut sembler très compliqué au début, mais l'un des avantages est qu'il ya des milliers de projets sur qui ont déjà fait ce que vous voulez faire. Tout ce que vous devez faire est de les trouver.
Voici un lien vers un code Google recherche AC_ARG_DISABLE . Allez les noix.
Pour éviter l'accumulation de tenter de compiler dans le sous-répertoire ctemplate, vous aurez envie de faire quelque chose comme:
if CTEMPLATE SUBDIRS += ctemplate endif
dans Makefile.am