Pregunta

Una parte del programa de nuestro grupo de investigación tiene funcionalidad auxiliar mediante ctemplate biblioteca . En nuestro grupo de fecha, no podemos construir el software debido a la compilación, así que me gustaría separar esta funcionalidad y controlar si se incluye o no a través de una bandera configure, como --disable-ctemplate.

El software, escrito en C ++, utiliza los Autotools construir sistema de ninguno de los cuales tengo mucha experiencia con. Mi opinión es que para llevar a cabo esta tarea, tengo que hacer lo siguiente:

  1. Añadir una nueva bandera para el script de configuración mediante la creación de una nueva entrada en AC_ARG_ENABLE configure.ac.

  2. Agregue un poco de #ifdef (o posiblemente #ifndef) declaraciones en torno al código que utiliza la biblioteca ctemplate, y alrededor de cualquier código que llama a ese código.

Creo que el primer paso sería algo como esto:

AC_ARG_ENABLE(ctemplate,
[  --disable-ctemplate    Disable HTML output],
[case "${enableval}" in
  yes) ctemplate=false ;;
  no)  ctemplate=true ;;
  *) AC_MSG_ERROR(bad value ${enableval} for --disable-ctemplate) ;;
esac],[ctemplate=true])
AM_CONDITIONAL(NOCTEMPLATE, test x$ctemplate = xfalse)

aunque no sé si la lógica es correcta, ya que me he adaptado este ejemplo a partir de ejemplos que se utilizan en lugar de --enable-FLAG --disable-FLAG.

En el segundo paso, voy a envolver en secciones banderas preprocesador como

#ifndef NOCTEMPLATE
void Class::MethodUsingCtemplate(...)
{
    ...
}
#endif

Que este "alambre hacia arriba" correctamente todo si lo hiciera configure --disable-ctemplate?

Además, se esta asegurarse de que el programa no entra en la biblioteca ctemplate para la compilación? Si no, entonces todo esto es por nada; es imperativo que puedo evitar que la compilación de la biblioteca ctemplate y componentes dependientes.

Voy a reiterar que estoy familiarizado con ambos C ++ y Autotools; Me he dado un primer acercamiento muy ingenua en la solución de este problema. Si usted tiene experiencia en esta área, realmente apreciaría sus correcciones y explicaciones que podría ofrecer.

¿Fue útil?

Solución

Esta es la solución que he creado después de leer a través de documentación, tutoriales, ayuda a las discusiones, listas de correo, etc., y simplemente probar cosas hasta que trabajaron Podría explicar por qué funcionaban.

En configure.ac, puse las siguientes líneas de código

# This adds the option of compiling without using the ctemplate library,
# which has proved troublesome for compilation on some platforms
AC_ARG_ENABLE(ctemplate,
  [ --disable-ctemplate   Disable compilation with ctemplate and HTML output],
  [case "${enableval}" in
     yes | no ) WITH_CTEMPLATE="${enableval}" ;;
     *) AC_MSG_ERROR(bad value ${enableval} for --disable-ctemplate) ;;
   esac],
  [WITH_CTEMPLATE="yes"]
)

dnl Make sure we register this option with Automake, so we know whether to
dnl descend into ctemplate for more configuration or not
AM_CONDITIONAL([WITH_CTEMPLATE], [test "x$WITH_CTEMPLATE" = "xyes"])

# Define CTEMPLATE in config.h if we're going to compile against it
if test "x$WITH_CTEMPLATE" = "xyes"; then
    AC_DEFINE([CTEMPLATE], [], ["build using ctemplate library"])
    AC_MSG_NOTICE([ctemplate will be used, HTML output enabled])
else
    AC_MSG_NOTICE([ctemplate will not be used, HTML output disabled])
fi

En el siguiente paso, que cambió el Makefile.am en el nivel superior a lo siguiente:

if WITH_CTEMPLATE
  MAYBE_CTEMPLATE = ctemplate
endif

SUBDIRS = boost libgsl $(MAYBE_CTEMPLATE) libutil ...

En Makefile.ams de nivel inferior, añadí

if WITH_CTEMPLATE
    # some change to the configuration
else
    # some other change to the configuration
endif

Por último, tenía que asegurarse de que uno de los archivos de cabecera de C ++ clave (incluido por otras partes del código) tenía la siguiente:

#ifdef HAVE_CONFIG_H
#    include "config.h"
#endif

config.h contiene nuevas definiciones se crea con AC_DEFINE, por lo que este archivo debe ser incluido en las partes que comprueban si una definición de macro creado por esta ruta se define (o no definido).

Esto tuvo una gran cantidad de tiempo y empujar a través de la frustración de mi parte; Sólo puedo esperar que documenta esta explicación aquí ahorra otra persona del mismo destino.

Otros consejos

Usted está definitivamente en el camino correcto. Autotools puede parecer muy complicado al principio, pero una de las ventajas es que hay miles de proyectos que ya han hecho lo que quiere hacer. Todo lo que necesita hacer es encontrarlos.

Aquí hay un enlace a una búsqueda del código de Google para AC_ARG_DISABLE . Se vuelven locos.

Para evitar la acumulación de intentar compilar en el subdirectorio ctemplate, tendrá que hacer algo como:

if CTEMPLATE
SUBDIRS += ctemplate
endif

en Makefile.am

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