1. 適用範圍
本文檔適用於RealEvo IDE開發環境下的應用工程的自定義。
2. RealEvo IDE編譯框架
2.1 Makefile文件與框架
RealEvo IDE開發環境下使用的Makefile文件包含常規的Makefile和mk文件。Makefile一般用來指定整個工程的總體編譯規則,而mk文件主要描述工程下常規的需要生產的目標的編譯規則等。
整個RealEvo IDE開發環境的編譯框架主要是在BASE工程中定義的,主要存在於{$BASE}/libsylixos/mktemp路徑下。主要有如表 21所示幾個mk文件,分別對應幾種工程的編譯規則。
表 21 Makefile框架文件
Makefile | 備註 |
application.mk | SylixOS APP工程對應的規則框架 |
arch.mk | 存放arch相關的編譯變量 |
bsp.mk | SylixOS BSP工程對應的規則框架 |
clear-vars.mk | 清除配置變量 |
common.mk | 編譯框架通用部分 |
dummy.mk | 空框架 |
end.mk | 編譯框架尾部 |
extension.mk | SylixOS lite extension工程對應的規則框架 |
header.mk | 編譯框架頭部 |
kernel-library.mk | SylixOS Kernel Static Lib工程對應的規則框架 |
kernel-module.mk | SylixOS Kernel module工程對應的規則框架 |
library.mk | SylixOS Share Lib工程對應的規則框架 |
libsylixos.mk | 內核編譯規則框架 |
lite-bsp.mk | SylixOS lite BSP工程對應的規則框架 |
static-library.mk | 靜態庫工程對應的規則框架 |
unit-test.mk | SylixOS Unit Test工程對應的規則框架 |
2.2 APP工程編譯框架
SylixOS APP工程的路徑如圖 21所示。
圖 21 SylixOS APP工程目錄
其中config.mk主要提供了兩個編譯變量,分別是SYLIXOS_BASE_PATH和DEBUG_LEVEL,主要對應APP工程選擇的BASE工程路徑和Debug等級,在非專家模式下由APP工程的Properties->SylixOS Project->Base Setting中的選項控制,如圖 22所示。
圖 22 config.mk內容對應的IDE選項
Makefile則指定了相關工程的具體編譯框架,引用config.mk中的配置信息變量,指定工程編譯的框架文件路徑即2.1章介紹的文件存放路徑,引用其中的header.mk,end.mk還有對應工程的Makefile(e.g SylixOS_APP.mk),如所示。
圖 23 Makefile引用部分
SylixOS_APP.mk是該工程的編譯目標Makefile,指定了編譯生成的目標、編譯使用的源文件、編譯需要的頭文件路徑、編譯依賴的庫、以及一些其他的編譯選項配置,在非專家模式下由APP工程的Properties->SylixOS Project->Compiler Setting和Properties->SylixOS Project->Linker Setting中的選項控制,如圖 24和圖 25所示。
圖 24 Compiler Setting選項卡
圖 25 Linker Setting選項卡
2.3 Share Lib工程編譯框架
Share Lib工程與APP工程基本一致,唯一不同的是,APP工程的編譯目標Makefile引用了application.mk,而Share Lib工程的編譯目標Makefile引用的是library.mk。
3. 專家模式
在對應工程的Properties->SylixOS Project->Base Setting下勾選Custom Makefile configuration並確認後就進入了Makefile的專家配置模式,如圖 31所示。在該模式下IDE不會自動添加新加入的源碼文件,對一些工程配置修改也不會直接寫入對應的Makefile,全部需要人工的去修改調節,所以對SylixOS工程不熟悉的開發者不建議打開該選項。
圖 31 開啓專家模式
3.1 混合工程的建立與Makefile的修改
在開發過程中往往會遇到一個工程會有很多應用程序和共享庫的情況,最簡單的方法是將這些應用和庫拆分成獨立的工程,但這樣工程難於管理,特別是遇到移植三方件的時候,工程管理尤爲重要,所以需要建立多應用與多共享庫工程。
拿OpenDDS的工程來說明,OpenDDS工程是一個典型的混合工程,有多個共享庫和部分應用程序,其中庫之間的依賴也相當複雜。OpenDDS的SylixOS工程如圖 32所示,其中源碼與頭文件均按照其在Linux下的工程路徑存放,方便編譯時的源碼文件的依賴正確。
圖 32 OpenDDS工程
由於對應工程的專家模式已經打開,IDE界面上設置選項已經全部失效,所以相關配置需要人工寫入。
混合工程的核心是多目標編譯,這裏遵循了RealEvo IDE的編譯框架,通過添加多個編譯目標Makefile並在工程通用Makefile下引用這些編譯目標Makefile來實現多目標編譯,這裏需要注意這些編譯目標Makefile的引用順序會對應編譯順序,需要按照依賴關係排序如圖 33所示。
圖 33 通用Makefile引用編譯目標Makefile
在對應編譯目標Makefile中需要修改一下幾個宏,以及最後需要引用的編譯目標類型。
l LOCAL_TARGET_NAME
l LOCAL_SRCS
l LOCAL_INC_PATH
l LOCAL_CXXFLAGS
l OCAL_DEPEND_LIB
l LOCAL_DEPEND_LIB_PATH
用OpenDDS_Rtps.mk來舉例。
OpenDDS_Rtps.mk是針對libOpenDDS_Rtps.so這個共享庫的Makefile,所以LOCAL_TARGET_NAME就需要指定爲libOpenDDS_Rtps.so,如圖 34所示。
圖 34 LOCAL_TARGET_NAME配置
修改LOCAL_SRCS爲對應需要編譯的源文件,如圖 35所示,注意對應的源文件需要連帶路徑。
圖 35 LOCAL_SRCS配置
修改LOCAL_INC_PATH爲需要包含頭文件的路徑,修改LOCAL_CXXFLAGS爲對應的編譯選項,修改LOCAL_DEPEND_LIB爲需要依賴的庫,修改LOCAL_DEPEND_LIB_PATH爲依賴庫所在的路徑。如圖 36所示。
圖 36 其他相關配置選項
LOCAL_USE_CXX和LOCAL_USE_CXX_EXCEPT這兩個選項對應的是啓用C++工程和啓用C++ except,由於這是C++庫,所以都選擇打開,如圖 37所示。
圖 37 C++工程相關配置
最後因爲是庫工程所以需要選擇引用library.mk,如圖 38所示。
圖 38 引用library.mk
如果這是一個應用程序工程,則引用application.mk即可,如圖 39所示。
圖 39 引用application.mk