2009-02-05 13 views
20

Sto costruendo il mio primo pacchetto gestito da autoconf.Risoluzione della libreria con autoconf?

Tuttavia non riesco a trovare alcun esempio semplice di come specificare una libreria richiesta e trovare quella libreria in cui potrebbe trovarsi in vari luoghi diversi.

ho attualmente ottenuto:

AC_CHECK_LIB(['event'], ['event_init']) 

ma:

  1. Non trova la versione installata in /opt/local/lib
  2. E non si lamenta se la libreria non è in realtà trovato
  3. Ho bisogno di impostare il percorso di inclusione per /opt/local/include troppo

alcun aiuto, o link a tutorial decente molto apprezzati ...

+0

Questa documentazione [documentazione su AC \ _CHECK \ _LIB] (http://www.shlomifish.org/lecture/Autotools/slides/common_macros/AC_CHECK_LIB.html) è di aiuto? – leed25d

risposta

10

è necessario impostare manualmente CFLAGS, CXXFLAGS e LDFLAGS se si vuole gcc/g ++ di guardare in posizioni non standard.

Quindi, prima di chiamare AC_CHECK_LIB(), fare qualcosa di simile

CFLAGS="$CFLAGS -I/opt/local/include" 
CXXFLAGS="$CXXFLAGS -I/opt/local/include" 
LDFLAGS="$LDFLAGS -L/opt/local/lib" 

Non è necessario CXXFLAGS se si sta utilizzando solo gcc per tutta la script di configurazione.

+0

Suppongo che la prima riga debba essere CPPFLAGS, non CFLAGS? – Alnitak

+0

Intendevo CFLAGS nella prima riga, ma per quanto riguarda l'inclusione delle intestazioni, anche CPPFLAGS dovrebbe fare il trucco. – codelogic

+2

Sono d'accordo con Alnitak nel senso che si consiglia di usare CFLAGS/CXXFLAGS (a seconda del compilatore C/C++ che si intende usare) dovrebbe essere usato solo per gli argomenti del compilatore (come "-g", "-O3"). Include dovrebbe andare a CPPFLAGS (C Pre Processor). –

8

Se la libreria contiene un file .pc, prendere in considerazione l'utilizzo della macro PKG_CHECK_MODULES() che esegue le operazioni desiderate. Se è la tua libreria, spedisci semplicemente un file .pc in/usr/lib/pkgconfig, renderà molto più semplice per gli altri sviluppatori dipenderlo/usarlo.

+0

La mia lib spedisce un file .pc. Dove mettere la macro PKG_CHECK_MODULES()? Grazie. –

12

Lo script autoconf non può indovinare i percorsi di libreria "facoltativi", che possono variare da una piattaforma all'altra. Così si può dire che

CPPFLAGS="-I/opt/local/include" LDFLAGS="-L/opt/local/lib" ./configure 

Per AC_CHECK_LIB() è necessario specificare la condizione non riuscire esplicitamente in discussione "azione-se-falso":

dnl This is simply print "no" and continue: 
AC_CHECK_LIB([m], [sqrt123]) 
dnl This will stop: 
AC_CHECK_LIB([m], [sqrt123], [], [AC_MSG_ERROR([sqrt123 was not found in libm])]) 

uscita:

checking for sqrt123 in -lm... no 
checking for sqrt123 in -lm... no 
configure: error: sqrt123 was not found in libm 

AC_CHECK_LIB() non lo fa fallire di default per ovvi motivi: si possono verificare diverse librerie diverse che offrono funzionalità simili e scegliere una di esse :)

Anche dare un'occhiata a this post per argomenti simili.

+4

Ancora meglio, './configure CPPFLAGS = ...' che ricorderà la variabile in un successivo './config.status --recheck', per esempio. Vedi http://www.gnu.org/software/autoconf/manual/autoconf-2.67/html_node/Defining-Variables.html –

+0

Buon suggerimento, sono d'accordo. –

2

So che questo è un thread vecchio ora, ma immagino che questo possa aiutare alcune persone. Questo è il modo in cui trovo qualcosa.

