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中,这些文件需要根据TARGET
make变量的值进行决策。
-
-
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规则。