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:
- No encuentra la versión instalada en
/opt/local/lib
- No se queja si la biblioteca no se encuentra realmente
- 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.