Question

J'ai copié libtool dans l'arborescence source de mon programme pour le distribuer avec le programme. Mais lorsque je lance «make distclean», libtool est supprimé avec le reste du fichier généré. Comment puis-je empêcher que cela se produise?

J'ai essayé de mettre EXTRA_DIST = libtool dans Makefile.am mais cela ne fonctionne pas.

Voici en gros à quoi ressemble mon fichier configure.ac.

AC_PREREQ(2.53)
AC_INIT( [program], [0.16], [program] )
AC_CONFIG_SRCDIR([src/c/program.c])
AC_CONFIG_HEADER([config.h])
AC_CONFIG_AUX_DIR(build-aux)
AM_INIT_AUTOMAKE( [-Wall -Werror foreign] )

m4_include(ax_pkg_swig.m4)

# Checks for programs.
AC_PROG_CC
AC_PROG_LIBTOOL
AC_ENABLE_SHARED
AC_PROG_SWIG

# Checks for libraries.

# Checks for header files.
AC_HEADER_STDC
AC_CHECK_HEADERS([stdlib.h string.h unistd.h])

# Checks for typedefs, structures, and compiler characteristics.
AC_TYPE_SIZE_T

# Checks for library functions.
AC_REPLACE_FNMATCH
AC_FUNC_MALLOC
AC_FUNC_STAT
AC_CHECK_FUNCS([regcomp strdup strtoull])

AC_CONFIG_FILES([
    Makefile
    src/c/Makefile
    src/perl/Makefile
    src/verilog/Makefile
])
AC_OUTPUT
Était-ce utile?

La solution

Vous n'êtes pas censé copier libtool à la main dans le répertoire de votre programme. Vous exécutez libtoolize dans votre script d'amorçage, qui gère cela pour vous. Je suppose que cela va au-delà de la copie de libtool, par exemple en informant automake qu’elle ne devrait pas supprimer le fichier. Voici un exemple de script d'amorçage:

#!/bin/sh
aclocal -I config &&
    libtoolize --force --copy &&
    autoheader &&
    automake --add-missing --copy --foreign &&
    autoconf &&
    ./configure -C "$@"

Ce script est généralement appelé bootstrap ou autogen.sh . Ces noms ne sont pas universels, mais presque. Il y a quelques jours à peine, je suis tombé sur un projet utilisant bootstrap.sh , par exemple.

Dans une large mesure, le nom du script est une question de mode et de style. Ce n'est pas entièrement superficiel, car une partie du style moderne consiste à abandonner l'exécution de configure à la fin du script. bootstrap est le nom le plus récent. Par conséquent, un script nommé ayant moins de chances d'exécuter configure à la fin. Le chapitre 8 du livre automatique implique que c'est également le cas, mais je J'ai rencontré des contre-exemples. (Autrement dit, les projets avec un script autogen.sh qui n’appelle pas configure et les projets avec un script bootstrap qui le fait.)

À mon sens, la question de savoir s'il faut inclure l'étape configure à la fin revient à la manière dont les cas d'utilisation de votre projet sont typiques. Si presque toutes les personnes ayant besoin d'amorcer l'arbre de génération de votre projet acceptent les indicateurs standard configure définis dans le script d'amorçage, ou peut-être en ajoutent un ou deux simples, il est correct d'exécuter configure . automatiquement Il est préférable d’en faire une étape manuelle distincte si de nombreuses personnes doivent procéder à une personnalisation poussée. Par exemple, un grand nombre de vos utilisateurs effectuent une compilation croisée de votre projet. Les manières de demander à configure de le faire sont bien connues, alors que quelqu'un devrait lire le code de votre script d'amorçage pour déterminer comment obtenir les options transmises au configure intégré. commande.

Vous devrez certainement personnaliser ce script en fonction des besoins de votre projet. La chose la plus importante à laisser en l'état est l'ordre des opérations. Les outils automatiques sont sensibles à cela. Vous devrez peut-être changer les indicateurs en fonction des commandes; le -I config de la commande aclocal n'est pas universel, par exemple. Il est encore plus probable que vous ayez besoin d’ajouter des étapes au processus, soit en les entourant, soit même en les interconnectant.

Pour le Option autoreconf , je ne suis pas encore devenu fan. Je trouve que ses hypothèses inhérentes s'effondrent sur tous mes projets, en quelque sorte. Si votre projet est un projet de style GNU standard, il peut fonctionner pour vous.

Au fait, la macro AC_PROG_LIBTOOL est obsolète . Vous devriez utiliser LT_INIT à la place.

Autres conseils

En fait, vous n'avez pas besoin d'appeler tout ce qui aclocal et libtoolize et autoheader et ...

Il suffit d'appeler

$ autoreconf -i

et autoreconf exécuteront aclocal, libtoolize (s’il existe des macros libtool dans configure.ac), automake (si configure.ac implique automake) et autoconf. Tous les fichiers qui doivent être ajoutés à votre arborescence source y seront copiés, parmi eux ltmain.sh.2

J'ajoute généralement quelques commentaires (-v) et au lieu de simplement copier les fichiers, je les lie de manière symbolique, ce qui entraîne mon appel standard de

$ autoreconf -vis

L'outil "libtool" fichier généré par un " configurer " run est spécifique au système sur lequel la configuration a eu lieu et sera donc bien sûr nettoyé à nouveau par "make distclean".

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