內建選項

Meson 提供兩種選項:由建置檔案提供的建置選項,以及內建選項,包含通用選項、基礎選項和編譯器選項。

通用選項

所有這些選項都可以透過將 -Doption=value 傳遞給 meson(即 meson setup)來設定,或是在您的 meson.build 中,於 project()default_options 內設定。某些選項也可以使用 --option=value--option value 來設定 — 執行 meson setup --help 會顯示選項列表。

由於歷史因素,--warnlevelwarning_level 選項的命令列引數。

它們也可以在使用 meson configure -Doption=value 設定後進行編輯。

安裝選項通常相對於前綴(prefix),但不應過度依賴,因為在下列情況下,它們可以是絕對路徑

  • 當前綴為 /usr 時:sysconfdir 預設為 /etclocalstatedir 預設為 /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 選項,或者可以設定 optimizationdebug 選項,這兩者可以對相同設定進行更精細的控制。無論您決定使用哪個選項,另一個選項都會從中推斷出來。例如,-Dbuildtype=debugoptimized-Ddebug=true -Doptimization=2 相同,反之亦然。此表格說明了雙向對應

buildtype debug optimization
plain false plain
debug true 0
debugoptimized true 2
release false 3
minsize true s

所有其他 debugoptimization 的組合都會將 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 環境,但前提是沒有找到其他編譯器(例如 gccclang),並且在 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 的值可以是:noneaddressthreadundefinedmemoryleakaddress,undefined,但請注意,某些編譯器可能不支援所有這些值。例如,Visual Studio 僅支援位址清理器 (address sanitizer)。

* < 0 表示停用,== 0 表示自動選擇,> 0 設定要使用的特定數字

LLVM 支援 thin lto,如需更多討論,請參閱 LLVM 的文件

b_vscrt 的預設值為 from_buildtype。下表內部用於根據 buildtype 選項的值,為 from_buildtypestatic_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=valuemeson 來設定。請注意,選項本身及其可能的值,都將取決於所使用的目標平台或編譯器

選項 預設值 可能的值 說明
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_winlibscpp_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_stdcpp_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_librarywerror 內建選項。例如,當在主要專案中建置共享函式庫並靜態連結子專案時,或者當主要專案必須在沒有警告的情況下建置,但某些子專案無法建置時,這會很有用。

大多數情況下,這會在父專案中透過設定子專案的 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.relocatabletrue,並且所產生 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.platlibdirpython.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 將會檢查發現的安裝是否為虛擬環境,並視情況使用 venvsystem(但絕不使用 prefix)。請注意,Conda 環境會被視為 system。此選項與 platlibdir/purelibdir 互斥。

為了向後相容性,預設的 install_envprefix

自 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 引數的效果會被停用。

搜尋結果如下: