編譯器選擇與自訂建置#

選擇特定的編譯器#

Meson 支援標準環境變數 CCCXXFC,以選擇特定的 C、C++ 和/或 Fortran 編譯器。這些環境變數記錄在 Meson 文件中的參考表格中。

請注意,環境變數僅在全新建置時套用,因為它們會影響配置階段(即 meson setup)。增量重建不會對環境變數的變更做出反應 - 您必須執行 git clean -xdf 並執行完整重建,或執行 meson setup --reconfigure

新增自訂編譯器或連結器旗標#

Meson 在設計上偏好透過傳遞給 meson setup 的命令列選項來配置建置。它提供了許多內建選項

  • 如需啟用除錯建置和最佳化層級,請參閱下一節關於「建置類型」的內容,

  • 以可移植的方式啟用 -Werror 是透過 -Dwerror=true 完成的,

  • 啟用警告層級是透過 -Dwarning_level=<val> 完成的,其中 <val>{0, 1, 2, 3, everything} 之一,

  • 還有許多其他內建選項,從啟用 Visual Studio (-Dvsenv=true) 和使用連結時間最佳化 (-Db_lto) 建置,到變更預設 C++ 語言層級 (-Dcpp_std='c++17') 或連結器旗標 (-Dcpp_link_args='-Wl,-z,defs')。

如需選項的完整概述,請參閱 Meson 的內建選項文件頁面

Meson 也支援標準環境變數 CFLAGSCXXFLAGSFFLAGSLDFLAGS 來注入額外旗標 - 與前一節中關於這些環境變數僅在全新建置而非增量建置中被選取的注意事項相同。

使用 Meson 的不同建置類型#

Meson 在配置專案時提供不同的建置類型。您可以在 Meson 文件中的「核心選項」章節中查看建置類型的可用選項。

假設您是從頭開始建置(如果需要,請執行 git clean -xdf),您可以如下配置建置以使用 debug 建置類型

meson setup build --buildtype debug  --prefix=$PWD/build-install

現在,您可以使用 dev.py 介面來進一步建置、安裝和測試 SciPy

python dev.py -s linalg

這會有效,因為在初始配置之後,Meson 會記住配置選項。

控制建置並行性#

預設情況下,ninja 將啟動 2*n_cpu + 2 個平行建置作業,其中 n_cpu 是實體 CPU 核心的數量。這在絕大多數情況下都很好,並產生接近最佳的建置時間。在某些情況下,在 RAM 相對 CPU 核心數量較小的機器上,這會導致作業記憶體不足。如果發生這種情況,請降低作業數量 N,以便每個作業至少有 2 GB RAM。例如,要啟動 6 個作業

python -m pip install . -Ccompile-args="-j6"

python dev.py build -j6

並行使用 GCC 和 Clang 建置#

在同一個儲存庫中擁有 SciPy 的多個建置可能很有用,例如比較兩個編譯器之間的差異以診斷問題。如前所述,Meson 是完全異地建置的,因此不同的建置不會互相干擾。在本節的其餘部分,我們假設 GCC 是預設值。例如,讓我們使用 GCC 和 Clang 進行建置。

  1. 使用 GCC 建置

    python dev.py build
    

使用上述命令,meson 將在 build 目錄中使用 (預設) GCC 編譯器進行建置,並安裝到 build-install 目錄。

  1. 使用 Clang 建置

    CC=clang CXX=clang++ FC=gfortran python dev.py --build-dir=build-clang build
    

使用上述命令,Meson 將在 build-clang 目錄中使用 Clang、Clang++ 和 Gfortran 編譯器進行建置,然後將 SciPy 安裝到 build-clang-install

Meson 會記住 build-clang 目錄的編譯器選擇,且無法變更,因此未來每次調用 python dev.py --build-dir=build-clang <command> 時,它都會自動使用 Clang。

提示:使用別名使其更易於使用,例如,alias dev-clang="python dev.py --build-dir=build-clang",然後 dev-clang build

擁有兩個建置的常見原因是為了比較它們之間的差異。例如,要針對使用兩個編譯器的建置執行 scipy.linalg 測試,請執行

python dev.py -s linalg                          # run tests for the GCC build
python dev.py --build-dir build-clang -s linalg  # run tests for the Clang build