Contiki-NG構(gòu)建系統(tǒng)旨在為方便地各種硬件平臺(tái)構(gòu)建完整的系統(tǒng)映像,編譯生成二進(jìn)制文件同時(shí)包含應(yīng)用程序代碼和Contiki-NG操作系統(tǒng)代碼。
一個(gè)簡單的示例項(xiàng)目Makefile可以在examples/hello-world/中找到:
CONTIKI_PROJECT = hello-world
all: $(CONTIKI_PROJECT)
CONTIKI = ../..
include $(CONTIKI)/Makefile.include
定義項(xiàng)目名稱和Contiki-NG路徑后,將簡單地包含公共makefile。 通過從該目錄運(yùn)行make hello-world系統(tǒng)將針對(duì)默認(rèn)目標(biāo):本機(jī)(原生)構(gòu)建。 本機(jī)目標(biāo)是一個(gè)特殊的平臺(tái),該平臺(tái)將Contiki-NG構(gòu)建為能夠在開發(fā)系統(tǒng)(例如Linux)上運(yùn)行的程序。 編譯后只需運(yùn)行文件hello-world.native即可。
要為其他平臺(tái)編譯hello-world應(yīng)用程序,請(qǐng)使用標(biāo)志TARGET,例如 與TARGET = zoul。 在某些平臺(tái)上,需要額外的BOARD來進(jìn)一步指定目標(biāo)。
建立系統(tǒng)的輸出結(jié)構(gòu)
生成系統(tǒng)將生成許多文件,這些文件將放置在許多位置。 本指南使用hello-world示例作為用例,但所有其他示例的輸出將相同。
構(gòu)建系統(tǒng)將始終將最終的構(gòu)建輸出文件(固件)放在示例.目標(biāo)平臺(tái)。 這是用于編程設(shè)備(嵌入式目標(biāo))或執(zhí)行(本機(jī)平臺(tái))的固件。 對(duì)于hello-world示例,這將稱為hello-world.$(TARGET)(例如hello-world.native或hello-world.zoul。
生成系統(tǒng)還將生成一個(gè)build/目錄,并在其中生成各個(gè)子目錄,并在其中放置中間文件。 邏輯如下:
- 一定會(huì)創(chuàng)建一個(gè)名為
build/$(TARGET)的目錄(例如build/native或build/zoul)。 - 如果平臺(tái)支持make變量
BOARD,那么還將在build/$(TARGET)下創(chuàng)建特定于板子的目錄。例如build/zoul/remote-reva或build/ srf06-cc26xx/launchpad/cc2650。 - 構(gòu)建示例時(shí),您可能希望在不同的配置之間切換。例如,您可能希望有一個(gè)用于調(diào)試和測試的構(gòu)建,以及一個(gè)單獨(dú)的用于部署的構(gòu)建。 Contiki-NG通過make變量
BUILD_DIR_CONFIG對(duì)此提供支持,您可以為您的不同構(gòu)建分配不同的值。如果確實(shí)選擇使用BUILD_DIR_CONFIG,則構(gòu)建系統(tǒng)將在build/(BOARD)]/
下創(chuàng)建另一個(gè)名為$(BUILD_DIR_CONFIG)/的子目錄。例如,如果運(yùn)行make BUILD_DIR_CONFIG = deploy,則為build/zoul/remote-reva/deploy`。 - 最后,將在
build/$(TARGET)/[$(BOARD)]/[$(BUILD_DIR_CONFIG)]下創(chuàng)建另一個(gè)名為obj的子目錄。例如build/srf06-cc26xx/launchpad/cc2650/debug/obj。
考慮到上述子目錄結(jié)構(gòu),構(gòu)建系統(tǒng)將輸出以下文件:
- 所有編譯輸出文件
(.o)和依賴文件(.d)將放置在obj/dir下。 - 所有鏈接和后期處理文件(例如
hello-world.elf、hello-world.hex、hello-world.bin)都將放置在build/$(TARGET)/[$(BOARD)]/[$(BUILD_DIR_CONFIG)]。 在同一目錄中,您通常還會(huì)歸檔一個(gè).map文件。 最后,該目錄還將始終托管hello-world.$(TARGET)文件的副本。
清除目標(biāo)(clean)
要清除以前構(gòu)建的目標(biāo),請(qǐng)使用:
-
clean:刪除TARGET的所有構(gòu)建輸出文件,包括整個(gè)build/$(TARGET)目錄。 當(dāng)前沒有辦法只清除為--特定BOARD--構(gòu)建的文件。 -
distclean:清除所有Contiki-NG目標(biāo)的--所有構(gòu)建輸出文件--,并刪除整個(gè)build/目錄。 它基本上為所有支持Contiki-NG的平臺(tái)調(diào)用make TARGET = xyz clean,一旦完成,它將強(qiáng)制刪除build/目錄。
更多操作
支持以下make目標(biāo):
-
viewconf:顯示重要的Make和C常量的值,用于檢查Contiki-NG配置 -
targets:顯示受支持的TARGET列表 -
board:顯示當(dāng)前TARGET支持的BOARD列表 -
savetarget:將當(dāng)前的TARGET和BOARD保存在Makefile.target下,以用于后續(xù)的make運(yùn)行 -
savedefines:保存當(dāng)前的DEFINES標(biāo)志以供后續(xù)運(yùn)行make -
%.o:從給定的源文件生成目標(biāo)文件 -
%.e:生成給定源文件的預(yù)處理版本 -
%.s:從給定的源文件生成一個(gè)程序集文件 -
%.ramprof:顯示給定固件的RAM配置文件 -
%.flashprof:顯示給定固件的Flash / ROM配置文件 -
login:查看連接到PORT的設(shè)備的串行輸出 -
serialview:與login相同,但是在串行輸出前加上unix時(shí)間戳 -
serialdump:與serialview相同,但還將輸出保存到文件中 -
motelist-all:打印已連接設(shè)備的列表 -
usage和help:顯示簡短的幫助
Makefiles的使用
Contiki-NG構(gòu)建系統(tǒng)由許多Makefile組成。 他們是:
-
Makefile:項(xiàng)目的makefile,位于項(xiàng)目目錄中。 這個(gè)Makefile可以定義MODULES變量,即應(yīng)包含的模塊列表。 它還可以配置Contiki-NG網(wǎng)絡(luò)堆棧(請(qǐng)參閱doc:configuration)以及任何其他標(biāo)準(zhǔn)的Makefile規(guī)則和標(biāo)志。 - 頂級(jí)Makefile,位于Contiki-NG的源代碼樹的根目錄中:
-
Makefile.include:系統(tǒng)范圍內(nèi)的makefile。 運(yùn)行make時(shí),Makefile.include包括Makefile.$(TARGET)以及MODULES列表中模塊的所有makefile(由項(xiàng)目的Makefile指定)。 -
Makefile.help:包含幫助和使用目標(biāo)的定義。 -
Makefile.tools:一些內(nèi)部版本依賴于工具目錄下的實(shí)用程序。 這個(gè)Makefile確保在需要時(shí)可以構(gòu)建那些依賴關(guān)系。 -
Makefile.embedded:包含適用于Contiki-NG所有嵌入式平臺(tái)的其他Makefile邏輯,也就是除native和cooja之外的所有平臺(tái)。 -
Makefile.identify-target:此Makefile可用于識(shí)別用于特定構(gòu)建的所選TARGET。 它可以包含在示例Makefile中,這些文件需要根據(jù)TARGETmake變量的值進(jìn)行決策。
-
-
Makefile.$(TARGET)(其中$(TARGET)是平臺(tái)的名稱):特定平臺(tái)的規(guī)則,位于arch/platform的子目錄中。它包含平臺(tái)添加到Contiki-NG系統(tǒng)的C文件列表(CONTIKI_TARGET_SOURCEFILES)。Makefile.$(TARGET)還包括來自arch/cpu/$(CPU)/目錄的Makefile.$(CPU)。 -
Makefile.$(CPU)(其中$(CPU)是CPU/MCU的名稱):CPU體系結(jié)構(gòu)的規(guī)則,位于arch/cpu/中CPU體系結(jié)構(gòu)的子目錄中。 -
Makefile.$(MODULE)(其中$(MODULE)是os目錄中模塊的名稱):可選的,特定于模塊的Makefile規(guī)則。