Comment puis-je configurer automake et autoconf pour construire des programmes conditionnellement (tests ou autre)

StackOverflow https://stackoverflow.com/questions/1141191

Question

J'ai actuellement 10 tests dans mon projet autotoolset. Chaque fois que je fais un changement à un de mes fichiers et / src recompile, chaque test est reconstruit et relié. Cela commence à avoir un impact considérable sur mon temps de développement.

Quelle est la meilleure façon de construire conditionnellement programmes binaires, des tests ou autrement, avec GNU autotoolset? Par exemple, si je travaille dans le test / check_curl_requestheaders.cc, et je fais un changement, je ne vais vouloir recompiler la bibliothèque et que d'un test et aucun des autres binaires.

J'ai vu une mention de l'utilisation conditionals automake (comme WANTS_XXX) mais je ne suis pas certain à 100% c'est ce que je cherche et je ne suis sûr de savoir comment ce serait être paramétrés par autoconf.

Je suis une sorte d'espérer quelque chose qui va finir par ressembler à ceci:

./configure
make test/check_curl_requestheaders

ou

./configure --only-build=test/check_curl_requestheaders
make

Pointeurs?

EDIT Je ne fais pas une configuration avant chaque marque. Si je fais des changements à check_curl_requestheaders, seul check_curl_requestheaders est reconstruit comme on pouvait s'y attendre. Le problème est que si je travaille sur la requestHeaders partie de la bibliothèque et faire un changement à dire, src / boucle / requestheaders.cc, tous les tests et les autres binaires sont reconstruits, pas seulement le check_curl_requestheaders. que prend beaucoup trop de temps, et c'est ce que je suis en train d'éviter. Si j'ai une douzaine de binaires, est-il un moyen de reconstruire un seul d'entre eux?

Était-ce utile?

La solution 3

Je ne suis pas sûr que ce soit la meilleure façon de le faire, mais il se trouve que les programmes dans mon dossier de test n'ont leur propre création de cibles uniques. Cependant, il y avait des problèmes.

  1. Si j'émets faire au niveau supérieur, tous src / et test / sont construits
  2. Si j'émets faire au test / niveau, les modifications src / ne sera pas ramassé

Pour résoudre ce problème, je l'ai écrit un script shell qui effectue les opérations suivantes:

  1. Entrez Src, et le construire. (Si des changements à src / se sont produites, src / est reconstruit)
  2. Entrez test, et de construire un binaire spécifique. (Cela va reconstruire le binaire spécifique si elle a changé et réassocier du code dans src / a été mis à jour par l'étape précédente)

Le code est ci-dessous:

#!/bin/sh

TYPE="$1"
WHICH="$2"
OUT="`readlink -f ./buildandrun.out`"

rm -rf $OUT

if test ! -n "$WHICH"
then
    echo "Please specify which type to build"
    exit 1
fi

if test ! -n "$WHICH"
then
    echo "Please specify which $TYPE to build"
    exit 2
fi

RV=0

echo "" >> $OUT
echo "Building src" >> $OUT
echo "" >> $OUT

cd src
make >> $OUT || RV=3
cd ..

if test $RV != 0; then exit $RV; fi

echo "" >> $OUT
echo "Building $TYPE/$WHICH" >> $OUT
echo "" >> $OUT

cd $TYPE
make "$WHICH" >>  $OUT || RV=4
cd ..

if test $RV != 0; then exit $RV; fi

echo "" >> $OUT
echo "Running $TYPE/$WHICH" >> $OUT
echo "" >> $OUT

$TYPE/$WHICH || RV=5

exit $RV

Cela me permet d'effectuer les opérations suivantes:

./buildandrun.sh test check_curl_requestheaders

Il faut espérer qu'il y aura éventuellement quelqu'un qui peut me montrer une solution plus élégante à ce problème, de préférence en utilisant autoconf et automake. J'ai le sentiment que c'est probablement quelque chose que ces outils font de la boîte et j'ai tout simplement pas encore découvert.

Autres conseils

Je suis confus. Dans tout projet que j'ai jamais travaillé, en cours d'exécution « make » à partir soit $ {} top_builddir ou de $ {} top_builddir / tests / ne se rétablira pas ou exécuter des tests. Les tests ne sont construits et exécutés pour « make check ». Utilisez-vous check_PROGRAMS dans votre Makefile.am?

En général, la compilation conditionnelle est traitée avec conditionals automake et extraits Makefile.am comme:

if WANT_FOO
bin_PROGRAMS += foo
endif

mais je suis certain que ce n'est pas ce que vous recherchez. On dirait que vous avez spécifié les dépendances dans un faux Makefile.am, et vous devez poster une version minimale de la / les.

PS: dans votre script shell, vous pouvez juste faire

export OUT
...
(cd src && make >> $OUT) || exit 3

Lorsque vous modifiez un certain fichier source, vous ne devriez pas avoir à reconfigurer tout. Il suffit de lancer à nouveau faire, et il ne doit reconstruire les fichiers binaires qui sont effectivement touchés par le changement. Alors, quand vous changez test/check_curl_requestheaders, puis faire une make plaine, alors que test/check_curl_requestheaders doit être reconstruit, de toute façon. Si quelque chose est reconstruit ailleurs, vous avez également un bug dans votre makefile.

Bien sûr, si vous configurez d'abord (que vous ne devriez pas), il est pas surprenant que plus de choses se reconstruit.

Modifier : Si vous changez la bibliothèque, puis voulez seulement reconstruire un seul test, puis

make test/check_curl_requestheaders

devrait être suffisant. Cela vous besoin d'avoir une cible nommée test/check_curl_requestheaders dans votre toplevel makefile. Cet objectif peut ressembler à

test/%:    library
    make -C test $*

en supposant que vous avez un makefile séparé dans le répertoire de test, et en supposant que ce makefile suppose que la bibliothèque a déjà été construit.

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