c autotools

Dónde agregar un CFLAG, como-std=gnu99, en un proyecto de autotools



(3)

Tengo un proyecto simple de Autotools C (no C ++).

Los CFLAG (por inspección) parecen ser -g -O2 .

Quiero que todos los archivos de -std=gnu99 generados también tengan -std=gnu99 añadido a los CFLAG, porque uso for (int i = 0; i < MAX; i++) y similares.

Obviamente puedo hackear el Makefile, pero esto se sobrescribe en ./configure .

¿Dónde está el lugar correcto para agregar (o cambiar) los CFLAG que requiere el código (a diferencia de aquellos CFLAG que el usuario podría querer cambiar)?

(Tenga en cuenta que esto es un duplicado parcial de Dónde agregar un CFLAG, como -std = gnu99, en un proyecto de autotools (Eclipse CDT) ya que estaba obteniendo respuestas específicas de Eclipse que no quería).

La respuesta de @DevSolar no ha ayudado todavía. Un archivo configure.ac (a continuación) genera el script de configure (también a continuación).

configure.ac:

dnl Process this file with autoconf to produce a configure script. CFLAGS="$CFLAGS -std=gnu99" AC_PREREQ(2.59) AC_INIT(tuntest, 1.0) AC_CANONICAL_SYSTEM AM_INIT_AUTOMAKE() AC_PROG_CC AC_CONFIG_FILES(Makefile src/Makefile) AC_OUTPUT

$ grep CFLAGS configure

CFLAGS CFLAGS To assign environment variables (e.g., CC, CFLAGS...), specify them as CFLAGS C compiler flags ac_compile=''$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'' ac_link=''$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'' ac_compile=''$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'' ac_link=''$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'' ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS CFLAGS="-g" CFLAGS="" CFLAGS="-g" if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS CFLAGS="-g -O2" CFLAGS="-g" CFLAGS="-O2" CFLAGS= ac_compile=''$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'' ac_link=''$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5''


Aunque el uso de una macro como AC_PROG_CC_STDC es preferible a agregar opciones de compilador a CFLAGS, autoconf actualmente no tiene macros que permitan el soporte del compilador C11; no hay AC_PROG_CC_C11 todavía, y AC_PROG_CC_STDC solo agrega la opción -std=gnu99 para gcc en lugar de o -std=c11 .

Puedes agregar banderas del compilador simplemente poniendo

CFLAGS+=" -std=c11"

En el configure.ac.

Alternativamente, podría ser mejor verificar primero si el compilador soporta la opción agregada, e imprimir una advertencia de lo contrario, indicando al usuario que agregue manualmente una opción equivalente a CFLAGS que funcione para su compilador:

AX_CHECK_COMPILE_FLAG([-std=c11], [AX_APPEND_FLAG([-std=c11])], [AC_MSG_WARN([-std=c11 not supported, you may have to set CFLAGS to enable C11 support.]) ])

Esto utiliza las macros AX_CHECK_COMPILE_FLAG y AX_APPEND_FLAG encuentran en el archivo GNU Autoconf . Para usarlos, colóquelos en un subdirectorio m4 y agregue AC_CONFIG_MACRO_DIR([m4]) a configure.ac


Este tema se trata en el manual de Automake, Ordenamiento de variables de bandera 27.6 . Existe una interacción entre configure.ac y Makefile.am , y es algo más que establecer una variable de shell conocida en reglas de creación implícitas.

En pocas palabras, deberías configurarlo en una nueva variable llamada algo como mumble_CFLAGS explica en el manual de Automake. mumble es solo el nombre de su programa, y ​​a menudo es foo o bar en otros ejemplos. Más adelante, cuando se cree su makefile, la receta para su programa ( mumble o foo o bar ) usará $(mumble_CFLAGS) $(CFLAGS) para construir el objetivo.

Aquí hay un ejemplo de cómo podría verse. En lugar de usar mumble o foo o bar , usa my_prog como nombre de artefacto.

configure.ac :

# Perform a compile test using -std=gnu99, set has_gnu99 if test "$has_gnu99" -eq "1"; then AC_SUBST([MY_GNU99], [-std=gnu99]) fi

Makefile.am :

