Tinyosを学習する過程で、makefileについてまったく無知であることがわかりました。
プリプロセッサー変数を宣言するために使用できる、多くのオプションのコンパイル時機能があります。
それらを使用するには、次のようなことを行う必要があります。
CFLAGS="-DPACKET_LINK"
これは特定の機能を有効にします。
そして
CFLAGS="-DPACKET_LINK" "-DLOW_POWER"
は2つの機能を有効にします。
誰かが私のためにこれらの行を分析して、何が起こっているのか教えてくれますか? tinyosの観点からではなく、makefileの観点から!
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...
_
Makefileのどこかで、CFLAGは次のようなコンパイル行で使用されます。$(CC) $(CFLAGS) $(C_INCLUDES) $<
そして最終的には実行時に次のように翻訳されます:
gcc -DPACKET_LINK -DLOW_POWER -c filename.c -o filename.o
この定義は、ヘッダーファイルで定義されたとおりにソースコードに渡されます。
-Dオプションはプリプロセッサ変数を設定するため、この場合、指定した「#ifdef/#endif」ブロック内にあるすべてのコードがコンパイルされます。
つまり.
#ifdef PACKET_LINK
/* whatever code here */
#endif
CFLAGSはmakefileで使用される変数で、コンパイラーが呼び出されたときにその内容に展開されます。
例えば。
gcc $(CFLAGS) source.c
-Dは、少なくともdefine(gcc)を表します。これにより、どこかでファイルの代わりにコマンドラインで#defineを実行できます。よくあることは、デバッグコードをそれぞれ有効または無効にする-DDEBUGまたは-DNDEBUGです。
これを完全にするために、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 $<
Make Mr. MakeはMakefileのヒントの優れたリファレンスであることがわかりました