2012-04-17 7 views
6

Ho il seguente problema con configure.ac:Aggiunta di un percorso per AC_CHECK_LIB

vorrei aggiungere un percorso di ricerca della libreria, perché le librerie devo usare sono in alcune cartelle pazze. La mia idea è di farlo con un'opzione:

AC_ARG_WITH([cplex-lib-path], 
    [AS_HELP_STRING([--with-cplex-libs], [location of the CPLEX library])], 
    [CPLEX_LIBS="-L$withval --lcplex"], 
    []) 

Se qualcuno specifica il percorso della libreria avrei ovviamente piacerebbe vedere se la libreria può essere trovato:

AC_CHECK_LIB([cplex], [CPXcreateprob], [], 
[ 
    AC_MSG_ERROR([Could not find CPLEX library]) 
]) 

Tuttavia, vorrei aggiungere CPLEX_LIBS al percorso di ricerca della libreria di AC_CHECK_LIB. È in qualche modo possibile?

risposta

14

È responsabilità dell'utente indicare lo script di configurazione in cui si trovano le librerie. Ci sono molte opzioni disponibili per l'utente, con le più comuni sono:

configure LDFLAGS=-L/p/a/t/h 

Non c'è assolutamente alcuna ragione per il manutentore di modificare gli script di build a tutti per accogliere un utente su questo punto, e molte buone ragioni per non provando a fare nulla Se tu (come utente) trovi che le tue librerie sono in molte posizioni, puoi impostare LDFLAGS nel tuo ambiente, o in un config.site. La tua toolchain probabilmente ha altri meccanismi (ad esempio, se stai usando gcc puoi semplicemente impostare LIBRARY_PATH). L'infrastruttura fornita da autoconf fornisce già molti meccanismi per affrontare questo problema, e il maintainer del pacchetto è meglio non reinventare la ruota e fornire interfacce non standard.

Ora che ho sostenuto che non dovresti fare ciò che stai cercando di fare, ti dirò come farlo. AC_CHECK_LIB userà il valore in LDFLAGS per la sua ricerca, in modo da poter fare:

LDFLAGS="$LDFLAGS $CPLEX_LIBS"  # this is a bug 

e questo è sbagliato perché ora avete una bandiera -l in LDFLAGS, ma -l argomenti appartengono a LIBS. Inoltre, se hai intenzione di avere un'altra libreria, libfoo e $ FOO_LIBS che puntano a una posizione diversa, non c'è semplicemente alcun modo di disambiguare: LDFLAGS otterrà -L/cplex e -L/foo e l'utente non saprà quale viene prima e non sarà in grado di garantire il collegamento con una libreria sull'altra. In breve, non utilizzare CPLEX_LIBS: istruisci il tuo utente a utilizzare LDFLAGS. Inoltre, è più facile da scrivere:

configure LDFLAGS='-Lpath1 -Lpath2' 

che è di tipo

configure --with-cplex=path1 --with-foo=path2 

e quest'ultimo offusca cose e porta ad una popolazione senza istruzione. Non ho mai capito perché alla gente piace mettere in queste opzioni --with-lib =/p/a/t/h nelle loro build: non forniscono nulla di utile.

Problemi correlati