iT邦幫忙

2024 iThome 鐵人賽

DAY 8
0
佛心分享-SideProject30

門外漢的嵌入式地獄系列 第 8

Day 8 。初入嵌入式開發-MetaData 語法

  • 分享至 

  • xImage
  •  

註釋

# 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 名稱

可執行的 datameta

recipe , append , class 都可以寫 可執行的 meta-data , 可執行的 meatadata就是 shell 或是 python 函數

Shell 函數寫法

helloworld(){
	echo "Hello World!"
}

Python 函數寫法

透過開頭的 python 讓 bitbake 知道剩餘的程式是python , 注意python 的縮排

python printdata(){
	import time
	print time strftime("%Y%m%d" , time.gettime())
}

Task 任務

BitBake 把特殊函數當作為一個任務 , 這些任務會被定義在 recipes 與 class 當中,而且可以

  • 直接透過bitbake 對某個recipe 當中的函數座使用
  • 被 bitbake 自動化執行
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 也就是 變數或是函數 都可以擁有屬性或是旗標 。用來提供額外的訊息到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
}

上一篇
Day 7 。初入嵌入式開發-MetaData
下一篇
Day 9 。初入嵌入式開發-創建自己的recipe
系列文
門外漢的嵌入式地獄30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言