bin_PROGRAMS = my_prog my_prog_CFLAGS = $(MY_GNU99) $(MY_ANOTHER_FLAG) $(MY_YET_ANOTHER_FLAG) ...

Más adelante, cuando se genere el makefile, tendrá una receta similar a la siguiente, donde $(MY_PROG_CFLAGS) se aplica a todos los objetos que construyen my_prog :

my_prog : $(CC) $(CPPFLAGS) $(MY_PROG_CFLAGS) $(CFLAGS) -c $< -o $@

Las my_prog_CFLAGS adicionales de my_prog_CFLAGS te permiten tener múltiples my_prog_CFLAGS para diferentes objetivos. Por ejemplo, podría tener un my_prog_CFLAGS , un my_archive_CFLAGS y un my_sharedobj_CFLAGS .

Y no se limita a my_prog_CFLAGS . También podría tener my_prog_CPPFLAGS , my_prog_CXXFLAGS y otras variables utilizadas implícitamente en makefiles.

Esto es del manual de Automake :

Compilar variables de bandera

Esta sección intenta responder a todas las preguntas anteriores. Discutiremos sobre todo CPPFLAGS en nuestros ejemplos, pero en realidad la respuesta es válida para todos los indicadores de compilación utilizados en Automake: CCASFLAGS, CFLAGS, CPPFLAGS, CXXFLAGS, FCFLAGS, FFLAGS, GCJFLAGSPasosJuzgamiento de las partes de la empresa. , y YFLAGS.

CPPFLAGS, AM_CPPFLAGS y mumble_CPPFLAGS son tres variables que se pueden usar para pasar indicadores al preprocesador de C (en realidad, estas variables también se usan para otros lenguajes como C ++ o Fortran preprocesado). CPPFLAGS es la variable de usuario (ver Variables de usuario), AM_CPPFLAGS es la variable Automake y mumble_CPPFLAGS es la variable específica del objetivo de mumble (llamamos a esto una variable por objetivo, consulte Variables de programa y biblioteca).

Automake siempre usa dos de estas variables cuando compila archivos de código fuente. Al compilar un archivo de objeto para el objetivo de mumble, la primera variable será mumble_CPPFLAGS si está definida, o AM_CPPFLAGS de lo contrario. La segunda variable es siempre CPPFLAGS.

En el siguiente ejemplo,

bin_PROGRAMS = foo bar foo_SOURCES = xyz.c bar_SOURCES = main.c foo_CPPFLAGS = -DFOO AM_CPPFLAGS = -DBAZ

xyz.o se compilará con ''$ (foo_CPPFLAGS) $ (CPPFLAGS)'', (porque xyz.o es parte del objetivo foo), mientras que main.o se compilará con ''$ (AM_CPPFLAGS) $ (CPPFLAGS)'' ( porque no hay una variable por objetivo para la barra de destino).

La diferencia entre mumble_CPPFLAGS y AM_CPPFLAGS es lo suficientemente clara, concentrémonos en CPPFLAGS. CPPFLAGS es una variable de usuario, es decir, una variable que los usuarios tienen derecho a modificar para compilar el paquete. Esta variable, como muchas otras, se documenta al final de la salida de ''configure --help''.

Por ejemplo, alguien que necesite agregar / home / my / usr / include a la ruta de búsqueda del compilador de C configurará un paquete con

./configure CPPFLAGS=''-I /home/my/usr/include''

y esta bandera se propagaría a las reglas de compilación de todos los Makefiles.


autoconf tiene una macro para esto:

Sólo hay que poner:

AC_PROG_CC_STDC

Después de tu AC_PROG_CC y todo estará bien.

Especialmente cuando usas otros compiladores que no tienen -std=gnu99 pero operan en modo C99 de manera predeterminada (o tienen una opción diferente como hpcc''s -AC99 a la mente).

NO usaría CFLAGS para ese tipo de cosas.

De la docs :

-- Macro: AC_PROG_CC_STDC If the C compiler cannot compile ISO Standard C (currently C99), try to add an option to output variable `CC'' to make it work. If the compiler does not support C99, fall back to supporting ANSI C89 (ISO C90). After calling this macro you can check whether the C compiler has been set to accept Standard C; if not, the shell variable `ac_cv_prog_cc_stdc'' is set to `no''.