Automake - comment garder l'arbre source propre?

10

J'ai un projet qui utilise les autotools GNU pour se construire. J'essaie de modifier pour que les outils automatiques génèrent tous les fichiers de contrôle non versionnés dans un répertoire séparé afin que je puisse garder l'arborescence source propre des fichiers temporaires. Quelqu'un a des idées sur la façon de procéder?

vorad
la source
6
Faites juste une construction hors de l'arbre: stackoverflow.com/questions/1311231/… cela laisse encore des résidus, malheureusement. Essayez CMake un jour.
Vitor Py
3
Ce jour est venu, il m'a fallu moins d'une heure pour passer de cet affreux autconf à cmake qui semble beaucoup plus propre.
vorad
1
CMake est beaucoup plus propre qu'autoconf: en fait, une construction hors arborescence est la façon la plus courante de faire une construction CMake. Bon choix :)
Vitor Py
Est-il habituel d'avoir un Makefile en haut de l'arborescence source qui contrôle le processus de construction avec cmake? Supposons que make exécute mkdir -p build && cd build && cmake .. && make et ainsi de suite (différentes cibles peuvent être comme make test, etc.).
vorad du
Rare. CMake devrait générer des makefiles, et non l'inverse! Recherchez un livre intitulé Mastering CMake ou sur les processus de construction VTK ou KDE pour des exemples de mots réels. Un grand avantage de CMake est d'être au dessus de make: il peut également construire votre logiciel en utilisant Visual Studio vcproj, nmake Makefiles, XCode etc. KDE utilise un script shell ('kdebuild') pour démarrer les processus de construction - peut-être que vous voulez prendre un coup d'oeil.
Vitor Py

Réponses:

2

Le paquet autotools contient beaucoup de chemins relatifs et de noms codés en dur pour une bonne raison. Votre meilleure option est de résumer la sortie et les marquer comme ignorés dans votre contrôle de révision, par exemple dans .cvsignore, .hgignoreou svn:ignoreattibute. Certains RCS vous permettent même de spécifier récursivement des caractères génériques.

aquaherd
la source
4
Il n'y a pas une seule bonne raison d'avoir ce chemin relatif codé en dur autre que le style de programmation unix des années 1970.
Lothar
2

Solution: créer une version hors source

  • Comme suggéré dans les commentaires, vous pouvez effectuer une génération hors source.
  • Le principe est le suivant: créer un autre répertoire, une "arborescence de construction", exécuter le script de configuration à partir de ce répertoire (avec un chemin relatif ou absolu).

Exemple avec vérification automatisée

Par exemple, cela va chercher et construire GNU bonjour et vérifier que l'arborescence source n'est pas modifiée un tout petit peu.

Préparation de l'arbre source

Cette partie récupère et prépare les répertoires.

{
wget -S http://ftp.gnu.org/gnu/hello/hello-2.10.tar.gz
tar zxvf hello-2.10.tar.gz
mv hello-2.10 hello-2.10-pristine
tar zxvf hello-2.10.tar.gz
diff -urq hello-2.10 hello-2.10-pristine && echo "Before build, directories are identical."
cd hello-2.10
}

Partie générique: réutilisez cela dans votre projet

Cette partie peut être utilisée avec d'autres projets basés sur l'autoconf. Insérez simplement votre projet dans votre projet avant de l'exécuter. Attention: cela fonctionne rm, si vous jouez avec des variantes soyez prudent, vous êtes en tout cas responsable.

export MYPREFIX="${PWD}.installtree"
(
set -eu # abort on error
ls configure # make sure it aborts if not in correct directory
export SRCTREE="${PWD}"
export BUILDTREE="${PWD}.buildtree"
rm -rf "$BUILDTREE" "$MYPREFIX"
mkdir "$BUILDTREE" "$MYPREFIX"
cd "$BUILDTREE"
"${SRCTREE}"/configure --prefix="${MYPREFIX?}"
time make -k || time make
time make install
)

Vérifier la pièce

Cela vérifie si la construction est parfaitement hors source.

{
ls "$MYPREFIX"/bin/hello && echo "Okay, build generated the target."
cd "$MYPREFIX"/..
diff -urq hello-2.10 hello-2.10-pristine && echo "No change at all. Perfect out-of-source build success."
}

Ici, il génère ceci:

/tmp/hello-2.10.installtree/bin/hello
Okay, build generated the target.
No change at all. Perfect out-of-source build success.

Bonus: installation non root

La --prefix="${MYPREFIX?}"partie ci-dessus est facultative. Il permet de faire un "make install" local sur votre compte. Si vous souhaitez que "sudo make install" soit installé sur l'ensemble du système, vous pouvez le supprimer --prefix="${MYPREFIX?}".

Stéphane Gourichon
la source