內建選項
Meson 提供兩種選項:由建置檔案提供的建置選項,以及內建選項,包含通用選項、基礎選項和編譯器選項。
通用選項
所有這些選項都可以透過將 -Doption=value
傳遞給 meson
(即 meson setup
)來設定,或是在您的 meson.build
中,於 project()
的 default_options
內設定。某些選項也可以使用 --option=value
或 --option value
來設定 — 執行 meson setup --help
會顯示選項列表。
由於歷史因素,--warnlevel
是 warning_level
選項的命令列引數。
它們也可以在使用 meson configure -Doption=value
設定後進行編輯。
安裝選項通常相對於前綴(prefix),但不應過度依賴,因為在下列情況下,它們可以是絕對路徑
- 當前綴為
/usr
時:sysconfdir
預設為/etc
,localstatedir
預設為/var
,而sharedstatedir
預設為/var/lib
- 當前綴為
/usr/local
時:localstatedir
預設為/var/local
,而sharedstatedir
預設為/var/local/lib
- 當使用者/發行商提供前綴之外的絕對路徑時。
目錄
選項 | 預設值 | 說明 |
---|---|---|
prefix | 請參閱下方說明 | 安裝前綴 |
bindir | bin | 執行檔目錄 |
datadir | share | 資料檔案目錄 |
includedir | include | 標頭檔案目錄 |
infodir | share/info | 資訊頁面目錄 |
libdir | 請參閱下方說明 | 程式庫目錄 |
licensedir | 請參閱下方說明 | 授權目錄(自 1.1.0 版起) |
libexecdir | libexec | 程式庫執行檔目錄 |
localedir | share/locale | 地區資料目錄 |
localstatedir | var | 本機狀態資料目錄 |
mandir | share/man | 說明頁面目錄 |
sbindir | sbin | 系統執行檔目錄 |
sharedstatedir | com | 獨立於架構的資料目錄 |
sysconfdir | etc | Sysconf 資料目錄 |
prefix
在 Windows 上預設為 C:/
,其他情況下預設為 /usr/local
。您應該始終覆寫此值。
libdir
會根據您的平台自動偵測,當執行「原生」編譯(建置機器 == 主機機器)時應該是正確的。對於交叉編譯,Meson 會嘗試猜測正確的 libdir,但可能不準確,尤其是在 Linux 上,因為不同的發行版有不同的預設值。使用交叉編譯檔案,特別是路徑區段可能很有必要。
licensedir
預設為空。如果設定,它會定義安裝相依性資訊清單和專案授權的預設位置。如需更多詳細資訊,請參閱meson.install_dependency_manifest()
。
核心選項
表格中標示為「每個機器」的選項是針對每台機器設定的。有關詳細資訊,請參閱指定每個機器的選項區段。
選項 | 預設值 | 說明 | 是否每個機器 | 是否每個子專案 |
---|---|---|---|---|
auto_features {enabled, disabled, auto} | auto | 覆寫所有「自動」功能的值 | 否 | 否 |
backend {ninja, vs, vs2010, vs2012, vs2013, vs2015, vs2017, vs2019, vs2022, xcode, none} |
ninja | 要使用的後端 | 否 | 否 |
genvslite {vs2022} | vs2022 | 設定多個建置類型 Ninja 建置目錄和 Visual Studio 解決方案 | 否 | 否 |
buildtype {plain, debug, debugoptimized, release, minsize, custom} |
debug | 要使用的建置類型 | 否 | 否 |
debug | true | 啟用偵錯符號和其他資訊 | 否 | 否 |
default_both_libraries {shared, static, auto} | shared | both_libraries 的預設程式庫類型 | 否 | 否 |
default_library {shared, static, both} | shared | 預設程式庫類型 | 否 | 是 |
errorlogs | true | 是否列印失敗測試的日誌。 | 否 | 否 |
install_umask {preserve, 0000-0777} | 022 | 套用至已安裝檔案權限的預設 umask | 否 | 否 |
layout {mirror,flat} | mirror | 建置目錄佈局 | 否 | 否 |
optimization {plain, 0, g, 1, 2, 3, s} | 0 | 最佳化層級 | 否 | 否 |
pkg_config_path {以 OS 分隔的路徑} | '' | pkg-config 在內建路徑之前搜尋的其他路徑 | 是 | 否 |
prefer_static | false | 是否嘗試在共用連結之前進行靜態連結 | 否 | 否 |
cmake_prefix_path | [] | cmake 在內建路徑之前搜尋的其他前綴 | 是 | 否 |
stdsplit | true | 在測試日誌中分割 stdout 和 stderr | 否 | 否 |
strip | false | 在安裝時移除目標的符號 | 否 | 否 |
unity {on, off, subprojects} | off | Unity 建置 | 否 | 否 |
unity_size {>=2} | 4 | Unity 檔案區塊大小 | 否 | 否 |
warning_level {0, 1, 2, 3, everything} | 1 | 設定警告層級。從 0 = 編譯器預設值到 everything = 最高 | 否 | 是 |
werror | false | 將警告視為錯誤 | 否 | 是 |
wrap_mode {default, nofallback, nodownload, forcefallback, nopromote} |
default | 要使用的 Wrap 模式 | 否 | 否 |
force_fallback_for | [] | 強制對這些相依性使用 Fallback | 否 | 否 |
vsenv | false | 啟用 Visual Studio 環境 | 否 | 否 |
backend
的詳細資訊
支援多種建置檔案格式作為命令執行器來建置已設定的專案。Meson 預設偏好 ninja,但也提供平台專屬的後端,以便與原生工具進行更好的 IDE 整合:Windows 的 Visual Studio 和 macOS 的 xcode。也可以設定完全沒有後端,如果您有要建置的目標,這將會產生錯誤,但對於需要設定 + 測試 + 安裝的專案,則允許更輕量的自動化建置管線。
genvslite
的詳細資訊
設定多個建置類型後綴、ninja 後端的建置目錄(例如 [builddir]_[debug/release/etc.]),並產生 [builddir]_vs,其中包含一個 Visual Studio 解決方案,具有多個組態,這些組態會叫用設定建置目錄的 meson 編譯,如同當前組態(建置類型)一樣。
這具有設定多個具有一組不同建置類型值的 'meson setup ...' 叫用的簡單設定巨集的效果。例如,meson setup ... --genvslite vs2022 somebuilddir
會執行以下操作 -
meson setup ... --backend ninja --buildtype debug somebuilddir_debug
meson setup ... --backend ninja --buildtype debugoptimized somebuilddir_debugoptimized
meson setup ... --backend ninja --buildtype release somebuilddir_release
此外,還會建立另一個 'somebuilddir_vs' 目錄,其中包含產生的多重組態 Visual Studio 解決方案和專案,這些專案設定為使用適合解決方案所選建置類型組態的 somebuilddir_[...] 進行建置/編譯。
buildtype
的詳細資訊
要設定最佳化層級並切換偵錯,您可以設定 buildtype
選項,或者可以設定 optimization
和 debug
選項,這兩者可以對相同設定進行更精細的控制。無論您決定使用哪個選項,另一個選項都會從中推斷出來。例如,-Dbuildtype=debugoptimized
與 -Ddebug=true -Doptimization=2
相同,反之亦然。此表格說明了雙向對應
buildtype | debug | optimization |
---|---|---|
plain | false | plain |
debug | true | 0 |
debugoptimized | true | 2 |
release | false | 3 |
minsize | true | s |
所有其他 debug
和 optimization
的組合都會將 buildtype
設定為 'custom'
。
warning_level
的詳細資訊
每個警告層級的確切旗標是編譯器特定的,但對於大多數常見的編譯器,都有一個近似表格。
警告層級 | GCC/Clang | MSVC |
---|---|---|
0 | ||
1 | -Wall | /W2 |
2 | -Wall -Wextra | /W3 |
3 | -Wall -Wextra -Wpedantic | /W4 |
everything | -Weverything | /Wall |
Clang 的 -Weverything
會透過傳遞所有已知的警告旗標在 GCC 上模擬。
vsenv
的詳細資訊
--vsenv
引數自 0.60.0
起支援,-Dvsenv=true
語法自 1.1.0
起支援。
自 0.59.0
起,meson 會在 Windows 上針對其所有子命令自動啟用 Visual Studio 環境,但前提是沒有找到其他編譯器(例如 gcc
或 clang
),並且在 Visual Studio 啟用失敗時會以靜默方式繼續。
將 vsenv
選項設定為 true
會強制啟用 Visual Studio,即使找到其他編譯器也是如此。當啟用失敗時,它也會讓 Meson 中止並顯示錯誤訊息。
當使用 vs
後端時,vsenv
預設為 true
。
default_both_libraries
的詳細資訊
自 1.6.0
起,您可以在使用 both_libraries
物件時選取選取的預設程式庫類型。它可以是 'shared'(預設值,與先前的 meson 版本相容)、'static' 或 'auto'。使用 auto 時,會使用 default_library
選項的值,除非它是 'both',在這種情況下會改用 'shared'。
當 default_both_libraries
為 'auto' 時,在 both_libraries()
中傳遞 both_libs
相依性會將靜態相依性與靜態程式庫連結,並將共用相依性與共用程式庫連結。
基礎選項
這些選項的設定方式與通用選項相同,可以使用 -Doption=value
,或是在您的 meson.build
中,於 project()
的 default_options
內設定。但是,它們無法在 meson setup --help
的輸出中顯示,因為它們取決於目前的平台和將選取的編譯器。查看它們的唯一方法是設定建置目錄,然後在不使用任何選項的情況下在其上執行 meson configure
。
下列選項可用。請注意,它們可能並非在所有平台或所有編譯器上都可用
選項 | 預設值 | 可能的值 | 說明 |
---|---|---|---|
b_asneeded | true | true, false | 連結時使用 -Wl,--as-needed |
b_bitcode | false | true, false | 嵌入 Apple bitcode,請參閱下方說明 |
b_colorout | always | auto, always, never | 使用彩色輸出 |
b_coverage | false | true, false | 啟用涵蓋率追蹤 |
b_lundef | true | true, false | 連結時不允許未定義的符號 |
b_lto | false | true, false | 使用連結時最佳化 |
b_lto_threads | 0 | 任何整數* | 使用多個執行緒進行 lto。(在 0.57.0 版中新增) |
b_lto_mode | default | default, thin | 在 lto 模式之間選取,thin 和 default。(在 0.57.0 版中新增) |
b_thinlto_cache | false | true, false | 啟用 LLVM 的 ThinLTO 快取,以加快增量建置速度。(在 0.64.0 版中新增) |
b_thinlto_cache_dir | (內部建置目錄) | true, false | 指定 ThinLTO 快取物件的儲存位置。(在 0.64.0 版本中新增) |
b_ndebug | false | true, false, if-release | 停用斷言 (assert) |
b_pch | true | true, false | 使用預編譯標頭 (precompiled headers) |
b_pgo | off | off, generate, use | 使用設定檔導向優化 (profile guided optimization) |
b_sanitize | none | 請參閱下方說明 | 要使用的程式碼清理器 (code sanitizer) |
b_staticpic | true | true, false | 將靜態函式庫建置為與位置無關 (position independent) |
b_pie | false | true, false | 建置與位置無關的可執行檔 (自 0.49.0 版本起) |
b_vscrt | from_buildtype | none, md, mdd, mt, mtd, from_buildtype, static_from_buildtype | 要使用的 VS 執行階段函式庫 (自 0.48.0 版本起) (static_from_buildtype 自 0.56.0 版本起) |
b_sanitize
的值可以是:none
、address
、thread
、undefined
、memory
、leak
、address,undefined
,但請注意,某些編譯器可能不支援所有這些值。例如,Visual Studio 僅支援位址清理器 (address sanitizer)。
* < 0 表示停用,== 0 表示自動選擇,> 0 設定要使用的特定數字
LLVM 支援 thin
lto,如需更多討論,請參閱 LLVM 的文件
b_vscrt
的預設值為 from_buildtype
。下表內部用於根據 buildtype
選項的值,為 from_buildtype
或 static_from_buildtype
*(自 0.56 版本起)*選擇 CRT 編譯器引數
buildtype | from_buildtype | static_from_buildtype |
---|---|---|
debug | /MDd
|
/MTd
|
debugoptimized | /MD
|
/MT
|
release | /MD
|
/MT
|
minsize | /MD
|
/MT
|
custom | 錯誤! | 錯誤! |
關於 Apple Bitcode 支援的注意事項
b_bitcode
在編譯時會傳遞 -fembed-bitcode
,並在連結時傳遞 -Wl,-bitcode_bundle
。這些選項與 b_asneeded
不相容,因此該選項將會被靜默停用。
shared_module()
將不會嵌入 bitcode,因為 -Wl,-bitcode_bundle
與 -bundle
和 -Wl,-undefined,dynamic_lookup
都不相容,而後兩者是共享模組運作所必需的。
編譯器選項
與上述基本選項相同的注意事項。
以下選項可用。它們可以透過傳遞 -Doption=value
給 meson
來設定。請注意,選項本身及其可能的值,都將取決於所使用的目標平台或編譯器
選項 | 預設值 | 可能的值 | 說明 |
---|---|---|---|
c_args | 自由形式的逗號分隔清單 | 要使用的 C 編譯引數 | |
c_link_args | 自由形式的逗號分隔清單 | 要使用的 C 連結引數 | |
c_std | none | none, c89, c99, c11, c17, c18, c2x, c23, gnu89, gnu99, gnu11, gnu17, gnu18, gnu2x, gnu23 | 要使用的 C 語言標準 |
c_winlibs | 請參閱下方說明 | 自由形式的逗號分隔清單 | 要連結的標準 Windows 函式庫 |
c_thread_count | 4 | 整數值 ≥ 0 | 在使用執行緒時,搭配 emcc 使用的執行緒數 |
cpp_args | 自由形式的逗號分隔清單 | 要使用的 C++ 編譯引數 | |
cpp_link_args | 自由形式的逗號分隔清單 | 要使用的 C++ 連結引數 | |
cpp_std | none | none, c++98, c++03, c++11, c++14, c++17, c++20 c++2a, c++1z, gnu++03, gnu++11, gnu++14, gnu++17, gnu++1z, gnu++2a, gnu++20, vc++14, vc++17, vc++20, vc++latest |
要使用的 C++ 語言標準 |
cpp_debugstl | false | true, false | C++ STL 除錯模式 |
cpp_eh | default | none, default, a, s, sc | C++ 例外處理類型 |
cpp_rtti | true | true, false | 是否啟用 RTTI (執行階段型別識別) |
cpp_thread_count | 4 | 整數值 ≥ 0 | 在使用執行緒時,搭配 emcc 使用的執行緒數 |
cpp_winlibs | 請參閱下方說明 | 自由形式的逗號分隔清單 | 要連結的標準 Windows 函式庫 |
fortran_std | none | [none, legacy, f95, f2003, f2008, f2018] | 要使用的 Fortran 語言標準 |
cuda_ccbindir | 檔案系統路徑 | 要使用的 CUDA 非預設工具鏈目錄 (-ccbin) (在 0.57.1 版本中新增) |
c_winlibs
和 cpp_winlibs
的預設值採用編譯器特定的引數形式,但函式庫為:kernel32, user32, gdi32, winspool, shell32, ole32, oleaut32, uuid, comdlg32, advapi32。
所有這些 <lang>_*
選項都是針對每個機器指定的。請參閱下方每個機器指定選項章節,了解如何在跨建置中執行此操作。
當使用 MSVC 時,cpp_eh=[value]
將會傳遞 /EH[value]
。魔術值 none
會轉換為 s-c-
以停用例外。自 0.51.0 版本起,default
會轉換為 sc
。當使用 gcc 樣式的編譯器時,不會傳遞任何內容 (允許例外運作),而 cpp_eh=none
會傳遞 -fno-exceptions
。
自 0.54.0 版本起,<lang>_thread_count
選項可用於控制在使用 emcc 時傳遞給 -s PTHREAD_POOL_SIZE
的值。沒有其他 c/c++ 編譯器支援此選項。
自 0.63.0 版本起,所有編譯器選項都可以針對每個子專案設定,請參閱此處,了解預設值如何從主要專案繼承。例如,當主要專案需要 C++11,但子專案需要 C++14 時,這會很有用。現在會採納子專案 default_options
中的 cpp_std
值。
自 1.3.0 版本起,c_std
和 cpp_std
選項現在接受值清單。偏好使用 GNU C 但可以回退到 ISO C 的專案,現在可以設定,例如,default_options: 'c_std=gnu11,c11'
,並且會在可用時使用 gnu11
,否則回退到 c11。只有在目前的編譯器不支援任何值時才會發生錯誤。同樣地,可以受益於 c++17
但仍然可以使用 c++11
建置的專案,可以設定 default_options: 'cpp_std=c++17,c++11'
。這允許我們從 MSVC 編譯器棄用 gnuXX
值。這表示 default_options: 'c_std=gnu11'
現在會使用 MSVC 列印警告,但回退到 c11
。如果至少有一個值有效,則不會列印警告,例如:default_options: 'c_std=gnu11,c11'
。未來,該棄用警告將會變成硬錯誤,因為 c_std=gnu11
應該表示需要 GNU,例如,對於無法使用 MSVC 建置的專案。
每個機器指定選項
自 0.51.0 版本起,某些選項是針對每個機器指定的,而不是針對所有機器組態全域指定。以 build.
作為選項字首只會影響建置機器的組態,而將其保留為未加字首則只會影響主機器的組態。例如
-
build.pkg_config_path
控制 pkg-config 會搜尋native: true
(建置機器) 相依性的路徑。 -
pkg_config_path
控制 pkg-config 會搜尋native: false
(主機器) 相依性的路徑。
這對於跨建置很有用。在原生建置中,建置機器和主機器是相同的,而未加字首的選項就足夠了。
在 0.51.0 版本之前,當在命令列上指定這些選項時,這些選項只會影響原生建置,因為沒有 build.
字首。跨檔案 [properties]
區段中類似命名的欄位會影響跨編譯器,但程式碼路徑差異很大,導致行為上的差異可能會出現。
每個子專案指定選項
自 0.54.0 版本起,可以針對每個子專案定義 default_library
和 werror
內建選項。例如,當在主要專案中建置共享函式庫並靜態連結子專案時,或者當主要專案必須在沒有警告的情況下建置,但某些子專案無法建置時,這會很有用。
大多數情況下,這會在父專案中透過設定子專案的 default_options (例如,subproject('foo', default_options: 'default_library=static')
),或由使用者透過命令列來使用:-Dfoo:default_library=static
。
值會依此順序覆寫
- 來自父專案的值
- 來自子專案 default_options 的值 (如果已設定)
- 來自 subproject() default_options 的值 (如果已設定)
- 來自命令列的值 (如果已設定)
自 0.56.0 版本起,也可以針對每個子專案定義 warning_level
。
模組選項
某些 Meson 模組具有內建選項。它們可以透過在選項前加上模組的名稱來設定:-D<module>.<option>=<value>
(例如,-Dpython.platlibdir=/foo
)。
Pkgconfig 模組
選項 | 預設值 | 可能的值 | 說明 |
---|---|---|---|
relocatable | false | true, false | 將 pkgconfig 檔案產生為可重定位 (自 0.63.0 版本起) |
自 0.63.0 版本起,pkgconfig 模組 (即 pkg.generate()
) 會使用 pkgconfig.relocatable
選項,並影響所產生 pkgconfig 檔案中 prefix
的設定方式 (不要與安裝前置詞混淆)。當它是 true
時,prefix
將會相對於 install_dir
- 這允許 pkgconfig 檔案四處移動並仍然可以運作,只要相對路徑沒有中斷。一般而言,這允許將整個已安裝套件放置在系統上的任何位置,並且仍然可以作為相依性運作。當它設定為 false
時,prefix
將會與安裝前置詞相同。
如果 pkgconfig.relocatable
為 true
,並且所產生 pkgconfig 檔案的 install_dir
指向安裝前置詞外部,則會引發錯誤。例如:如果安裝前置詞為 /usr
,而 pkgconfig 檔案的 install_dir
為 /var/lib/pkgconfig
。
Python 模組
選項 | 預設值 | 可能的值 | 說明 |
---|---|---|---|
bytecompile | 0 | 介於 -1 到 2 的整數 | 要使用的位元組碼最佳化層級 (自 1.2.0 版本起) |
install_env | prefix | {auto,prefix,system,venv} | 要安裝到的 Python 環境 (自 0.62.0 版本起) |
platlibdir | 目錄路徑 | 網站特定、平台特定檔案的目錄 (自 0.60.0 版本起) | |
purelibdir | 目錄路徑 | 網站特定、非平台特定檔案的目錄 (自 0.60.0 版本起) | |
allow_limited_api | true | true, false | 停用專案範圍的 Python Limited API 使用 (自 1.3.0 版本起) |
自 0.60.0 版本起,python 模組方法 python.install_sources()
和 python.get_install_dir()
會使用 python.platlibdir
和 python.purelibdir
選項;Meson 嘗試偵測正確的安裝路徑,並預設使其相對於安裝 prefix
,這通常會導致除非 prefix
在 Linux 上為 /usr
,或者在 Windows 上為 C:\Python39
,否則直譯器找不到已安裝的 python 模組。這些選項可以是 prefix
之外的絕對路徑。
自 0.62.0 版本起,python.install_env
選項用於偵測正確的安裝路徑。設定為 system
將避免路徑相對於 prefix
,而是直接使用所選 Python 直譯器的全域 site-packages,即使它是虛擬環境 (venv) 也一樣。設定為 venv
則會使用 Python 發現的安裝來源之虛擬環境的路徑(如果不是虛擬環境則會失敗)。設定為 auto
將會檢查發現的安裝是否為虛擬環境,並視情況使用 venv
或 system
(但絕不使用 prefix
)。請注意,Conda 環境會被視為 system
。此選項與 platlibdir
/purelibdir
互斥。
為了向後相容性,預設的 install_env
為 prefix
。
自 1.2.0 版本起,可以使用 python.bytecompile
選項來啟用 Python 位元組碼的編譯。位元組碼有 3 個最佳化層級:
- 0,不進行最佳化的位元組碼。
- 1,進行部分最佳化的位元組碼。
- 2,進行更多最佳化的位元組碼。
此外,Meson 新增了層級 -1
,表示完全不嘗試編譯位元組碼。
自 1.3.0 版本起,python.allow_limited_api
選項會影響 extension_module
方法的 limited_api
關鍵字引數是否被採用。如果設定為 false
,則 limited_api
引數的效果會被停用。
搜尋結果如下: