建構選項

大多數非簡單的建構都需要使用者設定的選項。舉例來說,一個程式可能在建構時有兩個不同的資料後端可供選擇。Meson 透過選項定義檔案來提供此功能。它的名稱是 meson.options,並且放置在您的原始碼樹狀結構的根目錄。在 Meson 1.1 之前的版本中,這個檔案稱為 meson_options.txt

這是一個簡單的選項檔案。

option('someoption', type : 'string', value : 'optval', description : 'An option')
option('other_one', type : 'boolean', value : false)
option('combo_opt', type : 'combo', choices : ['one', 'two', 'three'], value : 'three')
option('integer_opt', type : 'integer', min : 0, max : 5, value : 3) # Since 0.45.0
option('free_array_opt', type : 'array', value : ['one', 'two'])  # Since 0.44.0
option('array_opt', type : 'array', choices : ['one', 'two', 'three'], value : ['one', 'two'])
option('some_feature', type : 'feature', value : 'enabled')  # Since 0.47.0
option('long_desc', type : 'string', value : 'optval',
       description : 'An option with a very long description' +
                     'that does something in a specific context') # Since 0.55.0

關於內建選項,請參閱內建選項

建構選項類型

所有類型都允許設定 description 值來描述該選項,如果沒有設定描述,則會改用選項的名稱。

字串

字串類型是一個自由格式的字串。如果沒有設定預設值,則會使用空字串作為預設值。

布林值

布林值可能的值為 truefalse。如果沒有提供預設值,則會使用 true 作為預設值。

組合

組合允許從 choices 參數中的任何一個值進行選擇。如果沒有設定預設值,則第一個值將會是預設值。

整數

整數選項包含一個單一整數,可選的上界和下界值可以使用 minmax 關鍵字參數指定。

此類型從 Meson 版本 0.45.0 開始可用。

陣列

陣列表示字串陣列。預設情況下,陣列可以包含任意字串。若要限制可能使用的值,請設定 choices 參數。Meson 屆時只會允許值陣列包含在給定清單中的字串。陣列可能為空。value 參數指定選項的預設值,如果沒有設定,則會使用 choices 的值作為預設值。

從 0.47.0 開始,-Dopt= 和 -Dopt=[] 都會傳遞一個空列表,在此之前 -Dopt= 會傳遞一個包含空字串的列表。

此類型從版本 0.44.0 開始可用

功能

feature 選項有三種狀態:enableddisabledauto。它旨在作為大多數函式的 required 關鍵字引數的值傳遞。目前在add_languages()compiler.find_library()compiler.has_header()dependency()find_program()import()subproject() 函式中支援。

  • enabled 與傳遞 required : true 相同。
  • auto 與傳遞 required : false 相同。
  • disabled 不會尋找相依性,並且總是會回傳 'not-found'。

當使用 get_option() 取得此類型選項的值時,會回傳一個特殊的 feature 物件,而不是選項值的字串表示。此物件可以傳遞給 required

d = dependency('foo', required : get_option('myfeature'))
if d.found()
  app = executable('myapp', 'main.c', dependencies : [d])
endif

若要檢查功能的值,該物件有三個方法會回傳布林值並且不接受任何引數。

  • .enabled()
  • .disabled()
  • .auto()

這對於依賴於功能的自訂程式碼很有用。

if get_option('myfeature').enabled()
  # ...
endif

如果將 feature 選項的值設定為 auto,則該值會被全域 auto_features 選項覆寫(預設為 auto)。這旨在供封裝程式使用,它們希望完全控制需要哪些相依性以及停用哪些相依性,並且不依賴於已安裝的 build-deps(使用正確的版本)來啟用功能。它們可以設定 auto_features=enabled 來啟用所有功能,並僅顯式停用它們不想要的少數功能(如果有的話)。

此類型從版本 0.47.0 開始可用

已棄用的選項

0.60.0 開始