hdff="no" 
hdffprefix="ERROR" 
AC_ARG_WITH(hdf,[ --with-hdf    Compile with hdf library, for output.],[hdffprefix=$withval hdff="yes"],[]) 
# if there is no value given, it appears tha hdffprefix is set to "yes" 
if test $hdffprefix = "yes" -a $hdff = "yes" 
then 
    echo "HDF: Attempting to find HDF" 
    hdffprefix="ERROR" 

    # check if hdffprefix is set, if it is not, it sets it to "ERROR" and the 
    # 'if' comparison evaluates to true 
    if [[ "$hdffprefix" == "ERROR" ]] 
    then 
     echo "HDF: hdffprefix not set, searching PATH" 
     for i in `echo $PATH | tr ':' '\n'` 
     do 
      if [[ $i == *hdf* ]] 
      then 
       if [[ $i == *bin/* ]] 
       then 
        hdffprefix=${i%bin/} 
        # if it doesn't exist, re-set to ERROR 
        if [[ ! -f ${hdffprefix}include/hdf.h ]] 
        then 
        hdffprefix="ERROR" 
        fi 
       elif [[ $i == *bin* ]] 
       then 
        hdffprefix=${i%bin} 
        # if it doesn't exist, re-set to ERROR 
        if [[ ! -f ${hdffprefix}include/hdf.h ]] 
        then 
        hdffprefix="ERROR" 
        fi 
       fi 
      fi 
     done 
     if [[ "$hdffprefix" == "ERROR" ]] 
     then 
      echo "HDF: hdffprefix not found in PATH, trying 'which'" 
      WHICH_TEST_HDF=`which hdf2gif` 
      if [[ WHICH_TEST_HDF != "" ]] 
      then 
       hdffprefix=${WHICH_TEST_HDF%bin/hdf2gif} 
      else 
       echo "HDF: Warning - hdf not found" 
      fi 
     fi 
    fi 
    if [[ "$hdffprefix" != "ERROR" ]] 
    then 
     hdff="yes" 
     echo "HDF found: $hdffprefix" 
    fi 
fi 
if test $hdff = 'yes'; then 
     hdfincs=" -DUSE_HDF -I"${hdffprefix}"include" 
     scriptotherlibsinc=${scriptotherlibsinc}" -L"${hdffprefix}"/lib" 
     scriptotherlibs=${scriptotherlibs}" -lmfhdf -ldf -ljpeg -lz" 
    AC_CHECK_HEADERS([${hdffprefix}/include/hdf.h],,[AC_MSG_ERROR([Cannot find hdf.h])]) 
    AC_CHECK_HEADERS([${hdffprefix}/include/mfhdf.h],,[AC_MSG_ERROR([Cannot find mfhdf.h])]) 
fi 
0

Quindi si desidera impostare autoconf per trovare automaticamente queste directory e codelogic fornisce la risposta; ma supponiamo che tu non voglia cercare lì su tutto il sistema, solo su un mac.È possibile aggiungere il seguente

AC_CANONICAL_HOST 
case $host_os in 
    darwin*) 
     CFLAGS="$CFLAGS -I/opt/local/include" 
     CXXFLAGS="$CXXFLAGS -I/opt/local/include" 
     LDFLAGS="$LDFLAGS -L/opt/local/lib" 
     ;; 

esac 

Nota che ho aggiunto come un albero caso in modo che è possibile aggiungere le cose per una varietà di sistemi operativi successivi (come Linux * e BSD).

0

per quella situazione, il modo standard sta avendo la variabile d'ambiente CPLUS_INCLUDE_PATH con il percorso del non ufficiale include file e LIBRARY_PATH per le librerie. Ricordare che non è necessario modificare nulla in configure.ac. Quindi, si può chiamare il configurare in questo modo:

$ export CPLUS_INCLUDE_PATH=/opt/local/include 
$ export LIBRARY_PATH=/opt/local/lib 
$ ./configure 

Portabilità Nota: Anche se questo funziona su molti compilatori moderni, non tutti i compilatori rispetteranno queste variabili. Alcuni cross-compilatori ignorano o sovrascrivono a priori, il che costringe a ricorrere alle modifiche CFLAGS e LDFLAGS come menzionato in altre risposte.

Problemi correlati