交叉和原生檔案參考

交叉編譯和原生檔案幾乎相同,但並非完全如此。這是關於兩者都使用的通用值的文檔,關於其中一個或另一個的特定值,請參閱交叉編譯原生環境

在 0.56.0 版本中變更 區段內的鍵現在區分大小寫。這是為了讓專案選項正常運作所必需的。

資料類型

機器檔案中有四種基本資料類型

  • 字串
  • 陣列
  • 布林值
  • 整數

字串以單引號指定

[section]
option1 = 'false'
option2 = '2'

陣列以方括號括起來,且必須由字串或布林值組成

[section]
option = ['value']

布林值必須是 truefalse,且不帶引號。

option = false

整數必須是不帶引號的數字常數。

option = 42

區段

允許以下區段

  • 常數
  • 二進制檔
  • 路徑
  • 屬性
  • cmake
  • 專案選項
  • 內建選項

常數

自 0.56.0 版本起

字串和列表串連使用 + 運算子,加入路徑使用 / 運算子。定義在 [constants] 區段中的條目可用於任何其他區段(它們始終先解析),任何其他區段中的條目只能在同一區段內使用,且必須在定義之後。

[constants]
toolchain = '/toolchain'
common_flags = ['--sysroot=' + toolchain / 'sysroot']

[properties]
c_args = common_flags + ['-DSOMETHING']
cpp_args = c_args + ['-DSOMETHING_ELSE']

[binaries]
c = toolchain / 'gcc'

這在交叉檔案組成中也很有用。可以使用定義常數的特定平台檔案來組成通用交叉檔案

# aarch64.ini
[constants]
arch = 'aarch64-linux-gnu'
# cross.ini
[binaries]
c = arch + '-gcc'
cpp = arch + '-g++'
strip = arch + '-strip'
pkg-config = arch + '-pkg-config'
...

這可以用作 meson setup --cross-file aarch64.ini --cross-file cross.ini builddir

請注意,檔案組成發生在解析值之前。下面的範例會產生 b'HelloWorld' 的結果

# file1.ini:
[constants]
a = 'Foo'
b = a + 'World'
#file2.ini:
[constants]
a = 'Hello'

當 file1.ini 在 file2.ini 之前被包含時,下面的範例會產生錯誤,因為 b 會在 a 之前被定義

# file1.ini:
[constants]
b = a + 'World'
#file2.ini:
[constants]
a = 'Hello'

自 1.3.0 版本起 在解析機器檔案之前,會替換一些 Token

  • @GLOBAL_SOURCE_ROOT@:專案原始碼樹的絕對路徑
  • @DIRNAME@:機器檔案父目錄的絕對路徑。

例如,它可以用來產生相對於原始碼目錄的路徑,或相對於工具鏈安裝目錄的路徑。

[binaries]
c = '@DIRNAME@/toolchain/gcc'
exe_wrapper = '@GLOBAL_SOURCE_ROOT@' / 'build-aux' / 'my-exe-wrapper.sh'

二進制檔

二進制檔區段包含二進制檔的列表。這些可以由 Meson 內部使用,或由 find_program 函式使用。

這些值必須是字串或字串陣列

編譯器和連結器在此處使用 <lang><lang>_ld 定義。<lang>_ld 很特別,因為它是編譯器特定的。對於像 gcc 和 clang 這樣用於調用連結器的編譯器,這是傳遞給其「選擇連結器」參數的值(在本例中為 -fuse-ld=)。對於像 MSVC 和 Clang-Cl 這樣的編譯器,這是 Meson 要調用的連結器的路徑,例如 link.exelld-link.exe。對 ld 的支援是0.53.0 版本中的新功能

在 0.53.1 版本中變更 ld 變數被 <lang>_ld 取代,因為它導致了大量專案的回歸。在 0.53.0 版本中,使用了 ld 變數。

原生範例

c = '/usr/bin/clang'
c_ld = 'lld'
sed = 'C:\\program files\\gnu\\sed.exe'
llvm-config = '/usr/lib/llvm8/bin/llvm-config'

交叉範例

c = ['ccache', '/usr/bin/i586-mingw32msvc-gcc']
cpp = ['ccache', '/usr/bin/i586-mingw32msvc-g++']
c_ld = 'gold'
cpp_ld = 'gold'
ar = '/usr/i586-mingw32msvc/bin/ar'
strip = '/usr/i586-mingw32msvc/bin/strip'
pkg-config = '/usr/bin/i586-mingw32msvc-pkg-config'

可以在此處覆寫的內部使用程式的不完整列表為

  • cmake
  • cups-config
  • gnustep-config
  • gpgme-config
  • libgcrypt-config
  • libwmf-config
  • llvm-config
  • pcap-config
  • pkg-config
  • sdl2-config
  • wx-config(或 wx-3.0-config 或 wx-config-gtk)

路徑和目錄

在 0.56.0 版本中已棄用 請改用內建區段。

自 0.50.0 版本起,路徑和目錄(例如 libdir)可以在原生和交叉檔案的 paths 區段中定義。這些應該是字串。

[paths]
libdir = 'mylibdir'
prefix = '/my prefix'

這些值僅在未進行交叉編譯時載入。命令列上的任何參數都會覆寫原生檔案中的任何選項。例如,傳遞 --libdir=otherlibdir 會產生前綴 /my prefix 和 libdir otherlibdir

