建置 Arrow C++#
系統設定#
Arrow 使用 CMake 作為建置組態系統。我們建議進行 out-of-source 建置。如果您不熟悉此術語
In-source 建置(源碼內建置):
cmake
直接從cpp
目錄中調用。當您希望維護多個建置環境時(例如,一個用於除錯建置,另一個用於發布建置),這種方式可能不夠彈性Out-of-source 建置(源碼外建置):
cmake
從另一個目錄調用,建立一個隔離的建置環境,該環境不會與任何其他建置環境互動。例如,您可以建立cpp/build-debug
目錄,並從此目錄中調用cmake $CMAKE_ARGS ..
建置需求
支援 C++17 的編譯器。在 Linux 上,gcc 7.1 或更高版本應已足夠。對於 Windows,至少需要 Visual Studio VS2017。
CMake 3.16 或更高版本
在 Linux 和 macOS 上,需要
make
或ninja
建置工具最少 1GB 的 RAM 用於最小化建置,4GB 用於包含測試的最小化除錯建置,以及 8GB 用於使用 docker 的完整建置。
在 Ubuntu/Debian 上,您可以使用以下命令安裝所需套件:
sudo apt-get install \
build-essential \
ninja-build \
cmake
在 Alpine Linux 上
apk add autoconf \
bash \
cmake \
g++ \
gcc \
ninja \
make
在 Fedora Linux 上
sudo dnf install \
cmake \
gcc \
gcc-c++ \
ninja-build \
make
在 Arch Linux 上
sudo pacman -S --needed \
base-devel \
ninja \
cmake
在 macOS 上,您可以使用 Homebrew
git clone https://github.com/apache/arrow.git
cd arrow
brew update && brew bundle --file=cpp/Brewfile
使用 vcpkg
git clone https://github.com/apache/arrow.git
cd arrow
vcpkg install \
--x-manifest-root cpp \
--feature-flags=versions \
--clean-after-build
在 MSYS2 上
pacman --sync --refresh --noconfirm \
ccache \
git \
mingw-w64-${MSYSTEM_CARCH}-boost \
mingw-w64-${MSYSTEM_CARCH}-brotli \
mingw-w64-${MSYSTEM_CARCH}-cmake \
mingw-w64-${MSYSTEM_CARCH}-gcc \
mingw-w64-${MSYSTEM_CARCH}-gflags \
mingw-w64-${MSYSTEM_CARCH}-glog \
mingw-w64-${MSYSTEM_CARCH}-gtest \
mingw-w64-${MSYSTEM_CARCH}-lz4 \
mingw-w64-${MSYSTEM_CARCH}-protobuf \
mingw-w64-${MSYSTEM_CARCH}-python3-numpy \
mingw-w64-${MSYSTEM_CARCH}-rapidjson \
mingw-w64-${MSYSTEM_CARCH}-snappy \
mingw-w64-${MSYSTEM_CARCH}-thrift \
mingw-w64-${MSYSTEM_CARCH}-zlib \
mingw-w64-${MSYSTEM_CARCH}-zstd
建置#
以下所有指示都假設您已克隆 Arrow git 儲存庫並導航至 cpp
子目錄
$ git clone https://github.com/apache/arrow.git
$ cd arrow/cpp
CMake 預設配置#
使用 CMake 3.21.0 或更高版本,提供了一些適用於各種建置組態的預設配置。您可以使用 cmake --list-presets
取得可用預設配置的列表
$ cmake --list-presets # from inside the `cpp` subdirectory
Available configure presets:
"ninja-debug-minimal" - Debug build without anything enabled
"ninja-debug-basic" - Debug build with tests and reduced dependencies
"ninja-debug" - Debug build with tests and more optional components
[ etc. ]
您可以使用 cmake -N --preset <預設配置名稱>
檢查給定預設配置啟用的特定選項
$ cmake --preset -N ninja-debug-minimal
Preset CMake variables:
ARROW_BUILD_INTEGRATION="OFF"
ARROW_BUILD_STATIC="OFF"
ARROW_BUILD_TESTS="OFF"
ARROW_EXTRA_ERROR_CONTEXT="ON"
ARROW_WITH_RE2="OFF"
ARROW_WITH_UTF8PROC="OFF"
CMAKE_BUILD_TYPE="Debug"
您也可以從給定的預設配置建立建置
$ mkdir build # from inside the `cpp` subdirectory
$ cd build
$ cmake .. --preset ninja-debug-minimal
Preset CMake variables:
ARROW_BUILD_INTEGRATION="OFF"
ARROW_BUILD_STATIC="OFF"
ARROW_BUILD_TESTS="OFF"
ARROW_EXTRA_ERROR_CONTEXT="ON"
ARROW_WITH_RE2="OFF"
ARROW_WITH_UTF8PROC="OFF"
CMAKE_BUILD_TYPE="Debug"
-- Building using CMake version: 3.21.3
[ etc. ]
然後要求編譯建置目標
$ cmake --build .
[142/142] Creating library symlink debug/libarrow.so.700 debug/libarrow.so
$ tree debug/
debug/
├── libarrow.so -> libarrow.so.700
├── libarrow.so.700 -> libarrow.so.700.0.0
└── libarrow.so.700.0.0
0 directories, 3 files
$ cmake --install .
建立建置時,除了預設配置定義的選項外,還可以傳遞自訂選項,例如
$ cmake .. --preset ninja-debug-minimal -DCMAKE_INSTALL_PREFIX=/usr/local
注意
CMake 預設配置旨在協助您開始 Arrow 開發並理解常見的建置組態。它們不保證是不可變的,但未來可能會根據回饋進行變更。
強烈建議自動化建置、持續整合、發布腳本等使用手動組態,而不是依賴 CMake 預設配置,如下所述。
另請參閱
手動組態#
建置系統預設使用 CMAKE_BUILD_TYPE=release
,因此如果省略此參數,將會產生發布版本建置。
注意
您需要在 Windows 上建置時設定更多選項。詳情請參閱 在 Windows 上開發。
有幾種可能的建置類型
Debug
:不套用任何編譯器最佳化,並在二進位檔中新增除錯資訊。RelWithDebInfo
:套用編譯器最佳化,同時在二進位檔中新增除錯資訊。Release
:套用編譯器最佳化,並從二進位檔中移除除錯資訊。
注意
這些建置類型預設提供合適的最佳化/除錯標誌,但您可以透過指定 -DARROW_C_FLAGS_${BUILD_TYPE}=...
和/或 -DARROW_CXX_FLAGS_${BUILD_TYPE}=...
來變更它們。${BUILD_TYPE}
是建置類型的大寫形式。例如,Debug
建置類型使用 DEBUG
(-DARROW_C_FLAGS_DEBUG=...
/ -DARROW_CXX_FLAGS_DEBUG=...
),RelWithDebInfo
建置類型使用 RELWITHDEBINFO
(-DARROW_C_FLAGS_RELWITHDEBINFO=...
/ -DARROW_CXX_FLAGS_RELWITHDEBINFO=...
)。
例如,您可以將 -O3
作為 Release
建置類型的最佳化標誌,方法是傳遞 -DARROW_CXX_FLAGS_RELEASE=-O3
。您可以將 -g3
作為 Debug
建置類型的除錯標誌,方法是傳遞 -DARROW_CXX_FLAGS_DEBUG=-g3
。
您也可以使用標準的 CMAKE_C_FLAGS_${BUILD_TYPE}
和 CMAKE_CXX_FLAGS_${BUILD_TYPE}
變數,但建議使用 ARROW_C_FLAGS_${BUILD_TYPE}
和 ARROW_CXX_FLAGS_${BUILD_TYPE}
變數。CMAKE_C_FLAGS_${BUILD_TYPE}
和 CMAKE_CXX_FLAGS_${BUILD_TYPE}
變數會取代 CMake 提供的所有預設標誌,而 ARROW_C_FLAGS_${BUILD_TYPE}
和 ARROW_CXX_FLAGS_${BUILD_TYPE}
僅附加指定的標誌,這樣可以選擇性地覆寫某些預設值。
您也可以使用標誌 -DARROW_EXTRA_ERROR_CONTEXT=ON
執行預設建置,請參閱 額外的除錯協助。
最小化發布版本建置(建議使用 1GB 或更多的 RAM 來進行建置)
$ mkdir build-release
$ cd build-release
$ cmake ..
$ make -j8 # if you have 8 CPU cores, otherwise adjust
$ make install
包含單元測試的最小化除錯建置(建議使用 4GB 或更多的 RAM 來進行建置)
$ git submodule update --init --recursive
$ export ARROW_TEST_DATA=$PWD/../testing/data
$ mkdir build-debug
$ cd build-debug
$ cmake -DCMAKE_BUILD_TYPE=Debug -DARROW_BUILD_TESTS=ON ..
$ make -j8 # if you have 8 CPU cores, otherwise adjust
$ make unittest # to run the tests
$ make install
單元測試預設不會建置。建置完成後,也可以使用 CMake 提供的 ctest
工具調用單元測試(請注意,test
依賴於 python
的可用性)。
在某些 Linux 發行版上,執行測試套件可能需要設定明確的 locale。如果您看到任何與 locale 相關的錯誤,請嘗試設定環境變數(這需要 locales
套件或等效套件)
$ export LC_ALL="en_US.UTF-8"
使用 Ninja 加速建置#
許多貢獻者使用 Ninja 建置系統 來獲得更快的建置速度。它尤其可以加速增量建置。要使用 ninja
,請在調用 cmake
時傳遞 -GNinja
,然後使用 ninja
命令而不是 make
。
Unity 建置#
CMake 的 unity builds 選項可以顯著加快完整建置速度,但也會增加記憶體需求。如果記憶體消耗不是問題,請考慮開啟它(使用 -DCMAKE_UNITY_BUILD=ON
)。
可選組件#
預設情況下,C++ 建置系統會建立相當精簡的建置。我們有幾個可選的系統組件,您可以透過將布林標誌傳遞給 cmake
來選擇建置它們。
-DARROW_BUILD_UTILITIES=ON
:建置 Arrow 命令列工具-DARROW_COMPUTE=ON
:建置所有計算核心函數-DARROW_CSV=ON
:CSV 讀取器模組-DARROW_CUDA=ON
:用於 GPU 開發的 CUDA 整合。依賴 NVIDIA CUDA 工具包。用於建置函式庫的 CUDA 工具鏈可以使用$CUDA_HOME
環境變數進行自訂。-DARROW_DATASET=ON
:Dataset API,意味著 Filesystem API-DARROW_FILESYSTEM=ON
:Filesystem API,用於存取本地和遠端檔案系統-DARROW_FLIGHT=ON
:Arrow Flight RPC 系統,至少依賴 gRPC-DARROW_FLIGHT_SQL=ON
:Arrow Flight SQL-DARROW_GANDIVA=ON
:Gandiva 表達式編譯器,依賴 LLVM、Protocol Buffers 和 re2-DARROW_GANDIVA_JAVA=ON
:Gandiva JNI 綁定,適用於 Java-DARROW_GCS=ON
:建置支援 GCS 的 Arrow(需要 GCloud SDK for C++)-DARROW_HDFS=ON
:Arrow 與 libhdfs 的整合,用於存取 Hadoop 檔案系統-DARROW_JEMALLOC=ON
:建置基於 jemalloc 的 Arrow 分配器,預設為開啟-DARROW_JSON=ON
:JSON 讀取器模組-DARROW_MIMALLOC=ON
:建置基於 mimalloc 的 Arrow 分配器-DARROW_ORC=ON
:Arrow 與 Apache ORC 的整合-DARROW_PARQUET=ON
:Apache Parquet 函式庫與 Arrow 整合-DPARQUET_REQUIRE_ENCRYPTION=ON
:Parquet 模組化加密-DARROW_PYTHON=ON
:此選項自 10.0.0 版本起已棄用。將在未來版本中移除。請改用 CMake 預設配置。或者,您可以直接啟用ARROW_COMPUTE
、ARROW_CSV
、ARROW_DATASET
、ARROW_FILESYSTEM
、ARROW_HDFS
和ARROW_JSON
。-DARROW_S3=ON
:支援與 Amazon S3 相容的檔案系統-DARROW_SUBSTRAIT=ON
:建置支援 Substrait-DARROW_WITH_RE2=ON
:建置時支援使用 re2 函式庫的正規表示式,預設為開啟,並在ARROW_COMPUTE
或ARROW_GANDIVA
為ON
時使用-DARROW_WITH_UTF8PROC=ON
:建置時支援使用 utf8proc 函式庫的 Unicode 屬性,預設為開啟,並在ARROW_COMPUTE
或ARROW_GANDIVA
為ON
時使用-DARROW_TENSORFLOW=ON
:建置啟用 TensorFlow 支援的 Arrow
Arrow 中可用的壓縮選項包括
-DARROW_WITH_BROTLI=ON
:建置 Brotli 壓縮支援-DARROW_WITH_BZ2=ON
:建置 BZ2 壓縮支援-DARROW_WITH_LZ4=ON
:建置 lz4 壓縮支援-DARROW_WITH_SNAPPY=ON
:建置 Snappy 壓縮支援-DARROW_WITH_ZLIB=ON
:建置 zlib (gzip) 壓縮支援-DARROW_WITH_ZSTD=ON
:建置 ZSTD 壓縮支援
如果您的應用程式不需要核心 Arrow 共享函式庫的某些功能,可以將其關閉以縮短建置時間
-DARROW_IPC=ON
:建置 IPC 擴充功能
注意
如果您的使用案例僅限於讀取/寫入 Arrow 資料,則預設選項應已足夠。但是,如果您希望建置任何測試/效能基準測試,則還需要 ARROW_JSON
(它將自動啟用)。如果需要擴充格式支援,則新增 ARROW_PARQUET
、ARROW_CSV
、ARROW_JSON
或 ARROW_ORC
不應啟用任何額外的組件。
注意
一般來說,如果您預期使用超出 cast
之外的任何計算核心,則最好啟用 ARROW_COMPUTE
。雖然預設情況下內建了一些額外的核心(截至 12.0.0 版本),但此列表未來可能會變更,因為它部分基於目前格式實作中核心的使用情況。
可選目標#
對於開發建置,您通常會想要啟用額外的目標,以便測試您的變更,使用以下 cmake
選項。
-DARROW_BUILD_BENCHMARKS=ON
:建置可執行效能基準測試。-DARROW_BUILD_EXAMPLES=ON
:建置使用 Arrow C++ API 的範例。-DARROW_BUILD_INTEGRATION=ON
:建置額外的可執行檔,用於測試不同 Arrow 實作之間的協定互通性。-DARROW_BUILD_UTILITIES=ON
:建置可執行工具。-DARROW_BUILD_TESTS=ON
:建置可執行單元測試。-DARROW_ENABLE_TIMING_TESTS=ON
:如果建置單元測試,則啟用那些依賴實際時間計時的單元測試(此標誌在 CI 上停用,因為它可能會使測試結果不穩定)。-DARROW_FUZZING=ON
:建置模糊測試目標和相關的可執行檔。
可選檢查#
以下特殊檢查也可用。它們以各種方式檢測產生的程式碼,以便在運行時(例如在執行單元測試時)檢測特定類別的問題。
-DARROW_USE_ASAN=ON
:啟用 Address Sanitizer 以檢查記憶體洩漏、緩衝區溢位或其他類型的記憶體管理問題。-DARROW_USE_TSAN=ON
:啟用 Thread Sanitizer 以檢查多執行緒程式碼中的競爭條件。-DARROW_USE_UBSAN=ON
:啟用 Undefined Behavior Sanitizer 以檢查觸發 C++ 未定義行為的情況。
其中一些選項彼此不相容,因此如果您想測試所有選項,可能需要使用不同的選項建置多次。
CMake 版本需求#
我們支援 CMake 3.16 及更高版本。
LLVM 和 Clang 工具#
我們目前使用 LLVM 進行函式庫建置,以及其他開發人員工具,例如使用 clang-format
進行程式碼格式化。LLVM 可以透過大多數現代套件管理器(apt、yum、conda、Homebrew、vcpkg、chocolatey)安裝。
建置依賴管理#
建置系統支援許多第三方依賴項
AWSSDK
:用於 S3 支援,需要系統 cURL,並且可以使用下面描述的BUNDLED
方法
benchmark
:Google benchmark,用於測試
Boost
:用於跨平台支援
Brotli
:用於資料壓縮
BZip2
:用於資料壓縮
c-ares
:gRPC 的依賴項
gflags
:用於命令列工具(以前稱為 Googleflags)
GLOG
:用於日誌記錄
google_cloud_cpp_storage
:用於 Google Cloud Storage 支援,需要系統 cURL,並且可以使用下面描述的BUNDLED
方法
gRPC
:用於遠端程序調用
GTest
:Googletest,用於測試
LLVM
:Gandiva 的依賴項
Lz4
:用於資料壓縮
ORC
:用於 Apache ORC 格式支援
re2
:用於計算核心和 Gandiva,gRPC 的依賴項
Protobuf
:Google Protocol Buffers,用於資料序列化
RapidJSON
:用於資料序列化
Snappy
:用於資料壓縮
Thrift
:Apache Thrift,用於資料序列化
utf8proc
:用於計算核心
ZLIB
:用於資料壓縮
zstd
:用於資料壓縮
CMake 選項 ARROW_DEPENDENCY_SOURCE
是一個全域選項,用於指示建置系統如何解析每個依賴項。有幾個選項
AUTO
:嘗試在系統預設位置尋找套件,如果找不到則從源碼建置BUNDLED
:自動從源碼建置依賴項SYSTEM
:使用 CMake 的內建find_package
函數在系統路徑中尋找依賴項,或對於不具備此功能的套件使用pkg-config
CONDA
:使用$CONDA_PREFIX
作為替代的SYSTEM
路徑VCPKG
:尋找 vcpkg 安裝的依賴項,如果找不到,則執行vcpkg install
來安裝它們BREW
:使用 Homebrew 預設路徑作為替代的SYSTEM
路徑
預設方法是 AUTO
,除非您在活動的 conda 環境中開發(透過 $CONDA_PREFIX
環境變數的存在來偵測),在這種情況下,預設方法是 CONDA
。
個別依賴項解析#
雖然 -DARROW_DEPENDENCY_SOURCE=$SOURCE
為所有套件設定了全域預設值,但可以透過設定 -D$PACKAGE_NAME_SOURCE=..
來覆寫個別套件的解析策略。例如,要從源碼建置 Protocol Buffers,請設定
-DProtobuf_SOURCE=BUNDLED
不幸的是,此變數區分大小寫;每個套件使用的名稱在上面列出,但最新的列表可以在 cpp/cmake_modules/ThirdpartyToolchain.cmake 中找到。
捆綁依賴項版本#
當使用 BUNDLED
方法從源碼建置依賴項時,將使用 cpp/thirdparty/versions.txt
中的版本號碼。還有一個依賴項源碼下載器腳本(見下文),可用於設定離線建置。
當使用 BUNDLED
進行依賴項解析時(如果您使用建議的 jemalloc 或 mimalloc 分配器),在第三方專案中靜態連結 Arrow 函式庫會更複雜。請參閱下文,了解在這種情況下如何組態您的建置系統的說明。
離線建置#
如果您不使用上述變數來指示 Arrow 建置系統使用預先安裝的依賴項,它們將由 Arrow 建置系統自動建置。每個依賴項的源碼歸檔將透過網際網路下載,這可能會在網際網路存取受限的環境中造成問題。
要啟用離線建置,您可以自行下載源碼成品,並使用 ARROW_$LIBRARY_URL
形式的環境變數,以指示建置系統從本機檔案讀取而不是存取網際網路。
為了讓您更輕鬆,我們準備了一個腳本 thirdparty/download_dependencies.sh
,它會將每個依賴項的正確版本下載到您選擇的目錄中。它將在末尾列印 bash 樣式的環境變數語句列表,以用於您的建置腳本。
# Download tarballs into $HOME/arrow-thirdparty
$ ./thirdparty/download_dependencies.sh $HOME/arrow-thirdparty
然後,您可以調用 CMake 來建立建置目錄,它將使用宣告的環境變數指向已下載的歸檔,而不是下載它們(每個建置目錄一個!)。
靜態連結#
當 -DARROW_BUILD_STATIC=ON
時,由 Arrow 建置系統建置為靜態函式庫的所有建置依賴項將合併在一起,以建立一個靜態函式庫 arrow_bundled_dependencies
。在類 UNIX 環境(Linux、macOS、MinGW)中,這稱為 libarrow_bundled_dependencies.a
,在 Windows 上使用 Visual Studio 則稱為 arrow_bundled_dependencies.lib
。這個「依賴項捆綁」函式庫與其他 Arrow 靜態函式庫安裝在相同的位置。
如果您使用 CMake,當您使用 arrow_static
CMake 目標進行連結時,捆綁的依賴項將會自動包含在內。在其他建置系統中,您可能需要明確地連結到依賴項捆綁包。我們建立了一個CMake 基礎的建置配置範例,向您展示一個可運作的範例。
在 Linux 和 macOS 上,如果您的應用程式尚未連結到 pthread
函式庫,您必須在您的連結器設定中包含 -pthread
。在 CMake 中,這可以使用 Threads
內建套件來完成。
set(THREADS_PREFER_PTHREAD_FLAG ON)
find_package(Threads REQUIRED)
target_link_libraries(my_target PRIVATE Threads::Threads)
額外的偵錯幫助#
如果您使用 CMake 選項 -DARROW_EXTRA_ERROR_CONTEXT=ON
,它將會在 RETURN_NOT_OK
巨集內的錯誤檢查中,編譯包含額外偵錯資訊的函式庫。在具有 ASSERT_OK
的單元測試中,這將產生類似以下的錯誤輸出:
../src/arrow/ipc/ipc-read-write-test.cc:609: Failure
Failed
../src/arrow/ipc/metadata-internal.cc:508 code: TypeToFlatbuffer(fbb, *field.type(), &children, &layout, &type_enum, dictionary_memo, &type_offset)
../src/arrow/ipc/metadata-internal.cc:598 code: FieldToFlatbuffer(fbb, *schema.field(i), dictionary_memo, &offset)
../src/arrow/ipc/metadata-internal.cc:651 code: SchemaToFlatbuffer(fbb, schema, dictionary_memo, &fb_schema)
../src/arrow/ipc/writer.cc:697 code: WriteSchemaMessage(schema_, dictionary_memo_, &schema_fb)
../src/arrow/ipc/writer.cc:730 code: WriteSchema()
../src/arrow/ipc/writer.cc:755 code: schema_writer.Write(&dictionaries_)
../src/arrow/ipc/writer.cc:778 code: CheckStarted()
../src/arrow/ipc/ipc-read-write-test.cc:574 code: writer->WriteRecordBatch(batch)
NotImplemented: Unable to convert type: decimal(19, 4)
棄用和 API 變更#
我們使用巨集 ARROW_DEPRECATED
,它為已棄用的 API 包裝了 C++ deprecated 屬性。建議的做法是使用 -Werror=deprecated-declarations
(適用於 GCC/Clang 或其他編譯器的類似標誌) 編譯第三方應用程式,以主動捕捉並考量 API 變更。
模組化建置目標#
由於 C++ 專案有幾個主要部分,我們為建置每個函式庫組件、單元測試和基準測試群組及其依賴項,提供了模組化的 CMake 目標。
make arrow
用於 Arrow 核心函式庫make parquet
用於 Parquet 函式庫make gandiva
用於 Gandiva (LLVM 表達式編譯器) 函式庫
注意
如果您已選擇 Ninja 作為 CMake 產生器,請將 make arrow
替換為 ninja arrow
,依此類推。
若要建置單元測試或基準測試,請將 -tests
或 -benchmarks
新增至目標名稱。因此,make arrow-tests
將會建置 Arrow 核心單元測試。使用 -all
目標,例如 parquet-all
,將會建置所有項目。
如果您希望僅建置和安裝一個或多個專案子組件,我們提供了 CMake 選項 ARROW_OPTIONAL_INSTALL
,僅安裝已建置的目標。例如,如果您只希望建置 Parquet 函式庫、其測試及其依賴項,您可以執行
cmake .. -DARROW_PARQUET=ON \
-DARROW_OPTIONAL_INSTALL=ON \
-DARROW_BUILD_TESTS=ON
make parquet
make install
如果您在調用 make
時省略明確的目標,則將會建置所有目標。
在 macOS 上使用 Xcode 偵錯#
Xcode 是 macOS 提供的 IDE,可用於透過產生 Xcode 專案來開發和偵錯 Arrow。
cd cpp
mkdir xcode-build
cd xcode-build
cmake .. -G Xcode -DARROW_BUILD_TESTS=ON -DCMAKE_BUILD_TYPE=DEBUG
open arrow.xcodeproj
這將產生一個專案並在 Xcode 應用程式中開啟它。作為替代方案,命令 xcodebuild
將使用產生的專案執行命令列建置。建議在首次啟動專案時使用 “自動建立 Schemes” 選項。選擇自動產生的 scheme 將允許您建置和執行啟用斷點的單元測試。