it-swarm-pt.tech

makefiles CFLAGS

No processo de aprender tinyos, descobri que sou totalmente ignorante sobre makefiles.

Existem muitos recursos opcionais de tempo de compilação que podem ser usados ​​por meio da declaração de variáveis ​​do pré-processador.

Para usá-los, você precisa fazer coisas como:

CFLAGS="-DPACKET_LINK" isso ativa um determinado recurso.

e

CFLAGS="-DPACKET_LINK" "-DLOW_POWER" ativa dois recursos.

Alguém pode dissecar essas linhas para mim e me dizer o que está acontecendo? Não em termos de tinyos, mas em termos de makefiles!

21
Michael

CFLAGS é uma variável mais comumente usada para adicionar argumentos ao compilador. Nesse caso, define macros.

Portanto, o -DPACKET_LINK É o equivalente a colocar #define PACKET_LINK 1 No topo de todos os arquivos .c e .h no seu projeto. Provavelmente, você tem um código dentro do seu projeto que verifica se essas macros estão definidas e faz algo dependendo disso:

#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

Se você olhar mais abaixo em seu makefile, verá que $(CFLAGS) provavelmente é usado como:

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

Em algum lugar do makefile o CFLAG será usado na linha de compilação como esta:
$(CC) $(CFLAGS) $(C_INCLUDES) $<

e, eventualmente, a execução será traduzida para:

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

Essa definição será passada para o código-fonte como foi definido no arquivo de cabeçalho

8
Ilya

A opção -D define variáveis ​​de pré-processador, portanto, no seu caso, todo o código que está nos blocos "#ifdef/#endif" especificados será compilado.

I.e.

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

O CFLAGS é uma variável usada no makefile que será expandida para seu conteúdo quando o compilador for chamado.

Por exemplo.

gcc $(CFLAGS) source.c
3
Jonas Gulle

-D significa define (no gcc) pelo menos, o que permite # definir na linha de comando em vez de um arquivo em algum lugar. Uma coisa comum a ver seria -DDEBUG ou -DNDEBUG, que ativam ou desativam respectivamente o código de depuração.

1
Flame

Apenas para completar, se você estiver usando o utilitário nmake da Microsoft, talvez não veja a macro $ (CFLAGS) usada no makefile porque o nmake possui alguns padrões para coisas como compilar arquivos C/C++. Entre outros, os seguintes são predefinidos no nmake (não tenho certeza se o GNU Make faz algo parecido com isto)), portanto você pode não vê-lo em um makefile em funcionamento no 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

Descobri que o Ask Mr. Make é uma ótima referência para dicas do Makefile

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

0
Michael McCarty