rtthread_scons简介
env工具基本構(gòu)成
打開ENV工具進(jìn)入具體工程目錄
C:\Users\Admin\Desktop\data\rt-thread\bsp\stm32\stm32f407-atk-explorer
menuconfig工作機(jī)制
Kconfig文件:
(目錄:C:\Users\Admin\Desktop\data\rt-thread\bsp\stm32\stm32f407-atk-explorer)
用戶退出交互界面并保存配置,menuconfig根據(jù)內(nèi)部數(shù)據(jù)庫內(nèi)容,生成新的.config文件。
.config文件:
將.config文件翻譯成c語言能夠識(shí)別的rtconfig.h文件,位于當(dāng)前工作目錄下。
通過上面的步驟,menuconfig根據(jù)用戶的配置,最終生成了rtconfig.h文件,用戶便可以直接引用rtconfig.h文件來使用系統(tǒng)宏。從下面截取的示例可以看到rtconfig.h文件和.config文件是一 一對應(yīng)的關(guān)系
rtconfig.h文件:
SCons基本命令
scons
編譯指令,根據(jù)scons腳本(SConstruct, SConscript)的配置,組織編譯代碼。scons命令必須在工程路徑下執(zhí)行,因?yàn)閟cons默認(rèn)會(huì)在當(dāng)前路徑下尋找SConstruct文件作為第一個(gè)解析的腳本。
scons支持增量編譯,對已經(jīng)編譯過的文件,且編譯后沒有進(jìn)行過修改,那scons不會(huì)重新編譯這些文件,從而達(dá)到提高編譯效率的目的。
scons --verbose
直接使用scons編譯時(shí),默認(rèn)是不會(huì)輸出編譯選項(xiàng)等信息的。使用scons --verbose進(jìn)行編譯時(shí),將會(huì)打印編譯器選項(xiàng)等輔助信息。
scons -c
清除上一次編譯的臨時(shí)文件。執(zhí)行該命令后,下一次編譯將能保證所有源文件都會(huì)被重新編譯。
scons --help
幫助命令,該命令會(huì)例舉出scons支持的所有操作選項(xiàng),包括原生scons自帶的選項(xiàng)與OneOS擴(kuò)展的操作選項(xiàng)。scons支持的操作選項(xiàng)很豐富,推薦讀者都去了解一下。
scons --ide=xxx
生成第三方IDE工程命令,其中“XXX”對應(yīng)想要生成的工程類型。具體支持的工程類型可以通過scons --help查看。舉例生成keil5工程的命令如下:
scons --ide=mdk5
需要注意的是,要生產(chǎn)指定的IDE工程文件,一般需要提供一個(gè)空的工程文件作為模版,用戶應(yīng)該在相應(yīng)的模版文件中配置好硬件相關(guān)的編譯選項(xiàng)。具體可以參考示例開發(fā)板的工程目錄中的文件。
SCons編譯構(gòu)造概述
Scons是構(gòu)造工具,通過讀取SConstruct/Sconstruct/sconstruct和SConscript腳本來組織管理源碼,并調(diào)用指定的編譯鏈接器來對源文件進(jìn)行編譯。
scons目前支持的編譯器包括 ARM GCC、MDK、IAR、VisualStudio、Visual DSP。對流行的ARM Cortex M0、M3、M4 等架構(gòu),一般都同時(shí)支持ARM GCC、MDK、IAR 等編譯器。用戶可以通過 project 目錄下的osconfig.py 里的 CROSS_TOOL 選項(xiàng)查看相關(guān)的編譯器配置。
使用SCons工具時(shí),會(huì)使用到SConstruct/Sconstruct/sconstruct和SConscript 2種類型的文件。這2種類型的文件是Scons工具必備的,是編譯的配置腳本文件,相當(dāng)于make中的makefile文件。
Scons將在當(dāng)前目錄下按SConstruct、Sconstruct、sconstruct次序來搜索配置文件,從讀取的第1個(gè)文件中讀取相關(guān)配置。
在配置文件SConstruct中,可以使用SConscript()函數(shù)來讀取附屬的配置文件。按慣例,這些附屬配置文件被命名為“SConscript”。
SCons的擴(kuò)展性
scons的配置文件都是基于python腳本語法的。因此可以在SConstruct文件中使用python語言很方便的調(diào)用自定義的python腳本與模塊。
同時(shí),scons自身也是python實(shí)現(xiàn)的,在自己的python腳本文件中通過添加語句:
from SCons.Script import *
可以很方便的直接使用scons內(nèi)置類與操作。正因?yàn)閟cons與python腳本可以方便的互相調(diào)用,我們可以對scons方便的進(jìn)行自定義與擴(kuò)展。
SCons常用函數(shù)
腳本涉及到的函數(shù)分為兩部分:標(biāo)準(zhǔn)函數(shù),自定義函數(shù)。
Import()、Export()函數(shù)
Import(vars)
導(dǎo)入其它腳本定義的變量
‘vars’變量名,變量名是字符串,可以是一個(gè)變量或一個(gè)變量列表
Export(vars)
導(dǎo)出變量,供其它腳本使用
‘vars’變量名,變量名是字符串,可以是一個(gè)變量或一個(gè)變量列表
SConscript()函數(shù)
SConscript(scripts, [exports, variant_dir, duplicate])
讀取一個(gè)或多個(gè)sconscript腳本,返回一個(gè)node列表,node是指一個(gè)編譯對象
‘scripts’:指定要加載的sconscript腳本名稱與路徑
‘exports’:可選參數(shù),導(dǎo)出一個(gè)變量,此變量比一般Export()導(dǎo)出的變量有更高優(yōu)先權(quán)
‘variant_dir’:可選參數(shù),指定一個(gè)目錄,編譯動(dòng)作都在該目錄中進(jìn)行,不影響源碼路徑
‘duplicate’:可選參數(shù),指定編譯目錄中是否拷貝源碼
PresentDir()函數(shù)
PresentDir()
獲取當(dāng)前腳本所在路徑
Glob()函數(shù)
Glob(pattern)
返回滿足pattern指定條件的Node(編譯對象)
‘pattern’:指定匹配條件,支持unix shell的通配符替換。支持當(dāng)前腳本所在路徑進(jìn)行相對路徑索引
IsDefined()函數(shù)
IsDefined(depend)
判斷依賴的宏或宏列表是否被定義,被定義返回True,如果存在未被定義的宏返回False
‘depend’:指定依賴的宏,或宏列表
DeleteSrcFile()函數(shù)
DeleteSrcFile(src, remove)
將指定的文件從編譯列表中移除
‘src’:編譯node列表
‘remove’:指定被移除的文件
AddCodeGroup()函數(shù)
AddCodeGroup(name, src, depend, **parameters)
將編譯對象添加到一個(gè)代碼組中進(jìn)行編譯管理,返回編譯對象列表
‘name’:指定代碼組名稱,如果該名稱已經(jīng)存在,則將添加到已經(jīng)存在的組中。在keil工程中以該名稱呈現(xiàn)一個(gè)工作組
‘src’:指定要被添加的編譯對象列表
‘depend’:關(guān)鍵字參數(shù),指定創(chuàng)建該組依賴的宏,如果條件宏不滿足,則直接返回空列表
‘parameters’:可變關(guān)鍵字參數(shù),指定相應(yīng)的編譯行為,支持的關(guān)鍵字如下:
CPPPATH指定頭文件路徑,對應(yīng)gcc的-I
CCFLAGS對應(yīng)gcc的–include選項(xiàng)
CPPDEFINES定義編譯宏,對應(yīng)gcc的-D
LINKFLAGS定義鏈接選項(xiàng)
LOCAL_CPPPATH
定義僅對當(dāng)前組有效的頭文件路徑選項(xiàng)
SCons的編譯環(huán)境類
scons中的一個(gè)基本類是構(gòu)造環(huán)境Environment,scons對編譯源碼的管理,以及對編譯行為的控制都是通過配置構(gòu)造環(huán)境(Env)來管理的。通過調(diào)用Environment()可以創(chuàng)建一個(gè)構(gòu)造環(huán)境對象(Env)
配置Env對象中的各個(gè)變量,我們可以方便的定義需要的編譯行為。簡單舉例:
通過CPPPATH變量可以添加gcc編譯的-I選項(xiàng)
通過CPPDEFINES變量可以添加gcc的-D選項(xiàng)
通過CC變量可以指定C語言的交叉編譯器
通過RESULT_SUFFIX變量可以指定生成目標(biāo)文件的類型
通過env[‘ENV’][‘PATH’]變量可以指定交叉編譯工具鏈的路徑
python基礎(chǔ)知識(shí)
os函數(shù)
- os.system() #運(yùn)行shell命令
- os.name #返回當(dāng)前使用平臺(tái)的代表字符,Windows用’nt’表示,Linux用’posix’表示
- os.sep #返回當(dāng)前操作系統(tǒng)特定的路徑分隔符,window和Linux通常不一樣
- os.path.split(path) #將path的目錄和文件名分開為元組
- os.path.join(path1,path2,…) #將path1,path2,…進(jìn)行組合,若path2為絕對路徑,則會(huì)將path1刪除
- os.path.dirname(path) #返回path中的目錄(文件夾部分),結(jié)果不包含’’
- os.path.basename(path) #返回path中的文件名
scons內(nèi)置函數(shù)
每一個(gè) RT-Thread BSP 目錄下都會(huì)存在下面三個(gè)文件:rtconfig.py、SConstruct 和 SConscript,它們控制 BSP 的編譯。SConstruct文件是SCons默認(rèn)解析的第一個(gè)腳本,因此scons命令必須在它所在的路徑下執(zhí)行。一般建議將SConstruct腳本與rtconfig.py腳本置于用戶工程目錄中。下面以一個(gè)SConstruct為例進(jìn)行簡單分析:
SConstruct文件(SCons環(huán)境配置類腳本):
import os //加載python庫os,os是python自帶的系統(tǒng)模塊,需要import使用os 源于英文Operating System(操作系統(tǒng))的縮寫 import sys //加載python庫sys import rtconfig //加載編譯選項(xiàng)配置腳本rtconfig.pyif os.getenv('RTT_ROOT'):RTT_ROOT = os.getenv('RTT_ROOT') else:RTT_ROOT = os.path.normpath(os.getcwd() + '/../../..') //cwd(Current Working Directory),含義為當(dāng)前工作目錄,os.getcwd() 指獲取當(dāng)前工作目錄。定義從SConstruct所在目錄到rtthread源碼根目錄的相對路徑sys.path = sys.path + [os.path.join(RTT_ROOT, 'tools')] try:from building import * except:print('Cannot found RT-Thread root directory, please check RTT_ROOT')print(RTT_ROOT)exit(-1)TARGET = 'rt-thread.' + rtconfig.TARGET_EXT //指定編譯生成二進(jìn)制文件的名字//將rtconfig.py中配置的編譯選項(xiàng)信息傳遞到scons內(nèi)置編譯對象env中 DefaultEnvironment(tools=[]) env = Environment(tools = ['mingw'],AS = rtconfig.AS, ASFLAGS = rtconfig.AFLAGS,CC = rtconfig.CC, CCFLAGS = rtconfig.CFLAGS,AR = rtconfig.AR, ARFLAGS = '-rc',CXX = rtconfig.CXX, CXXFLAGS = rtconfig.CXXFLAGS,LINK = rtconfig.LINK, LINKFLAGS = rtconfig.LFLAGS) env.PrependENVPath('PATH', rtconfig.EXEC_PATH)if rtconfig.PLATFORM == 'iar':env.Replace(CCCOM = ['$CC $CCFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS -o $TARGET $SOURCES'])env.Replace(ARFLAGS = [''])env.Replace(LINKCOM = env["LINKCOM"] + ' --map rt-thread.map')Export('RTT_ROOT') //導(dǎo)出 RTT_ROOT 變量,供其他腳本使用 Export('rtconfig') //導(dǎo)出 rtconfig 變量,供其他腳本使用SDK_ROOT = os.path.abspath('./')if os.path.exists(SDK_ROOT + '/libraries'):libraries_path_prefix = SDK_ROOT + '/libraries' else:libraries_path_prefix = os.path.dirname(SDK_ROOT) + '/libraries'SDK_LIB = libraries_path_prefix Export('SDK_LIB')# prepare building environment objs = PrepareBuilding(env, RTT_ROOT, has_libcpu=False) //調(diào)用(某腳本文件).py中的工具函數(shù),其中會(huì)對scons選項(xiàng),以及相應(yīng)的編譯選項(xiàng)適配進(jìn)行處理,通過sconscript()調(diào)用sconscript腳本文件stm32_library = 'STM32F4xx_HAL' rtconfig.BSP_LIBRARY_TYPE = stm32_library# include libraries objs.extend(SConscript(os.path.join(libraries_path_prefix, stm32_library, 'SConscript')))# include drivers objs.extend(SConscript(os.path.join(libraries_path_prefix, 'HAL_Drivers', 'SConscript')))# make a building DoBuilding(TARGET, objs)由上示例可以看出,SConstruct與rtconfig.py與用戶的具體應(yīng)用環(huán)境和編譯配置緊密相關(guān)
SConscript文件(SCons中間加載類腳本):
(目錄:C:\Users\Admin\Desktop\data\rt-thread\bsp\stm32\stm32f407-atk-explorer)
SConscript文件(SCons代碼組織類腳本):
此SConscript腳本位于子目錄
(目錄:C:\Users\Admin\Desktop\data\rt-thread\bsp\stm32\stm32f407-atk-explorer\applications)
DefineGroup()中的名字參數(shù)必須指定,如果該名字的組已經(jīng)存在,則會(huì)進(jìn)行追加合并。鍵值參數(shù)不是必選的,可以缺省。
import rtconfig from building import *cwd = GetCurrentDir() CPPPATH = [cwd, str(Dir('#'))] #添加搜尋頭文件路徑 src = Split(""" main.c """) #定義要添加的源文件group = DefineGroup('Applications', src, depend = [''], CPPPATH = CPPPATH) #創(chuàng)建代碼管理組Return('group') #將定義的組返回給上一級(jí)調(diào)用腳本rtconfig.py文件:
rtconfig.py文件,主要用于指定編譯器以及安裝路徑。除此之外,該文件中定義了大量的變量,這些變量包括編譯選項(xiàng),匯編選項(xiàng),鏈接選項(xiàng)。
總結(jié)
以上是生活随笔為你收集整理的rtthread_scons简介的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java程序验证五子棋先手必胜_五子棋的
- 下一篇: html 三种插入css样式的方式