web-dev-qa-db-ja.com

makefiles CFLAGS

Tinyosを学習する過程で、makefileについてまったく無知であることがわかりました。

プリプロセッサー変数を宣言するために使用できる、多くのオプションのコンパイル時機能があります。

それらを使用するには、次のようなことを行う必要があります。

CFLAGS="-DPACKET_LINK"これは特定の機能を有効にします。

そして

CFLAGS="-DPACKET_LINK" "-DLOW_POWER"は2つの機能を有効にします。

誰かが私のためにこれらの行を分析して、何が起こっているのか教えてくれますか? tinyosの観点からではなく、makefileの観点から!

21
Michael

CFLAGSは、コンパイラに引数を追加するために最もよく使用される変数です。この場合、マクロを定義します。

したがって、_-DPACKET_LINK_は、_#define PACKET_LINK 1_をプロジェクトのすべての.cおよび.hファイルの最上部に配置することと同じです。ほとんどの場合、これらのマクロが定義されているかどうかを調べ、それに応じて何かを行うコードがプロジェクト内にあります。

_#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
_

Makefileをさらに詳しく見ると、$(CFLAGS)がおそらく次のように使用されていることがわかります。

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

Makefileのどこかで、CFLAGは次のようなコンパイル行で使用されます。
$(CC) $(CFLAGS) $(C_INCLUDES) $<

そして最終的には実行時に次のように翻訳されます:

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

この定義は、ヘッダーファイルで定義されたとおりにソースコードに渡されます。

8
Ilya

-Dオプションはプリプロセッサ変数を設定するため、この場合、指定した「#ifdef/#endif」ブロック内にあるすべてのコードがコンパイルされます。

つまり.

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

CFLAGSはmakefileで使用される変数で、コンパイラーが呼び出されたときにその内容に展開されます。

例えば。

gcc $(CFLAGS) source.c
3
Jonas Gulle

-Dは、少なくともdefine(gcc)を表します。これにより、どこかでファイルの代わりにコマンドラインで#defineを実行できます。よくあることは、デバッグコードをそれぞれ有効または無効にする-DDEBUGまたは-DNDEBUGです。

1
Flame

これを完全にするために、Microsoftのnmakeユーティリティを使用している場合、nmakeにはC/C++ファイルのコンパイルなどのデフォルトがいくつかあるため、メイクファイルで$(CFLAGS)マクロが使用されていない場合があります。とりわけ、以下はnmakeで事前定義されています(GNU Makeがこのようなことを行うかどうかはわかりません)。そのため、Windowsで動作しているmakefileに表示されない場合があります。

.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

Make Mr. MakeはMakefileのヒントの優れたリファレンスであることがわかりました

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

0
Michael McCarty