web-dev-qa-db-fra.com

makefiles CFLAGS

Dans le processus d'apprentissage des tinyos, j'ai découvert que je ne sais absolument rien des makefiles.

Il existe de nombreuses fonctionnalités de compilation en option qui peuvent être utilisées pour déclarer des variables de préprocesseur.

Pour les utiliser, vous devez faire des choses comme:

CFLAGS="-DPACKET_LINK" ceci active une certaine fonctionnalité.

et

CFLAGS="-DPACKET_LINK" "-DLOW_POWER" active deux fonctionnalités.

Quelqu'un peut-il disséquer ces lignes pour moi et me dire ce qui se passe? Pas en termes de tinyos, mais en termes de makefiles!

21
Michael

CFLAGS est une variable qui est le plus souvent utilisée pour ajouter des arguments au compilateur. Dans ce cas, il définit des macros.

Ainsi, -DPACKET_LINK Équivaut à placer #define PACKET_LINK 1 En haut de tous les fichiers .c et .h de votre projet. Très probablement, vous avez du code dans votre projet qui regarde si ces macros sont définies et fait quelque chose en fonction de cela:

#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 vous regardez plus loin dans votre makefile, vous devriez voir que $(CFLAGS) est probablement utilisé comme:

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

Quelque part dans le makefile, le CFLAG sera utilisé dans la ligne de compilation comme ceci:
$(CC) $(CFLAGS) $(C_INCLUDES) $<

et éventuellement dans l'exécution sera traduit en:

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

Cette définition sera transmise au code source tel qu'il a été défini dans le fichier d'en-tête

8
Ilya

L'option -D définit les variables du pré-processeur, donc dans votre cas, tout le code qui se trouve dans les blocs "#ifdef/#endif" spécifiés sera compilé.

C'est à dire.

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

Le CFLAGS est une variable utilisée dans le makefile qui sera développée à son contenu lorsque le compilateur sera invoqué.

Par exemple.

gcc $(CFLAGS) source.c
3
Jonas Gulle

-D signifie définir (en gcc) au moins, ce qui vous permet de # définir sur la ligne de commande au lieu d'un fichier quelque part. Une chose courante à voir serait -DDEBUG ou -DNDEBUG qui activent ou désactivent respectivement le code de débogage.

1
Flame

Juste pour être complet - si vous utilisez l'utilitaire nmake de Microsoft, vous ne verrez peut-être pas réellement la macro $ (CFLAGS) utilisée dans le makefile car nmake a des valeurs par défaut pour des choses comme la compilation de fichiers C/C++. Entre autres, les éléments suivants sont prédéfinis dans nmake (je ne sais pas si GNU Make fait quelque chose comme ça), donc vous ne le verrez peut-être pas dans un makefile de travail sous 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

J'ai trouvé que Ask Mr. Make est une excellente référence pour les astuces Makefile

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

0
Michael McCarty