在学习TinyOS的过程中,我发现我对 makefile 完全一无所知。
有许多可选的编译时特性可以通过声明预处理器变量来使用。
要使用它们,您必须执行以下操作:
CFLAGS="-DPACKET_LINK"
这启用了某个功能。
和
CFLAGS="-DPACKET_LINK" "-DLOW_POWER"
启用两个功能。
有人可以为我剖析这些线条并告诉我发生了什么吗?不是在 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”块中的所有代码。
IE
#ifdef PACKET_LINK
/* whatever code here */
#endif
CFLAGS 是在 makefile 中使用的一个变量,当编译器被调用时,它将被扩展为它的内容。
例如
gcc $(CFLAGS) source.c
-D至少代表定义(在 gcc 中),它可以让你在命令行上 #define 而不是某个地方的文件。常见的事情是 -DDEBUG 或 -DNDEBUG 分别激活或禁用调试代码。
仅出于完整性考虑 - 如果您使用 Microsoft 的 nmake 实用程序,您可能实际上看不到 makefile 中使用的 $(CFLAGS) 宏,因为 nmake 有一些默认值,例如编译 C/C++ 文件。其中,以下是在 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 $<