it-swarm-es.tech

makefiles CFLAGS

En el proceso de aprendizaje de los tinyos, descubrí que no tengo ni idea de los makefiles.

Hay muchas características opcionales de tiempo de compilación que se pueden usar al declarar las variables del preprocesador.

Para usarlos tienes que hacer cosas como:

CFLAGS="-DPACKET_LINK" esto habilita una determinada característica.

y

CFLAGS="-DPACKET_LINK" "-DLOW_POWER" habilita dos funciones.

¿Alguien puede diseccionar estas líneas por mí y decirme qué está pasando? ¡No en términos de tinyos, sino en términos de makefiles!

20
Michael

CFLAGS es una variable que se usa más comúnmente para agregar argumentos al compilador. En este caso, define macros.

Entonces, -DPACKET_LINK Es el equivalente a poner #define PACKET_LINK 1 En la parte superior de todos los archivos .c y .h de su proyecto. Lo más probable es que tenga un código dentro de su proyecto que se ve si estas macros están definidas y hace algo dependiendo de eso:

#ifdef PACKET_LINK
// This code will be ignored if PACKET_LINK is not defined
do_packet_link_stuff();
#endif

#ifdef LOW_POWER
// This code will be ignored if LOW_POWER is not defined    
handle_powersaving_functions();
#endif

Si mira más abajo en su archivo MAKE, debería ver que $(CFLAGS) probablemente se usa como:

$(CC) $(CFLAGS) ...some-more-arguments...
23
Isak Savo

En algún lugar del archivo MAKE, el CFLAG se usará en una línea de compilación como esta:
$(CC) $(CFLAGS) $(C_INCLUDES) $<

y eventualmente en la ejecución se traducirá a:

gcc -DPACKET_LINK -DLOW_POWER -c filename.c -o filename.o

Esta definición se pasará al código fuente como se definió en el archivo de encabezado

8
Ilya

La opción -D establece variables de preprocesador, por lo que en su caso, se compilará todo el código que se encuentra en los bloques especificados "#ifdef/#endif".

Es decir.

#ifdef PACKET_LINK
/* whatever code here */
#endif

El CFLAGS es una variable utilizada en el archivo MAKE que se expandirá a su contenido cuando se invoque el compilador.

P.ej.

gcc $(CFLAGS) source.c
2
Jonas Gulle

-D significa definir (en gcc) al menos, lo que le permite #definir en la línea de comando en lugar de un archivo en alguna parte. Una cosa común para ver sería -DDEBUG o -DNDEBUG que activan o desactivan respectivamente el código de depuración.

1
Flame

Solo para completar esto: si está utilizando la utilidad nmake de Microsoft, es posible que no vea la macro $ (CFLAGS) utilizada en el archivo MAKE porque nmake tiene algunos valores predeterminados para cosas como compilar archivos C/C++. Entre otros, los siguientes están predefinidos en nmake (no estoy seguro de si GNU Make hace algo así), por lo que es posible que no lo vea en un archivo MAKE que funciona en Windows:

.c.exe:
    commands:          $(CC) $(CFLAGS) $<

.c.obj:
    commands:          $(CC) $(CFLAGS) /c $<

.cpp.exe:
    commands:          $(CXX) $(CXXFLAGS) $<

.cpp.obj:
    commands:          $(CXX) $(CXXFLAGS) /c $<
1
Michael Burr

He descubierto que Ask Mr. Make es una gran referencia para los consejos de Makefile

http://www.cmcrossroads.com/content/category/8/147/268/

0
Michael McCarty