Domanda

Ho copiato libtool nell'albero dei sorgenti del mio programma per distribuirlo con il programma. Ma quando eseguo libtool 'make distclean' viene eliminato con il resto del resto dei file generati. Come posso impedire che ciò accada?

Ho provato a inserire EXTRA_DIST = libtool in Makefile.am ma non funziona.

Ecco come appare il mio 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
È stato utile?

Soluzione

Non dovresti copiare libtool nella directory del tuo programma a mano. Esegui libtoolize nello script bootstrap, che lo gestisce per te. Suppongo che stia facendo molto di più che copiare semplicemente libtool per te, come informare automake che non dovrebbe cancellare il file. Ecco uno script di bootstrap di esempio:

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

Questo script è tradizionalmente chiamato bootstrap o autogen.sh . Questi nomi non sono universali, quasi quasi. Solo pochi giorni fa, mi sono imbattuto in un progetto usando bootstrap.sh , per esempio.

In larga misura il nome della sceneggiatura è una questione di moda e stile. Non è del tutto superficiale perché parte dello stile moderno è un allontanamento dall'esecuzione di configure alla fine dello script. bootstrap è il nome più recente, quindi uno script chiamato che ha meno probabilità di eseguire configura alla fine. il capitolo 8 dell'Autobook implica che anche questo è il caso, ma io ho incontrato controesempi. (Cioè, progetti con uno script autogen.sh che non chiama configura , e progetti con uno script bootstrap che lo fanno.)

A mio avviso, la domanda se includere il passaggio configura alla fine si riduce a quanto siano tipici i casi d'uso del progetto. Se quasi tutti coloro che hanno bisogno di avviare il bootstrap dell'albero di compilazione del tuo progetto accetteranno i flag configura standard definiti nello script bootstrap, o forse ne aggiungeranno uno o due semplici, sarà bene eseguire configura automaticamente. È meglio renderlo un passaggio manuale separato se molte persone dovranno eseguire personalizzazioni pesanti. Un esempio è quando molti dei tuoi utenti sono cross-compilazione del tuo progetto. I modi per chiedere a configure di farlo sono ben noti, mentre qualcuno dovrebbe leggere il codice dello script bootstrap per capire come far passare le opzioni al configure incorporato comando.

Dovrai quasi certamente personalizzare questo script in base alle esigenze del tuo progetto. La cosa più importante da lasciare così com'è è l'ordine delle operazioni. Gli autotools sono sensibili a questo. Potrebbe essere necessario modificare i flag dati i comandi; il -I config sul comando aclocal non è universale, per esempio. È ancora più probabile che tu abbia bisogno di aggiungere passaggi al processo, o circondando questi passaggi comuni, o forse anche interfogliati con essi.

Come per the opzione autoreconf , devo ancora diventare un fan. Trovo che i suoi presupposti integrati si rompano su tutti i miei progetti, in qualche modo. Se il tuo progetto è un progetto in stile GNU standard, può funzionare per te.

A proposito, la macro AC_PROG_LIBTOOL è obsoleto. Dovresti invece utilizzare LT_INIT .

Altri suggerimenti

In realtà, non è necessario chiamare tutto ciò che è aclocale, libtoolize, autoheader e ...

Basta chiamare

$ autoreconf -i

e autoreconf funzioneranno aclocal, libtoolize (se ci sono macro libtool in configure.ac), automake (se configure.ac coinvolge automake) e autoconf. Tutti i rispettivi file che devono essere aggiunti all'albero dei sorgenti verranno copiati lì, tra cui ltmain.sh.2

Di solito aggiungo un po 'di verbosità (-v) e invece di copiare semplicemente i file, li collegamento simbolicamente, risultando nella mia chiamata standard di

$ autoreconf -vis

Il " libtool " file generato da un " configura " run è specifico per il sistema su cui è avvenuta la configurazione e quindi sarà ovviamente ripulito da " make distclean " ;.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top