Contiki-NG构建系统旨在为方便地各种硬件平台构建完整的系统映像,编译生成二进制文件同时包含应用程序代码和Contiki-NG操作系统代码。
一个简单的示例项目Makefile可以在examples/hello-world/中找到:
CONTIKI_PROJECT = hello-world
all: $(CONTIKI_PROJECT)
CONTIKI = ../..
include $(CONTIKI)/Makefile.include
定义项目名称和Contiki-NG路径后,将简单地包含公共makefile。 通过从该目录运行make hello-world系统将针对默认目标:本机(原生)构建。 本机目标是一个特殊的平台,该平台将Contiki-NG构建为能够在开发系统(例如Linux)上运行的程序。 编译后只需运行文件hello-world.native即可。
要为其他平台编译hello-world应用程序,请使用标志TARGET,例如 与TARGET = zoul。 在某些平台上,需要额外的BOARD来进一步指定目标。
建立系统的输出结构
生成系统将生成许多文件,这些文件将放置在许多位置。 本指南使用hello-world示例作为用例,但所有其他示例的输出将相同。
构建系统将始终将最终的构建输出文件(固件)放在示例.目标平台。 这是用于编程设备(嵌入式目标)或执行(本机平台)的固件。 对于hello-world示例,这将称为hello-world.$(TARGET)(例如hello-world.native或hello-world.zoul。
生成系统还将生成一个build/目录,并在其中生成各个子目录,并在其中放置中间文件。 逻辑如下:
- 一定会创建一个名为
build/$(TARGET)的目录(例如build/native或build/zoul)。 - 如果平台支持make变量
BOARD,那么还将在build/$(TARGET)下创建特定于板子的目录。例如build/zoul/remote-reva或build/ srf06-cc26xx/launchpad/cc2650。 - 构建示例时,您可能希望在不同的配置之间切换。例如,您可能希望有一个用于调试和测试的构建,以及一个单独的用于部署的构建。 Contiki-NG通过make变量
BUILD_DIR_CONFIG对此提供支持,您可以为您的不同构建分配不同的值。如果确实选择使用BUILD_DIR_CONFIG,则构建系统将在build/(BOARD)]/
下创建另一个名为$(BUILD_DIR_CONFIG)/的子目录。例如,如果运行make BUILD_DIR_CONFIG = deploy,则为build/zoul/remote-reva/deploy`。 - 最后,将在
build/$(TARGET)/[$(BOARD)]/[$(BUILD_DIR_CONFIG)]下创建另一个名为obj的子目录。例如build/srf06-cc26xx/launchpad/cc2650/debug/obj。
考虑到上述子目录结构,构建系统将输出以下文件:
- 所有编译输出文件
(.o)和依赖文件(.d)将放置在obj/dir下。 - 所有链接和后期处理文件(例如
hello-world.elf、hello-world.hex、hello-world.bin)都将放置在build/$(TARGET)/[$(BOARD)]/[$(BUILD_DIR_CONFIG)]。 在同一目录中,您通常还会归档一个.map文件。 最后,该目录还将始终托管hello-world.$(TARGET)文件的副本。
清除目标(clean)
要清除以前构建的目标,请使用:
-
clean:删除TARGET的所有构建输出文件,包括整个build/$(TARGET)目录。 当前没有办法只清除为--特定BOARD--构建的文件。 -
distclean:清除所有Contiki-NG目标的--所有构建输出文件--,并删除整个build/目录。 它基本上为所有支持Contiki-NG的平台调用make TARGET = xyz clean,一旦完成,它将强制删除build/目录。
更多操作
支持以下make目标:
-
viewconf:显示重要的Make和C常量的值,用于检查Contiki-NG配置 -
targets:显示受支持的TARGET列表 -
board:显示当前TARGET支持的BOARD列表 -
savetarget:将当前的TARGET和BOARD保存在Makefile.target下,以用于后续的make运行 -
savedefines:保存当前的DEFINES标志以供后续运行make -
%.o:从给定的源文件生成目标文件 -
%.e:生成给定源文件的预处理版本 -
%.s:从给定的源文件生成一个程序集文件 -
%.ramprof:显示给定固件的RAM配置文件 -
%.flashprof:显示给定固件的Flash / ROM配置文件 -
login:查看连接到PORT的设备的串行输出 -
serialview:与login相同,但是在串行输出前加上unix时间戳 -
serialdump:与serialview相同,但还将输出保存到文件中 -
motelist-all:打印已连接设备的列表 -
usage和help:显示简短的帮助
Makefiles的使用
Contiki-NG构建系统由许多Makefile组成。 他们是:
-
Makefile:项目的makefile,位于项目目录中。 这个Makefile可以定义MODULES变量,即应包含的模块列表。 它还可以配置Contiki-NG网络堆栈(请参阅doc:configuration)以及任何其他标准的Makefile规则和标志。 - 顶级Makefile,位于Contiki-NG的源代码树的根目录中:
-
Makefile.include:系统范围内的makefile。 运行make时,Makefile.include包括Makefile.$(TARGET)以及MODULES列表中模块的所有makefile(由项目的Makefile指定)。 -
Makefile.help:包含帮助和使用目标的定义。 -
Makefile.tools:一些内部版本依赖于工具目录下的实用程序。 这个Makefile确保在需要时可以构建那些依赖关系。 -
Makefile.embedded:包含适用于Contiki-NG所有嵌入式平台的其他Makefile逻辑,也就是除native和cooja之外的所有平台。 -
Makefile.identify-target:此Makefile可用于识别用于特定构建的所选TARGET。 它可以包含在示例Makefile中,这些文件需要根据TARGETmake变量的值进行决策。
-
-
Makefile.$(TARGET)(其中$(TARGET)是平台的名称):特定平台的规则,位于arch/platform的子目录中。它包含平台添加到Contiki-NG系统的C文件列表(CONTIKI_TARGET_SOURCEFILES)。Makefile.$(TARGET)还包括来自arch/cpu/$(CPU)/目录的Makefile.$(CPU)。 -
Makefile.$(CPU)(其中$(CPU)是CPU/MCU的名称):CPU体系结构的规则,位于arch/cpu/中CPU体系结构的子目录中。 -
Makefile.$(MODULE)(其中$(MODULE)是os目录中模块的名称):可选的,特定于模块的Makefile规则。