交叉和原生檔案參考
交叉編譯和原生檔案幾乎相同,但並非完全如此。這是關於兩者都使用的通用值的文檔,關於其中一個或另一個的特定值,請參閱交叉編譯和原生環境。
在 0.56.0 版本中變更 區段內的鍵現在區分大小寫。這是為了讓專案選項正常運作所必需的。
資料類型
機器檔案中有四種基本資料類型
- 字串
- 陣列
- 布林值
- 整數
字串以單引號指定
[section]
option1 = 'false'
option2 = '2'
陣列以方括號括起來,且必須由字串或布林值組成
[section]
option = ['value']
布林值必須是 true
或 false
,且不帶引號。
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.exe
或 lld-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 是否應自動從機器檔案中的其他區段(binaries
、host_machine
等)產生預設工具鏈變數。預設值始終會被[cmake]
區段中設定的變數覆寫。預設值為true
。(0.56.0 版本中的新功能) -
cmake_skip_compiler_test
是一個列舉,指定 Meson 何時應自動產生工具鏈變數,以跳過 CMake 編譯器健全性檢查。僅當cmake_defaults
為true
時,此設定才有效。支援的值為always
、never
、dep_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_library
和 werror
。優先順序為
- 命令列
- 機器檔案
- 建置系統定義
[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.ini
,second.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 個原生檔案即可表示。
搜尋結果為