Autoconf: incluye una biblioteca estática (novato)

Estoy tratando de migrar mi aplicación de la compilación manual a la configuración automática, que hasta ahora funciona muy bien. Pero tengo una biblioteca estática que no puedo entender cómo integrar. Esa biblioteca NO se ubicará en las ubicaciones de biblioteca habituales: la ubicación del binario (archivo .a) y el encabezado (archivo .h) se proporcionará como argumento de configuración. (Notablemente, incluso si muevo el archivo .a a / usr / lib o en cualquier otro lugar que se me ocurra, todavía no funcionará). Tampoco se nombra tradicionalmente (no comienza con "lib" o "l ").

La compilación manual funciona con estos (el directorio no es predecible, esto es solo un ejemplo):

gcc ...  -I/home/john/mystuff  /home/john/mystuff/helper.a

(Uh, en realidad no entiendo por qué se hace referencia directa al archivo .a, no con -L ni nada. Sí, entiendo a medias la creación de programas en C.)

Entonces, en mi configure.ac, puedo usar el argumento de configuración relevante para encontrar con éxito el encabezado (archivo .h) usando AC_CHECK_HEADER. Dentro del AC_CHECK_HEADER, luego agrego la ubicación a CPFLAGS y el #include el archivo de encabezado en el código C real lo recoge muy bien.

Dado un argumento de configuración que se ha colocado en $ location y el nombre de los archivos necesarios son helper.h y helper.a (que están en el mismo directorio), esto es lo que funciona hasta ahora:

AC_CHECK_HEADER([$location/helper.h], 
    [AC_DEFINE([HAVE_HELPER_H], [1], [found helper.h]) 
    CFLAGS="$CFLAGS -I$location"])

Donde me encuentro con dificultades es vincular el binario (archivo .a). No importa lo que intente, siempre recibo un error sobre referencias indefinidas a las llamadas a funciones para esa biblioteca. Estoy bastante seguro de que es un problema de vinculación, porque puedo preocuparme por el código C y cometer un error intencional en las llamadas a funciones a esa biblioteca que produce errores anteriores que indican que los prototipos de funciones se han cargado y utilizado para compilar.

Intenté agregar la ubicación que contiene el archivo .a a LDFLAGS y luego hacer un AC_CHECK_LIB pero no se encuentra.

Tal vez mi sintaxis está mal, o tal vez me estoy perdiendo algo más fundamental, lo que no sería sorprendente ya que soy un novato y realmente no sé lo que estoy haciendo.

Esto es lo que he intentado:

AC_CHECK_HEADER([$location/helper.h], 
    [AC_DEFINE([HAVE_HELPER_H], [1], [found helper.h]) 
    CFLAGS="$CFLAGS -I$location"; 
    LDFLAGS="$LDFLAGS -L$location"; 
    AC_CHECK_LIB(helper)])

No dados. AC_CHECK_LIB está buscando -lhelper, supongo (¿o libhelper?), Así que no estoy seguro de si eso es un problema, así que probé esto también (omita AC_CHECK_LIB e incluya el .a directamente en LDFLAGS), sin suerte:

AC_CHECK_HEADER([$location/helper.h], 
    [AC_DEFINE([HAVE_HELPER_H], [1], [found helper.h]) 
    CFLAGS="$CFLAGS -I$location"; 
    LDFLAGS="$LDFLAGS -L$location/helper.a"])

Para emular la compilación manual, intenté eliminar el -L pero eso no ayuda:

AC_CHECK_HEADER([$location/helper.h], 
    [AC_DEFINE([HAVE_HELPER_H], [1], [found helper.h]) 
    CFLAGS="$CFLAGS -I$location"; 
    LDFLAGS="$LDFLAGS $location/helper.a"])

Intenté otras combinaciones y permutaciones, pero creo que podría estar perdiendo algo más fundamental ...

================ ACTUALIZACIÓN

Lo hice funcionar con una ruta codificada al archivo .a en Makefile.am usando _LDADD así:

myprog_LDADD=/home/john/mystuff/helper.a

Pero no puedo predecir la ubicación del archivo .a. Por alguna razón, definir myprog_LDADD en configure.ac no funciona (ojalá lo hiciera, así que puedo usar mi variable de ubicación dinámica), y parece que no funciona ninguna combinación de cambios en LDFLAGS, myprog_LDFLAGS, AM_LDFLAGS.

Si, en Makefile.am, intento usar la ubicación variable que se define en configure.ac, no funciona

myprog_LDADD=($location)helper.a

================ ACTUALIZACIÓN

Creo que lo descubrí, pero como no tengo idea de lo que estoy haciendo, REALMENTE agradecería algunos comentarios. Usé AC_SUBST () para que myprog_LDADD funcione desde configure.ac, por lo que la solución final se ve así:

AC_CHECK_HEADER([$location/helper.h], 
    [AC_DEFINE([HAVE_HELPER_H], [1], [found helper.h]) 
    CFLAGS="$CFLAGS -I$location" 
    myprog_LDADD="$location/helper.a" 
    AC_SUBST(myprog_LDADD)])

Respuestas a la pregunta(1)

Su respuesta a la pregunta