使用 ServBay 進行二次編譯
ServBay 為 macOS 使用者提供一套強大且完整的本地 Web 開發環境,內建眾多軟體套件與工具。除了 ServBay 預設安裝的套件版本外,開發者有時可能必須針對特殊需求進行二次編譯,例如:
- 為某個軟體套件啟用特定的編譯選項。
- 新增 ServBay 預設未內含的模組或擴充功能(如新的 PHP 擴充或 PostgreSQL 模組)。
- 使用不同於 ServBay 預設版本的特定函式庫進行編譯。
- 對 ServBay 提供的套件做客製化修改。
ServBay 已經提供所需的編譯環境與工具鏈,讓您能夠輕鬆完成這些二次編譯的任務。
要順利進行二次編譯,建議您對 Unix/Linux 環境下的軟體編譯流程(如 configure
, make
, make install
)有基本認識。
前置作業
開始二次編譯前,請確認已完成以下準備:
安裝 ServBay Development Library: 這是進行二次編譯的核心依賴,包含 ServBay 環境內所有編譯所需的函式庫檔(
.so
,.a
)、標頭檔(.h
)等開發資源。您可以在 ServBay 應用程式界面的軟體套件面板找到並安裝它。安裝 Xcode Command Line Tools: 這是 macOS 系統提供的基本開發工具集,包含編譯器(Clang)、連結器等必要工具。在終端機執行下列指令進行安裝:
bashxcode-select --install
1若已安裝,系統會有提示。
安裝額外編譯工具: 為順利編譯多數開源軟體,還需要安裝
autoconf
、automake
、libtool
等工具。通常可用 Homebrew 套件管理器進行安裝:bashbrew install autoconf automake libtool cmake
1若尚未安裝 Homebrew,請先參考其官網說明進行安裝。
設定編譯環境
安裝好 ServBay Development Library 及其他必要工具後,需要初始化終端機的編譯環境。這步驟主要是設定一組環境變數(如 PATH
, CFLAGS
, LDFLAGS
, CPPFLAGS
),讓編譯器與建構系統知道 ServBay 的函式庫、標頭檔和執行檔位置,以利正確尋找依賴並連結。
ServBay 的執行環境會依您 Mac 的 CPU 架構(Intel 處理器-x86_64,或 Apple Silicon-Arm64)而有所不同。請根據目前的 ServBay Runtime 架構選擇對應的初始化指令。
檢查 ServBay Runtime 的 CPU 架構
您可以檢查 ServBay bin
目錄下的任一可執行檔案來判斷架構。例如,檢查 bison
:
# 在終端機執行下列指令查詢
$ file /Applications/ServBay/bin/bison
/Applications/ServBay/bin/bison: Mach-O 64-bit executable arm64
2
3
# 在終端機執行下列指令查詢
$ file /Applications/ServBay/bin/bison
/Applications/ServBay/bin/bison: Mach-O 64-bit executable x86_64
2
3
確認架構後,依據結果選擇所需的環境初始化腳本。
初始化編譯環境變數
開啟一個新的終端機視窗,將下方與您 CPU 架構對應的腳本複製貼上執行。這些腳本會設定完成 ServBay 編譯環境所需的各種路徑與標誌。
# 設定 CPU 核心數,提升編譯並行能力
CPU_NUMBER=$(sysctl -n hw.ncpu)
# ServBay 安裝根目錄
SERVBAY_BASE_FULL_PATH="/Applications/ServBay"
# 軟體套件目錄名稱
SERVBAY_PACKAGE_DIR_NAME="package"
# 軟體套件根路徑
SERVBAY_PACKAGE_FULL_PATH="${SERVBAY_BASE_FULL_PATH}/${SERVBAY_PACKAGE_DIR_NAME}"
# ServBay 執行檔路徑
SERVBAY_BIN_PATH="${SERVBAY_PACKAGE_FULL_PATH}/bin"
SERVBAY_SBIN_PATH="${SERVBAY_PACKAGE_FULL_PATH}/sbin"
# ServBay 設定檔路徑
SERVBAY_ETC_PATH="${SERVBAY_PACKAGE_FULL_PATH}/etc"
# ServBay 變數資料路徑
SERVBAY_VAR_PATH="${SERVBAY_PACKAGE_FULL_PATH}/var"
# ServBay Development Library 安裝路徑
SERVBAY_COMMON_PATH="${SERVBAY_PACKAGE_FULL_PATH}/common"
# ServBay Development Library 標頭路徑
SERVBAY_COMMON_INCLUDE_PATH="${SERVBAY_COMMON_PATH}/include"
# ServBay Development Library 函式庫路徑
SERVBAY_COMMON_LIB_PATH="${SERVBAY_COMMON_PATH}/lib"
SERVBAY_COMMON_LIBEXEC_PATH="${SERVBAY_COMMON_PATH}/libexec"
SERVBAY_COMMON_SHARE_PATH="${SERVBAY_COMMON_PATH}/share"
SERVBAY_COMMON_MAN_PATH="${SERVBAY_COMMON_PATH}/man"
SERVBAY_COMMON_DOC_PATH="${SERVBAY_COMMON_PATH}/doc"
# 當前建置目錄
SERVBAY_BUILD_DIR=$(pwd)
SERVBAY_BUILD_SRC_DIR=${SERVBAY_BUILD_DIR}/src
# OpenSSL 版本資訊
OPENSSL_SELECTED_VERSION="3.2"
OPENSSL_VERSION="3.2.1"
# 最低目標 macOS 版本(建議 Monterey 或更新)
BUILD_OS_MIN_VERSION="12.00"
# 建置 CPU 架構選項
BUILD_CPU_ARCH="-arch arm64"
BUILD_CPU_ARCH_CMAKE="arm64"
BUILD_MACOS_TARGET="" # Arm64 通常不需要指定 -target
# 設定 C 編譯器選項:最佳化、macOS 版本與架構
export CFLAGS="-Qunused-arguments -O3 -mmacosx-version-min=${BUILD_OS_MIN_VERSION} ${BUILD_CPU_ARCH} ${BUILD_MACOS_TARGET}"
# 設定連結器選項:rpath、函式庫目錄、macOS 版本與架構
export LDFLAGS="-Wl,-rpath -Wl,${SERVBAY_COMMON_LIB_PATH} -L${SERVBAY_COMMON_LIB_PATH} -L${SERVBAY_PACKAGE_FULL_PATH} -mmacosx-version-min=${BUILD_OS_MIN_VERSION} ${BUILD_CPU_ARCH} ${BUILD_MACOS_TARGET}"
# 設定預處理器與 CXX 編譯器的標頭目錄
export CPPFLAGS="-I${SERVBAY_COMMON_INCLUDE_PATH}"
# C++ 編譯器設定同 CFLAGS
export CXXFLAGS="-Qunused-arguments -O3 -mmacosx-version-min=${BUILD_OS_MIN_VERSION} ${BUILD_CPU_ARCH} ${BUILD_MACOS_TARGET}"
# 設定 PATH,優先使用 ServBay 專屬 bin/sbin
export PATH="${SERVBAY_BIN_PATH}:${SERVBAY_SBIN_PATH}:/usr/bin:/bin:/usr/sbin:/sbin:/Library/Apple/usr/bin"
# pkg-config 設定,用於查找函式庫資訊
export PKG_CONFIG_PATH="${SERVBAY_COMMON_LIB_PATH}/pkgconfig"
export PKG_CONFIG="${SERVBAY_BIN_PATH}/pkg-config"
export PKG_CONFIG_LIBDIR="${SERVBAY_COMMON_LIB_PATH}/pkgconfig"
# 系統與 Homebrew 路徑追加於 PATH 後端,作為備用
export PATH=$PATH:"/usr/local/bin:/usr/local/sbin"
export PATH=$PATH:"/opt/homebrew/bin/"
# 加入 OpenSSL 函式庫與標頭路徑至 LDFLAGS 與 CPPFLAGS
export LDFLAGS="-L${SERVBAY_COMMON_PATH}/openssl/${OPENSSL_SELECTED_VERSION}/lib ${LDFLAGS}"
export CPPFLAGS="-I${SERVBAY_COMMON_PATH}/openssl/${OPENSSL_SELECTED_VERSION}/include ${CPPFLAGS}"
# 新增 OpenSSL 的 pkgconfig 搜尋路徑
export PKG_CONFIG_PATH="${PKG_CONFIG_PATH}:${SERVBAY_COMMON_PATH}/openssl/${OPENSSL_SELECTED_VERSION}/lib/pkgconfig"
export PKG_CONFIG_LIBDIR="${PKG_CONFIG_LIBDIR}:${SERVBAY_COMMON_PATH}/openssl/${OPENSSL_SELECTED_VERSION}/lib/pkgconfig"
# 完成環境變數設定,現在可開始編譯作業
echo "ServBay Arm64 編譯環境已設定。"
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# 設定 CPU 核心數,提升編譯並行能力
CPU_NUMBER=$(sysctl -n hw.ncpu)
# ServBay 安裝根目錄
SERVBAY_BASE_FULL_PATH="/Applications/ServBay"
# 軟體套件目錄名稱
SERVBAY_PACKAGE_DIR_NAME="package"
# 軟體套件根路徑
SERVBAY_PACKAGE_FULL_PATH="${SERVBAY_BASE_FULL_PATH}/${SERVBAY_PACKAGE_DIR_NAME}"
# ServBay 執行檔路徑
SERVBAY_BIN_PATH="${SERVBAY_PACKAGE_FULL_PATH}/bin"
SERVBAY_SBIN_PATH="${SERVBAY_PACKAGE_FULL_PATH}/sbin"
# ServBay 設定檔路徑
SERVBAY_ETC_PATH="${SERVBAY_PACKAGE_FULL_PATH}/etc"
# ServBay 變數資料路徑
SERVBAY_VAR_PATH="${SERVBAY_PACKAGE_FULL_PATH}/var"
# ServBay Development Library 安裝路徑
SERVBAY_COMMON_PATH="${SERVBAY_PACKAGE_FULL_PATH}/common"
# ServBay Development Library 標頭路徑
SERVBAY_COMMON_INCLUDE_PATH="${SERVBAY_COMMON_PATH}/include"
# ServBay Development Library 函式庫路徑
SERVBAY_COMMON_LIB_PATH="${SERVBAY_COMMON_PATH}/lib"
SERVBAY_COMMON_LIBEXEC_PATH="${SERVBAY_COMMON_PATH}/libexec"
SERVBAY_COMMON_SHARE_PATH="${SERVBAY_COMMON_PATH}/share"
SERVBAY_COMMON_MAN_PATH="${SERVBAY_COMMON_PATH}/man"
SERVBAY_COMMON_DOC_PATH="${SERVBAY_COMMON_PATH}/doc"
# 當前建置目錄
SERVBAY_BUILD_DIR=$(pwd)
SERVBAY_BUILD_SRC_DIR=${SERVBAY_BUILD_DIR}/src
# OpenSSL 版本資訊
OPENSSL_SELECTED_VERSION="1.1.1u"
OPENSSL_VERSION="1.1.1u"
# 最低目標 macOS 版本(建議 Monterey 或更新)
BUILD_OS_MIN_VERSION="12.00"
# 建置 CPU 架構選項
BUILD_CPU_ARCH="-arch x86_64"
BUILD_CPU_ARCH_CMAKE="x86_64"
# Intel 通常需指定 -target
BUILD_MACOS_TARGET="-target x86_64-apple-macos${BUILD_OS_MIN_VERSION}"
# 設定 C 編譯器選項:最佳化、macOS 版本、架構與目標平台
export CFLAGS="-Qunused-arguments -O3 -mmacosx-version-min=${BUILD_OS_MIN_VERSION} ${BUILD_CPU_ARCH} ${BUILD_MACOS_TARGET}"
# 設定連結器選項:rpath、函式庫目錄、macOS 版本、架構與目標平台
export LDFLAGS="-Wl,-rpath -Wl,${SERVBAY_COMMON_LIB_PATH} -L${SERVBAY_COMMON_LIB_PATH} -L${SERVBAY_PACKAGE_FULL_PATH} -mmacosx-version-min=${BUILD_OS_MIN_VERSION} ${BUILD_CPU_ARCH} ${BUILD_MACOS_TARGET}"
# 設定預處理器與 CXX 編譯器的標頭目錄
export CPPFLAGS="-I${SERVBAY_COMMON_INCLUDE_PATH}"
# C++ 編譯器設定同 CFLAGS
export CXXFLAGS="-Qunused-arguments -O3 -mmacosx-version-min=${BUILD_OS_MIN_VERSION} ${BUILD_CPU_ARCH} ${BUILD_MACOS_TARGET}"
# 設定 PATH,優先使用 ServBay 專屬 bin/sbin
export PATH="${SERVBAY_BIN_PATH}:${SERVBAY_SBIN_PATH}:/usr/bin:/bin:/usr/sbin:/sbin:/Library/Apple/usr/bin"
# pkg-config 設定,用於查找函式庫資訊
export PKG_CONFIG_PATH="${SERVBAY_COMMON_LIB_PATH}/pkgconfig"
export PKG_CONFIG="${SERVBAY_BIN_PATH}/pkg-config"
export PKG_CONFIG_LIBDIR="${SERVBAY_COMMON_LIB_PATH}/pkgconfig"
# 系統與 Homebrew 路徑追加於 PATH 後端,作為備用
export PATH=$PATH:"/usr/local/bin:/usr/local/sbin"
export PATH=$PATH:"/opt/homebrew/bin/"
# 加入 OpenSSL 函式庫與標頭路徑至 LDFLAGS 與 CPPFLAGS
export LDFLAGS="-L${SERVBAY_COMMON_PATH}/openssl/${OPENSSL_SELECTED_VERSION}/lib ${LDFLAGS}"
export CPPFLAGS="-I${SERVBAY_COMMON_PATH}/openssl/${OPENSSL_SELECTED_VERSION}/include ${CPPFLAGS}"
# 新增 OpenSSL 的 pkgconfig 搜尋路徑
export PKG_CONFIG_PATH="${PKG_CONFIG_PATH}:${SERVBAY_COMMON_PATH}/openssl/${OPENSSL_SELECTED_VERSION}/lib/pkgconfig"
export PKG_CONFIG_LIBDIR="${PKG_CONFIG_LIBDIR}:${SERVBAY_COMMON_PATH}/openssl/${OPENSSL_SELECTED_VERSION}/lib/pkgconfig"
# 完成環境變數設定,現在可開始編譯作業
echo "ServBay x86_64 編譯環境已設定。"
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
重要提示: 這些環境變數只在目前終端機會話內有效。如關閉終端機或開啟新會話,需重新執行相對應的腳本建立編譯環境。
編譯範例
於設定好編譯環境的終端機下,您可開始下載原始碼並進行編譯。以下提供數個常見的編譯示範。
編譯 ImageMagick
ImageMagick 是一款功能強大的圖像處理函式庫,也是 PHP imagick
擴充的依賴項。ServBay 預設已安裝好 ImageMagick,一般情況不用自行編譯。以下僅作為展示,說明在 ServBay 環境下如何編譯典型 Autotools(configure/make)專案。
下載 ImageMagick 原始碼並解壓縮:
bash# 請視需求替換成最新版本號 wget https://imagemagick.org/archive/releases/ImageMagick-7.1.1-33.tar.gz tar zxvf ImageMagick-7.1.1-33.tar.gz cd ImageMagick-7.1.1-33
1
2
3
4執行
./configure
腳本: 請使用前述設定好的環境變數來執行 configure。--prefix
、--libdir
、--includedir
等選項用於設定安裝位置,我們會指向 ServBay Development Library 的公用目錄${SERVBAY_COMMON_PATH}
及相關子目錄,使編譯完成的函式庫與標頭能被 ServBay 其他套件(如 PHPimagick
擴充)找到。其餘選項依 ImageMagick 需求調整。bash./configure \ --prefix=${SERVBAY_COMMON_PATH} \ --libdir=${SERVBAY_COMMON_LIB_PATH} \ --includedir=${SERVBAY_COMMON_INCLUDE_PATH} \ --oldincludedir=${SERVBAY_COMMON_INCLUDE_PATH} \ --bindir=${SERVBAY_BIN_PATH} \ --sbindir=${SERVBAY_SBIN_PATH} \ --sysconfdir=${SERVBAY_ETC_PATH} \ --datarootdir=${SERVBAY_COMMON_SHARE_PATH} \ --enable-osx-universal-binary=no \ --disable-silent-rules \ --disable-opencl \ --enable-shared \ --enable-static \ --with-freetype=yes \ --with-gvc=no \ --with-modules \ --with-webp=yes \ --with-heic=no \ --without-gslib \ --with-fpx=no \ --without-openexexr \ --with-raw=yes \ --without-lqr \ --without-djvu \ --without-fftw \ --without-pango \ --without-wmf \ --without-x \ --with-gs-font-dir=${SERVBAY_COMMON_SHARE_PATH}/ghostscript/10.02.1/Resource/Font
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30執行
make
與make install
:make
指令會依據配置編譯專案,可搭配-j ${CPU_NUMBER}
充分利用多核 CPU 加速過程。make install
則將成品安裝至--prefix
指定的 ServBay Development Library 目錄。bashmake -j ${CPU_NUMBER} make install
1
2
使用 cmake 編譯套件
對於採用 cmake
為建構系統的軟體套件,編譯流程略有差異。以下以 protobuf
(Protocol Buffers) 為示範。
下載 protobuf 原始碼並進入目錄。
使用
cmake
設定專案:-S .
指定來源目錄,-B builddir
指定建置檔案輸出目錄。-DCMAKE_INSTALL_PREFIX
等選項功能如同 Autotools 的--prefix
,即設定安裝至 ServBay Development Library 目錄。-DCMAKE_MACOSX_RPATH=1
和-DCMAKE_INSTALL_RPATH
則可確保新編譯的函式庫可正確找到 ServBay 其他函式庫。bash# 假設您已進入 protobuf 原始碼目錄 cmake -S . -B builddir \ -DCMAKE_INSTALL_PREFIX=${SERVBAY_COMMON_PATH} \ -DCMAKE_INSTALL_LIBDIR=${SERVBAY_COMMON_LIB_PATH} \ -DCMAKE_INSTALL_INCLUDEDIR=${SERVBAY_COMMON_INCLUDE_PATH} \ -DCMAKE_INSTALL_BINDIR=${SERVBAY_BIN_PATH} \ -DCMAKE_INSTALL_SBINDIR=${SERVBAY_SBIN_PATH} \ -DCMAKE_INSTALL_SYSCONFDIR=${SERVBAY_ETC_PATH} \ -DCMAKE_INSTALL_DATAROOTDIR=${SERVBAY_COMMON_SHARE_PATH} \ -DCMAKE_MACOSX_RPATH=1 \ -DCMAKE_INSTALL_RPATH=${SERVBAY_COMMON_LIB_PATH} \ -DCMAKE_BUILD_WITH_INSTALL_RPATH=TRUE \ -DCMAKE_PREFIX_PATH=${SERVBAY_COMMON_PATH} \ -DBUILD_SHARED_LIBS=ON \ -Dprotobuf_BUILD_LIBPROTOC=ON \ -Dprotobuf_BUILD_SHARED_LIBS=ON \ -Dprotobuf_INSTALL_EXAMPLES=OFF \ -Dprotobuf_BUILD_TESTS=OFF \ -Dprotobuf_ABSL_PROVIDER=package \ -Dprotobuf_JSONCPP_PROVIDER=module \ -DCMAKE_CXX_STANDARD=17
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21執行
cmake --build
及cmake --install
:cmake --build builddir
會在builddir
目錄執行編譯;cmake --install builddir
則會將產出安裝到-DCMAKE_INSTALL_PREFIX
所指定的 ServBay Development Library 目錄。bashcmake --build builddir -j ${CPU_NUMBER} cmake --install builddir
1
2
編譯 PHP 模組
若您需為 ServBay 某版本 PHP 增加自訂擴充套件(如 swoole
、redis
、mongodb
等),請參考專用教學文件:
編譯 PostgreSQL 模組
若您需為 ServBay 某版本 PostgreSQL 增加自訂模組,請參考專用教學文件:
小結
藉助 ServBay 所提供的 Development Library 與完整環境變數設定,開發者可在 macOS 上輕鬆實現軟體套件的二次編譯與自訂。這大幅提升了專案開發的靈活性,無論用於滿足特殊需求,還是為了導入最新版函式庫皆宜。請在編譯前務必詳讀原始軟體官方說明,並依其指引調整相關設定與步驟。