屬性

0.54.0 版本中原生檔案的新功能,始終在交叉檔案中。

除了可以在交叉檔案中指定的特殊資料之外,此區段還可以包含使用 meson.get_external_property()meson.get_cross_property() 存取的隨機鍵值對。

在 0.56.0 版本中變更<lang>_args<lang>_link_args 放入 properties 區段已棄用,應放入內建選項區段。

支援的屬性

這是 [properties] 區段中支援變數的不完整列表。

  • cmake_toolchain_file 指定一個已存在的 CMake 工具鏈檔案的絕對路徑,該檔案將作為 Meson 自動生成的 CMake 工具鏈檔案的最後一個指令使用 include() 載入。(0.56.0 版本中的新功能
  • cmake_defaults 是一個布林值,指定 Meson 是否應自動從機器檔案中的其他區段(binarieshost_machine 等)產生預設工具鏈變數。預設值始終會被 [cmake] 區段中設定的變數覆寫。預設值為 true。(0.56.0 版本中的新功能
  • cmake_skip_compiler_test 是一個列舉,指定 Meson 何時應自動產生工具鏈變數,以跳過 CMake 編譯器健全性檢查。僅當 cmake_defaultstrue 時,此設定才有效。支援的值為 alwaysneverdep_only。預設值為 dep_only。(0.56.0 版本中的新功能
  • cmake_use_exe_wrapper 是一個布林值,用於控制是否使用 [binaries] 中指定的 exe_wrapper 來執行 CMake 子專案中產生的可執行檔。如果未指定 exe_wrapper,則此設定無效。預設值為 true。(0.56.0 版本中的新功能
  • java_home 是指向 Java 安裝根目錄的絕對路徑。
  • bindgen_clang_arguments 要在呼叫 bindgen 時傳遞給 clang 的額外參數陣列

CMake 變數

0.56.0 版本中的新功能

[cmake] 區段中設定的所有變數都將被新增到用於 CMake 相依性和 CMake 子專案的生成 CMake 工具鏈檔案中。每個條目的類型必須是字串或字串列表。

注意:所有鍵的值中的所有 \ 出現次數都將被 / 取代,因為 CMake 在處理變數時(即使在 CMAKE_C_COMPILER 中的路徑正確逸出的情況下,CMake 仍然會在內部出錯)在正確逸出 \ 時存在許多問題

      A custom toolchain file should be used (via the `cmake_toolchain_file`
      property) if `\` support is required.
[cmake]

CMAKE_C_COMPILER    = '/usr/bin/gcc'
CMAKE_CXX_COMPILER  = 'C:\\usr\\bin\\g++'
CMAKE_SOME_VARIABLE = ['some', 'value with spaces']

例如,以上 [cmake] 區段將在 CMake 工具鏈檔案中產生以下程式碼

set(CMAKE_C_COMPILER    "/usr/bin/gcc")
set(CMAKE_CXX_COMPILER  "C:/usr/bin/g++")
set(CMAKE_SOME_VARIABLE "some" "value with spaces")

專案特定選項

0.56.0 版本中的新功能

不允許路徑選項,必須在 [paths] 區段中設定這些選項。

可以使用特定檔案的 [project options] 區段在交叉或原生檔案中設定專案特定選項(如果執行交叉建置,則會忽略原生檔案中的選項)

若要在子專案中設定選項,請改用 [<subproject>:project options] 區段。

[project options]
build-tests = true

[zlib:project options]
build-tests = false

Meson 內建選項

在 0.56.0 版本之前,<lang>_args<lang>_link_args 必須放入 properties 區段中,否則它們將被忽略。

Meson 內建選項可以使用相同的方式設定

[built-in options]
c_std = 'c99'

您可以針對每個子專案設定一些 Meson 內建選項,例如 default_librarywerror。優先順序為

  1. 命令列
  2. 機器檔案
  3. 建置系統定義
[zlib:built-in options]
default_library = 'static'
werror = false

針對每個子專案設定的選項,如果父專案有設定但子專案沒有設定,即使有預設設定的 Meson 語言,也會繼承父專案的選項。

[built-in options]
default_library = 'static'

將使子專案使用 static 作為 default_library。

一些選項可以針對每個機器設定(換句話說,在交叉編譯中,建置機器的值可以與主機器的值不同)。在這些情況下,會使用交叉檔案和原生檔案中的值。

以下是不完整的選項列表

  • pkg_config_path
  • cmake_prefix_path

載入多個機器檔案

原生檔案允許分層(自 Meson 0.52.0 版本起,交叉檔案可以分層)。可以載入多個檔案,前一個檔案中的值會被下一個檔案覆寫。這樣做的目的不是覆寫,而是允許組合檔案。這種組合是透過多次傳遞命令列參數來完成的

meson setup builddir/ --cross-file first.ini --cross-file second.ini --cross-file third.ini

在這種情況下,將載入 first.ini,然後載入 second.inisecond.ini 中的值將取代 first.ini 中的值,依此類推。

例如,如果有一個專案使用 C 和 C++、python 3.4-3.7 和 LLVM 5-7,並且需要使用 clang 5、6 和 7 以及 gcc 5.x、6.x 和 7.x 進行建置;以單體組態表示所有這些組態將產生 81 個不同的原生檔案。透過分層,只需 12 個原生檔案即可表示。

搜尋結果為