RT-Thread 學(xué)習(xí)之 SCons 構(gòu)建工具(1)

什么是構(gòu)建工具

其實(shí)不知道什么是構(gòu)建工具也可以繼續(xù)學(xué)習(xí),既然我們想深入學(xué)習(xí),那就先了解一下什么是構(gòu)建工具。

構(gòu)建工具(software construction tool)是一種軟件,它可以根據(jù)一定的規(guī)則或命令,將源代碼編譯成可執(zhí)行的二進(jìn)制程序。這是構(gòu)建工具最基本也是最重要的功能。實(shí)際上構(gòu)建工具的功能不止于此,通常這些規(guī)則有一定的語(yǔ)法,并組織成文件。這些文件用來(lái)控制構(gòu)建工具的行為,在完成軟件構(gòu)建之外,也可以做其他事情。

看概念很清楚了,我們這可以理解構(gòu)建工具其實(shí)就是一種編譯器。

SCons 需要先安裝再使用,RT-Thread提供了一個(gè)Env配置工具,這個(gè)工具里就已經(jīng)帶有SCons和Python,因此在Windows平臺(tái)使用SCons并不需要安裝。

以下介紹的內(nèi)容都是在Env工具中Scons的使用。

SCons文件結(jié)構(gòu)

SCons 使用 SConscript 和 SConstruct 文件來(lái)組織源碼結(jié)構(gòu),通常來(lái)說(shuō)一個(gè)項(xiàng)目只有一 SConstruct,但是會(huì)有多個(gè) SConscript。一般情況下,每個(gè)存放有源代碼的子目錄下都會(huì)放置一個(gè) SConscript。

為了使 RT-Thread 更好的支持多種編譯器,以及方便的調(diào)整編譯參數(shù),RT-Thread 為每個(gè) BSP 單獨(dú)創(chuàng)建了一個(gè)名為 rtconfig.py 的文件。因此每一個(gè) RT-Thread BSP 目錄下都會(huì)存在下面三個(gè)文件:rtconfig.py、SConstruct 和 SConscript,它們控制 BSP 的編譯。一個(gè) BSP 中只有一個(gè) SConstruct 文件,但是卻會(huì)有多個(gè) SConscript 文件,可以說(shuō) SConscript 文件是組織源碼的主力軍。

RT-Thread 大部分源碼文件夾下也存在 SConscript 文件,這些文件會(huì)被 BSP 目錄下的 SConscript 文件 “找到” 從而將 rtconfig.h 中定義的宏對(duì)應(yīng)的源代碼加入到編譯器中來(lái)。

SCons的基本功能

1、編譯

在Env工具中直接輸入 scons?命令直接編譯BSP,默認(rèn)使用ARM GCC編譯器。

如果需要自己制定編譯器,可以在Env中輸入如下兩個(gè)命令來(lái)指定

set RTT_CC = keil

set RTT_EXEC = C:/Keilv5

scons命令

該命令不僅可以完成基本的編譯,還可以生成MDK/IAR/VS 工程,在后邊增加不同參數(shù)可以實(shí)現(xiàn)不同效果。

-s 參數(shù),不會(huì)打印具體的內(nèi)部命令。

-c 參數(shù),清除編譯目標(biāo),清除臨時(shí)文件和目標(biāo)文件。

--target=XXX 參數(shù),如果使用mdk/iar來(lái)進(jìn)行項(xiàng)目開(kāi)發(fā),當(dāng)修改了rtconfig.h打開(kāi)或者關(guān)閉某些組件時(shí),需要使用該參數(shù)來(lái)重新生成對(duì)應(yīng)的定制化工程。然后在mdk/iar中進(jìn)行編譯下載。

注意:要生成 MDK 或者 IAR 的工程文件,前提條件是 BSP 目錄存在一個(gè)工程模版文件,然后 scons 才會(huì)根據(jù)這份模版文件加入相關(guān)的源碼,頭文件搜索路徑,編譯參數(shù),鏈接參數(shù)等。而至于這個(gè)工程是針對(duì)哪顆芯片的,則直接由這份工程模版文件指定。所以大多數(shù)情況下,這個(gè)模版文件是一份空的工程文件,用于輔助 SCons 生成 project.uvprojx 或者 project.eww。

-jN 參數(shù),多線程編譯目標(biāo),在多核計(jì)算機(jī)上可以使用此命令加快編譯速度。一般來(lái)說(shuō)一顆 cpu 核心可以支持 2 個(gè)線程。雙核機(jī)器上使用 scons -j4 命令即可。

--dist參數(shù),搭建項(xiàng)目框架,使用此命令會(huì)在BSP目錄下生成dist目錄,這便是開(kāi)發(fā)項(xiàng)目的目錄結(jié)構(gòu),包含了RT-Thread源碼及BSP相關(guān)工程,不相關(guān)的BSP文件夾及l(fā)ibcpu都會(huì)被移除,并且可以隨意拷貝此工程到任何目錄下使用。

--verbose參數(shù),默認(rèn)情況下,使用 scons 命令編譯的輸出不會(huì)顯示編譯參數(shù),使用該參數(shù),會(huì)顯示編譯參數(shù)。

SCons 內(nèi)置函數(shù)

如果想要將自己的一些源代碼加入到 SCons 編譯環(huán)境中,一般可以創(chuàng)建或修改已有 SConscript 文件。

SConscript 文件可以控制源碼文件的加入,并且可以指定文件的 Group(與 MDK/IAR 等 IDE 中的 Group 的概念類似)。

SCons 提供了很多內(nèi)置函數(shù)可以幫助我們快速添加源碼程序,利用這些函數(shù),再配合一些簡(jiǎn)單的 Python 語(yǔ)句我們就能隨心所欲向項(xiàng)目中添加或者刪除源碼。下面將簡(jiǎn)單介紹一些常用函數(shù)。實(shí)際上每個(gè)SConscript文件就是一個(gè)python文件。

GetCurrentDir() 函數(shù),獲取當(dāng)前路徑。

Glob('*.c')函數(shù),獲取當(dāng)前目錄下所有C文件。修改參數(shù)中的后綴,可以匹配當(dāng)前目錄下的所有某類型的文件。

GetDepend(macro)函數(shù),該函數(shù)定義在 tools 目錄下的腳本文件中,它會(huì)從 rtconfig.h 文件讀取配置信息,其參數(shù)為 rtconfig.h 中的宏名。如果 rtconfig.h 打開(kāi)了某個(gè)宏,則這個(gè)方法(函數(shù))返回真,否則返回假。

Split(str)函數(shù),將字符串 str 分割成一個(gè)列表 list。

DefineGroup(name, src, depend,**parameters)函數(shù),這是 RT-Thread 基于 SCons 擴(kuò)展的一個(gè)方法(函數(shù))。DefineGroup 用于定義一個(gè)組件。組件可以是一個(gè)目錄(下的文件或子目錄),也是后續(xù)一些 IDE 工程文件中的一個(gè) Group 或文件夾。

參數(shù)說(shuō)明


parameters參數(shù)說(shuō)明

SConscript(dirs,variant_dir,duplicate)函數(shù),讀取新的 SConscript 文件。

參數(shù)說(shuō)明
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容