專案選項可以標記為已棄用,當使用者將值設定為該選項時,Meson 會發出警告。也可以僅棄用部分選擇,並將已棄用的值對應到新值。

# Option fully deprecated, it warns when any value is set.
option('o1', type: 'boolean', deprecated: true)

# One of the choices is deprecated, it warns only when 'a' is in the list of values.
option('o2', type: 'array', choices: ['a', 'b'], deprecated: ['a'])

# One of the choices is deprecated, it warns only when 'a' is in the list of values
# and replace it by 'c'.
option('o3', type: 'array', choices: ['a', 'b', 'c'], deprecated: {'a': 'c'})

# A boolean option has been replaced by a feature, old true/false values are remapped.
option('o4', type: 'feature', deprecated: {'true': 'enabled', 'false': 'disabled'})

# A feature option has been replaced by a boolean, enabled/disabled/auto values are remapped.
option('o5', type: 'boolean', deprecated: {'enabled': 'true', 'disabled': 'false', 'auto': 'false'})

0.63.0 開始,deprecated 關鍵字引數可以採用取代此選項的新選項的名稱。在這種情況下,在已棄用的選項上設定值將會在舊名稱和新名稱上設定值,假設它們接受相同的值。

# A boolean option has been replaced by a feature with another name, old true/false values
# are accepted by the new option for backward compatibility.
option('o6', type: 'boolean', value: 'true', deprecated: 'o7')
option('o7', type: 'feature', value: 'enabled', deprecated: {'true': 'enabled', 'false': 'disabled'})

# A project option is replaced by a module option
option('o8', type: 'string', value: '', deprecated: 'python.platlibdir')

使用建構選項

optval = get_option('opt_name')

此函式還允許您查詢 Meson 內建專案選項的值。例如,若要取得安裝前置路徑,您會發出以下命令

prefix = get_option('prefix')

應該注意的是,您不能在您的 Meson 指令碼中設定選項值。它們必須透過 meson configure 命令列工具在外部設定。在建構目錄中執行沒有引數的 meson configure 會顯示您可以設定的所有選項。

若要變更它們的值,請使用 -D 選項

$ meson configure -Doption=newvalue

設定陣列的值有點特別。如果您僅傳遞一個字串,則會認為它具有所有以逗號分隔的值。因此,呼叫以下命令

$ meson configure -Darray_opt=foo,bar

會將值設定為包含兩個元素的陣列,foobar

如果您的字串值中需要有逗號,則需要使用正確的 Shell 引號傳遞該值,如下所示

$ meson configure "-Doption=['a,b', 'c,d']"

內層的值必須始終是單引號,而外層的值則必須是雙引號。

若要變更子專案中的值,請在前面加上子專案的名稱和冒號

$ meson configure -Dsubproject:option=newvalue

注意: 如果您無法呼叫 meson configure,則您可能有一個舊版本的 Meson。在這種情況下,您可以改為呼叫 mesonconf,但在較新版本中已棄用。

服從超專案選項

假設您有一個主專案和一個子專案。在某些情況下,可能需要有一個在兩者中具有相同值的選項。這可以使用 yield 關鍵字來實現。假設您有如下的選項定義

option('some_option', type : 'string', value : 'value', yield : true)

如果您單獨建構此專案,則此選項的行為會像平常一樣。但是,如果您將此專案建構成另一個也具有名為 some_option 的選項的專案的子專案,則呼叫 get_option 會回傳超專案的值。如果 yield 的值為 false,則 get_option 會回傳子專案選項的值。

內建建構選項

有許多內建選項。若要取得目前清單,請在建構目錄中執行 meson configure

Visual Studio

啟動專案

可以設定 backend_startup_project 選項來定義在 Visual Studio 中使用「開始偵錯 F5」動作時將會執行的預設專案。它應該與可執行目標名稱相同。

project('my_project', 'c', default_options: ['backend_startup_project=my_exe'])
executable('my_exe', ...)

Ninja

可以設定 backend_max_links 來限制 Ninja 將用於連結的程序數。

搜尋結果為