libtool eliminado por 'make distclean'
Pregunta
Copié libtool en el árbol fuente de mi programa para distribuirlo con el programa. Pero cuando ejecuto 'make distclean', libtool se elimina con el resto del resto de los archivos generados. ¿Cómo evito que eso suceda?
Intenté poner EXTRA_DIST = libtool
en Makefile.am pero eso no funciona.
Esto es básicamente lo que parece mi 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
Solución
Se supone que no debe copiar libtool
en el directorio de su programa a mano. Ejecutas libtoolize
en tu script bootstrap, que maneja esto por ti. Supongo que está haciendo más que solo copiar libtool para usted, como informar a automake que no debe eliminar el archivo. Aquí hay un script de arranque de muestra:
#!/bin/sh
aclocal -I config &&
libtoolize --force --copy &&
autoheader &&
automake --add-missing --copy --foreign &&
autoconf &&
./configure -C "$@"
Este script se denomina tradicionalmente bootstrap
o autogen.sh
. Estos nombres no son universales, solo que casi. Hace solo unos días, me encontré con un proyecto usando bootstrap.sh
, por ejemplo.
En gran medida, el nombre del guión es una cuestión de moda y estilo. No es del todo superficial porque parte del estilo moderno es alejarse de ejecutar configure
al final del script. bootstrap
es el nombre más nuevo, por lo que es menos probable que un script llamado ejecute configure
al final. El Capítulo 8 del Autobook implica que este también es el caso, pero yo me he encontrado con contraejemplos. (Es decir, proyectos con un script autogen.sh
que no llama a configure
, y proyectos con un script bootstrap
que sí lo hace).
En mi opinión, la cuestión de si incluir el paso configure
al final se reduce a qué tan típicos son los casos de uso de su proyecto. Si casi todos los que necesitan arrancar el árbol de compilación de su proyecto aceptarán las banderas estándar configure
definidas en el script bootstrap, o tal vez agreguen uno o dos simples, está bien ejecutar configure
automáticamente. Es mejor hacer un paso manual por separado si mucha gente necesita hacer una personalización intensa. Un ejemplo es cuando muchos de sus usuarios están compilación cruzada su proyecto. Las formas de pedirle a configure
que haga esto son bien conocidas, mientras que alguien tendría que leer el código de su script de arranque para descubrir cómo pasar las opciones a la configure
incrustada comando.
Seguramente tendrá que personalizar este script para las necesidades de su proyecto. Lo más importante para dejar como está es el orden de las operaciones. Los Autotools son sensibles a eso. Puede que tenga que cambiar los indicadores dados los comandos; el -I config
en el comando aclocal
no es universal, por ejemplo. Es aún más probable que necesite agregar pasos al proceso, ya sea en torno a estos pasos comunes, o tal vez incluso intercalarlos con ellos.
En cuanto a el Opción autoreconf
, aún no me he hecho fan. Encuentro que sus suposiciones integradas se descomponen en todos mis proyectos, de alguna manera. Si su proyecto es un proyecto con estilo GNU estándar de pantano, puede funcionar para usted.
Por cierto, la macro AC_PROG_LIBTOOL
es obsoleto . Debería usar LT_INIT
en su lugar.
Otros consejos
En realidad, no es necesario llamar a todo eso local y libtoolize y autoheader y ...
Solo llame
$ autoreconf -i
y autoreconf ejecutará aclocal, libtoolize (si hay macros libtool en configure.ac), automake (si configure.ac involucra automake) y autoconf. Todos los archivos respectivos que deben agregarse a su árbol de origen se copiarán allí, entre ellos ltmain.sh.2
Normalmente agrego algo de verbosidad (-v) y en lugar de simplemente copiar los archivos, los enlace simbólicamente, lo que resulta en mi llamada estándar de
$ autoreconf -vis
El " libtool " archivo generado por un " configurar " La ejecución es específica del sistema en el que se realizó la ejecución de configuración y, por lo tanto, por supuesto, se limpiará nuevamente mediante "make distclean".