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:

  1. Ajouter un nouveau drapeau au script de configuration en créant une nouvelle entrée dans AC_ARG_ENABLE configure.ac.

  2. Ajoutez quelques déclarations #ifdef (ou peut-être #ifndef) autour du code qui utilise la bibliothèque ctemplate 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.

Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top