autoconf

autoconf - automake



ResoluciĆ³n de la biblioteca con autoconf? (6)

Estoy construyendo mi primer paquete administrado autoconf.

Sin embargo, no puedo encontrar ningún ejemplo simple de cómo especificar una biblioteca requerida, y encontrar esa biblioteca donde podría estar en varios lugares diferentes.

Actualmente tengo:

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

pero:

  1. No encuentra la versión instalada en /opt/local/lib
  2. No se queja si la biblioteca no se encuentra realmente
  3. Necesito establecer la ruta de inclusión en /opt/local/include también

cualquier ayuda, o enlaces a tutoriales decentes muy apreciados ...


Para esa situación, la forma estándar es tener la variable de entorno CPLUS_INCLUDE_PATH con la ruta de los archivos include no oficiales y LIBRARY_PATH para las bibliotecas. Recuérdele que no tiene que cambiar nada en el archivo configure.ac. Entonces puede llamar a la configuración de esta manera:

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


Si la biblioteca envía un archivo .pc, considere usar la macro PKG_CHECK_MODULES () que hace las cosas que desea. Si es su propia biblioteca, solo envíe un archivo .pc a / usr / lib / pkgconfig, hará que sea mucho más fácil para otros desarrolladores depender de / usarlo.


CFLAGS configurar manualmente CFLAGS , CXXFLAGS y LDFLAGS si desea que gcc / g ++ busque en ubicaciones no estándar.

Entonces, antes de llamar a AC_CHECK_LIB() , haz algo como

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

No necesita CXXFLAGS si solo está utilizando gcc en su script de configuración.


Sé que este es un hilo viejo ahora, pero creo que esto puede ayudar a algunas personas. Así es como encuentro algunas cosas.

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


Así que desea configurar autoconf para encontrar estos directorios automáticamente ycodelogic da la respuesta; pero supongamos que no desea buscar allí en todo el sistema, solo en un mac. Puede agregar lo siguiente

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

Tenga en cuenta que lo agregué como un árbol de casos para que pueda agregar cosas para una variedad de sistemas operativos más adelante (como linux * y BSD ).


La secuencia de comandos autoconf no puede adivinar las ubicaciones de la biblioteca "opcional", que pueden variar de una plataforma a otra. Entonces puedes decir

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

Para AC_CHECK_LIB() , debe especificar la condición de falla explícitamente en el argumento "acción-si-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])])

Salida:

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

AC_CHECK_LIB() no falla de manera predeterminada por razones obvias: uno puede buscar varias bibliotecas diferentes que proporcionan una funcionalidad similar y elegir una de ellas :)

También eche un vistazo a esta publicación para un tema similar.