2011-05-03 15 views
13

Mi programa tiene que cargar algunos archivos en tiempo de ejecución, que se van a instalar en cualquier carpeta se da a ./configure --datadir=/somewhereAutoconf: ¿Cómo obtener rutas de instalación en config.hy

Como mi programa necesita saber dónde esta carpeta es en tiempo de ejecución, necesito # definir un símbolo en alguna parte para que el código C pueda acceder a la ruta como una cadena.

Actualmente estoy haciendo esto modificando los parámetros del compilador:

AM_CPPFLAGS = -DDATA_PATH=\"$(pkgdatadir)\" 

Sin embargo, como el script de configuración ya produce un archivo config.hy con un montón de otras cosas en él, me gustaría tener el símbolo aparecer allí en su lugar.

¿Es posible?

Respuesta

4
AC_DEFINE_UNQUOTED([DATA_PATH], ["$pkgdatadir"]) 

A pesar de la modificación de los parámetros del compilador es realmente la forma más habitual de hacerlo.

+0

Gracias! ¿Hay algún beneficio al hacerlo de la manera "habitual"? Estoy dispuesto a mantener el estándar, pero parecía más complicado. – Malvineous

+0

La ventaja es que puede anular CPPFLAGS en el momento de configuración haciendo './configure CPPFLAGS = -DDATA_PATH =/path/to/alternate/data'; hacerlo con config.h requiere './configure --prefix =/alternate/prefix', lo que le da menos control sobre dónde se encuentran sus diversos directorios. – ptomato

6

Su solución es la correcta. La razón por la que Autoconf/Automake no admite (fácilmente) la instalación de las rutas de acceso en config.h es que, en teoría, se supone que es posible anular las rutas en tiempo de compilación, como make prefix=/else/where. Esta posibilidad es hoy en día algo misteriosa, pero esa es la razón. (Tenga en cuenta que esto es distinto de make install prefix=/else/where/, que sigue siendo útil, a pesar de DESTDIR.)

6

Su respuesta es la forma preferida de hacerlo. El manual de autoconf explica cómo anular varias variables en el momento de "hacer la instalación" (que es muy útil para el empaquetado, por ejemplo). Al hacerlo, se dice (en la sección "Variables de directorio de instalación):

A corollary is that you should not use these variables except in 
makefiles. For instance, instead of trying to evaluate `datadir' in 
`configure' and hard-coding it in makefiles using e.g., 
`AC_DEFINE_UNQUOTED([DATADIR], ["$datadir"], [Data directory.])', you 
should add `-DDATADIR='$(datadir)'' to your makefile's definition of 
`CPPFLAGS' (`AM_CPPFLAGS' if you are also using Automake). 

autotools, y construir sistemas en general, son un negocio complicado y sin embargo, nadie ha llegado con maneras agradables y ordenada de hacer las cosas que son lo suficientemente general, lo que significa que tenemos que leer secciones como esta y resolverlo por completo. En cualquier caso, su intuición fue correcta!

1

En el caso de que tenga toda una serie de tales caminos que debe conocer su código fuente, y desea evitar el ruido excesivo en sus compilaciones (por ejemplo, -DPATH1 =/ruta/a/algo -DPATH2 =/ruta2/a/algo2 -DPATH3 =/ruta3/a/algo3 ... ad infinitum), una alternativa que puede ser deseable para algunas personas es crear un nuevo "mynewheader.h.in", con las líneas

#define PATH1 "@[email protected]" 
#define PATH2 "@[email protected]" 
#define PATH3 "@[email protected]" 

y añadirlo a la línea AC_CONFIG_FILES de su configure.ac, por ejemplo:

AC_CONFIG_FILES([Makefile mynewheader.h]) 
Cuestiones relacionadas