# this is a comment
變數在 BitBake 當中是沒有資料型態的 , 所有的變數都是字串
在配置文件當中(.conf) 所定義的變數是全域的 ,所有的 recipe 都可以看見。 而在 recipe(.bb) 當中定義的,只有在當前的 recipe 當中可用。
# myproject.conf
# 全域變數
MY_GLOBAL_VAR = "global_value_from_conf"
# myrecipe.bb
# recipe文件中的local 變數
MY_LOCAL_VAR = "local_value_from_recipe"
# 使用全域變數
SOME_VAR = "${MY_GLOBAL_VAR} is used in this recipe"
所有的變數都是透過 雙引號 or 單引號 來賦值 。
直接賦值 (=
)
VAR = "Test"
VAR1 = "Hello \"name\" "
VAR1 = "Hello 'name' "
默認賦值 (?=
)
如果這個變數沒被設定過,會被默認賦值。
假如他在默認賦值之前已經被設定過了,則會保留原先的值。
A ?= "value1"
B ?= "value2"
B ?= "value3"
C ?= "value4"
C = "value5"
### A = value1
### B = value2
### C = value5
弱默認賦值 (??=
)
會等到解析過程結束才會發生賦值的動作
A ??= "Value1"
B ??= "Value2"
B ??= "Value3"
C ?= "Value4"
C ??= "Value5"
D = "Value6"
D ??= "Value7"
### A 第一次被設置 所以等於 Value 1
### B 會等於 "Value3" 因為會一直等到到解讀完整個檔案最後才發生賦值的動作
### C = Value 4 默認賦值 > 弱默認 覆蓋掉了
### D = Value 6 直接賦值 > 弱默認 覆蓋掉了
VAR1 = "Test1"
VAR2 = "The text is ${VAR1} ."
直接變數擴展 (:=
) : 上述寫法會等到這個變數被實際使用的時候才會發生擴展。透過 :=
可以在賦值的時候就擴展。
VAR1 = "jumps over"
VAR2 = "${VAR1} the lazy dog."
VAR1 = "falls on"
VAR3 = "The rain in Spain ${VAR1} the plain."
VAR4 := "The quick brown fox ${VAR2}"
### VAR4 = “The quick brown fox falls on the lazy dog.”
### 因為 VAR2 的時候雖然此時 VAR1 = jumps over , 但到第三行時已經變成了 falls on , 所以最後 VAR2 當中的 VAR1 已經是 falls on
Python 變數擴展 : 可以使用 py 的函數
DATE = "${@time.strftime('%A %B %d %Y' , time.gettime())}"
TODAY := "Today is : ${DATE}"
帶空格的追加 +=
+=
: 將兩個變數合併 一個在前一個在後 ,並在中間加上空格
不太空格的追加 .=
=.
: 同上 只是不帶空格
_append
_prepend
效果同上 沒有空格
條件覆蓋 (:
) 用於 OVERRIDES
變量中的條件列表,用於定義變量的覆蓋順序和條件。每一個數值都代表著要被滿足的條件。
BitBake 會從右到左來處理條件 ,右邊的優先權較高。
OVERRIDES = "conda:condb:condc"
#condc > condb > conda
條件變數設置 (_
) : 通過下底線來追加條件到變數名稱
# 承上
PROTECTION = "unknown"
PROTECTION_conda = "lotion"
# 最終 PROTECTION = lotion
#承上
PROTECTION_condb = "test1"
PROTECTION_condf = "test2"
# 結果為 test1 , 因為 OVERRIDS 當中沒有 condf
#承上
PROTECTION_condb = "test1"
PROTECTION_condc = "test2"
# 結果為 test2 , 因為 OVERRIDS當中 condc 的優先權較高
MetaData 可以 引用其他 metadata 來使用共享的設定。
常見的是使用相同的package 去編譯不同版本的 recipe, inc 文件可以提供編譯指令、安裝目錄等等給其他檔案使用。
include
include test.inc
required
required test.inc
兩者差異為使用 include 時沒有找到檔案,不會報錯會繼續編譯。但使用 required 沒找到檔案會直接報錯停止編譯。
利用 bbclass 可以有簡單的繼承機制 , 能讓 recipe , bbappend 透過 inherit
來繼承
inherit myclass -> bbclass 名稱
recipe , append , class 都可以寫 可執行的 meta-data , 可執行的 meatadata就是 shell 或是 python 函數
helloworld(){
echo "Hello World!"
}
透過開頭的 python 讓 bitbake 知道剩餘的程式是python , 注意python 的縮排
python printdata(){
import time
print time strftime("%Y%m%d" , time.gettime())
}
BitBake 把特殊函數當作為一個任務 , 這些任務會被定義在 recipes 與 class 當中,而且可以
python do_clean(){
......
}
addtask do_clean // 透過 addtask 指令將 do_clean 新增到任務列表當中
do_build(){
.......
}
addtask do_build // 將 do_build 新增到任務列表
do_download(){
}
addtask dowmload before do_build
do_install(){
....
}
addtask do_install after do_build
要將Shell 或函數定義為任務 , 名字必須前面要加上 do_ 。 指令 addtask 可以將函數新增到任務列表當中 , 或是用來自訂任務順序
假入上述程式是在一個 recipe 當中 , 命名為 myrecipe.bb
那我們就可以這樣使用
bitbake myrecipe -c clean
bitbake myrecipe -c build # 呼叫後就會按照我們設定的順序執行 download -> build -> install
所有的 metadata 也就是 變數或是函數 都可以擁有屬性或是旗標 。用來提供額外的訊息到metadata。
在 Bitbake 當中會通過 [ ]
來將屬性名稱增加到變數或者是函數名來設置屬性。
VAR[flag] = "flagvalue"
可以透過 python 函數來取值
python func(){
flag = d.getVarFlag('VAR' , 'flag')
if flag == 1 :
#do some thing
d.setVarFlag('VAR' , 'flag' , 0)
else :
# do some
}