tutorial make clean makefile

clean - makefiles CFLAGS



gnu make tutorial (6)

En el proceso de aprendizaje de tinyos, he descubierto que no tengo ni idea de los makefiles.

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

Para usarlos tienes que hacer cosas como:

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

y

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

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


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


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

Entonces, el -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 busque 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 miras más abajo en tu archivo MAKE, deberías ver que $(CFLAGS) probablemente se use como:

$(CC) $(CFLAGS) ...some-more-arguments...



En alguna parte del archivo MAKE, 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 tal como se definió en el archivo de encabezado


La opción -D establece las variables del preprocesador, por lo que en su caso, se compilará todo el código que está 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 ampliará a su contenido cuando se invoca el compilador.

P.ej

gcc $(CFLAGS) source.c


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

.c.exe: commands: $(CC) $(CFLAGS) $< .c.obj: commands: $(CC) $(CFLAGS) /c $< .cpp.exe: commands: $(CXX) $(CXXFLAGS) $< .cpp.obj: commands: $(CXX) $(CXXFLAGS) /c $<