Pregunta

Tengo un proyecto escrito en C ++ (con ayuda de glibmm), y estoy usando autotools para administrarlo. La pregunta que tengo que hacer es: "¿CÓMO EN LA TIERRA DEBO SABER DONDE CARGAR EL MATERIAL?". Si bien puedo encontrar todas las guías que quiero en las herramientas automáticas, ninguna responde a esta pregunta.

Por ejemplo, los mapas van en $ DATADIR / maps (generalmente / usr / [local /] share / myprogram / maps . Autotools hace lo correcto y los coloca allí, pero ¿cómo sé si los puso allí o $ HOME / myprogram / maps y los cargué adecuadamente (idealmente buscaría primero $ PWD , pero eso es fácil).

¿Fue útil?

Solución 2

La respuesta de Jonathan Leffler fue útil (me proporcionó suficiente información para obtener la evolución de la fuente y encontrar lo que necesitaba hacer), pero no respondió completamente a mi pregunta, así que publicaré la solución completa aquí:

En configure.ac (o configure.in, lo que sea) agregué las siguientes líneas al final:

# Defines so we know where to look
privdatadir='${datadir}'/myprogram
AC_SUBST(privdatadir)

mapsdir='${privdatadir}'/maps
AC_SUBST(mapsdir)

En src / Makefile.am, se agregó lo siguiente:

AM_CXXFLAGS = -DMYPROGRAM_MAPSDIR=\"$(mapsdir)\"

En el código real de C ++, se utilizó lo siguiente:

const std::string file_directory (MYPROGRAM_MAPSDIR); // Defined in Makefile.am

Una vez más, gracias Jonathan por mostrarme dónde buscar, pero quería publicar la respuesta completa para la posteridad.

Otros consejos

Puede construir las cadenas en su ejecutable para las diversas ubicaciones autoconfiguradas en las que puede que desee buscar. Esto es más o menos lo que hacen los programas como GCC.

Por ejemplo, GCC 4.3.3 en mi máquina se compiló en / work5 / tmp y se configuró para la instalación en /usr/gcc/v4.3.3, y contiene (entre muchas otras) las cadenas:

/usr/ccs/bin/
/usr/ccs/lib/
/usr/gcc/v4.3.3
/usr/gcc/v4.3.3/bin/
/usr/gcc/v4.3.3/lib
/usr/gcc/v4.3.3/lib/gcc/
/usr/gcc/v4.3.3/libexec/gcc/
/usr/gcc/v4.3.3/share/locale
/usr/gnu/include
/usr/include
/usr/include/iso
/usr/include/sys
/usr/lib/
/usr/lib/ld.so.1
/usr/libexec/gcc/
/usr/local/share/bison
/usr/tmp
/var/tmp
/var/tmp/
/work5/tmp/gcc-4.3.3-obj/./prev-gcc/include
/work5/tmp/gcc-4.3.3-obj/gcc
/work5/tmp/gcc-4.3.3-obj/intl
/work5/tmp/gcc-4.3.3-obj/libiberty
/work5/tmp/gcc-4.3.3-obj/sparc-sun-solaris2.10/libgcc

Un comentario dice: "¿Eso es lo que estoy tratando de averiguar cómo hacer?"

Hay numerosas formas. Parte de la respuesta es saber qué nombres necesita. Si observa la salida de configuración automática, hay nombres como prefixdir y pkglibdir en el archivo MAKE. Puede agregarlos a las líneas del compilador de C:

DFLAG1 = -DPKGLIBDIR='"$(pkglibdir)"'

y agregue DFLAG1 a sus CFLAGS. Repita hasta la saciedad ...

El código dentro de su programa puede hacer cosas como:

static const char *libdirs_to_search[] =
{
    ...
#ifdef PKGLIBDIR
    PKGLIBDIR,
#endif /* PKGLIBDIR */
};

Una forma más limpia de hacerlo es modificar el archivo config.h generado y el código de configuración para que los directorios que le interesan se definan en el archivo config.h, en lugar de en el archivo MAKE.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top