使用 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,请先参考 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
:
bash
# 在终端中执行以下命令检查
$ file /Applications/ServBay/bin/bison
/Applications/ServBay/bin/bison: Mach-O 64-bit executable arm64
1
2
3
2
3
bash
# 在终端中执行以下命令检查
$ file /Applications/ServBay/bin/bison
/Applications/ServBay/bin/bison: Mach-O 64-bit executable x86_64
1
2
3
2
3
确认架构后,根据结果选择对应的环境初始化脚本。
初始化编译环境变量
打开一个新的终端窗口,将以下与您 CPU 架构对应的脚本复制并粘贴到终端中执行。这些脚本会设置 ServBay 编译环境所需的各种路径和标志。
bash
# 设置 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"
# 构建目标操作系统最低版本
BUILD_OS_MIN_VERSION="12.00" # macOS Monterey 或更高
# 构建 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)、库搜索路径 (-L)、最低 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}"
# 设置 C 预处理器和 CXX 编译器标志:头文件搜索路径 (-I)
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}"
# 设置可执行文件搜索路径:优先使用 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"
# 指定 pkg-config 工具路径
export PKG_CONFIG="${SERVBAY_BIN_PATH}/pkg-config"
# 设置 pkg-config 库目录
export PKG_CONFIG_LIBDIR="${SERVBAY_COMMON_LIB_PATH}/pkgconfig"
# 将系统及 Homebrew 的 bin/sbin 路径添加到 PATH 后,作为备选
export PATH=$PATH:"/usr/local/bin:/usr/local/sbin"
export PATH=$PATH:"/opt/homebrew/bin/" # Homebrew 默认安装路径
# 添加 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 编译环境已设置。"
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
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
67
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
67
bash
# 设置 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"
# 构建目标操作系统最低版本
BUILD_OS_MIN_VERSION="12.00" # macOS Monterey 或更高
# 构建 CPU 架构标志
BUILD_CPU_ARCH="-arch x86_64"
BUILD_CPU_ARCH_CMAKE="x86_64"
# 构建目标平台标志 (Intel 芯片通常需要指定)
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)、库搜索路径 (-L)、最低 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}"
# 设置 C 预处理器和 CXX 编译器标志:头文件搜索路径 (-I)
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}"
# 设置可执行文件搜索路径:优先使用 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"
# 指定 pkg-config 工具路径
export PKG_CONFIG="${SERVBAY_BIN_PATH}/pkg-config"
# 设置 pkg-config 库目录
export PKG_CONFIG_LIBDIR="${SERVBAY_COMMON_LIB_PATH}/pkgconfig"
# 将系统及 Homebrew 的 bin/sbin 路径添加到 PATH 后,作为备选
export PATH=$PATH:"/usr/local/bin:/usr/local/sbin"
export PATH=$PATH:"/opt/homebrew/bin/" # Homebrew 默认安装路径
# 添加 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 编译环境已设置。"
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
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
67
68
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
67
68
重要提示: 这些环境变量仅在当前终端会话中生效。如果您关闭终端或打开新的终端窗口,需要重新执行相应的脚本来设置编译环境。
编译示例
在设置好编译环境的终端窗口中,您现在可以下载源代码并进行编译了。以下是几个常见的编译示例。
编译 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
指定在builddir
目录中生成构建文件。-DCMAKE_INSTALL_PREFIX
等选项的作用类似于 Autotools 的--prefix
,指定安装路径到 ServBay Development Library 目录。其他-D
选项是protobuf
特定的编译配置。-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 上进行软件包的二次编译和定制。这为您提供了极大的灵活性,以满足特定的项目需求或使用最新的库版本。请务必在进行编译前仔细阅读软件包的官方编译指南,并根据其要求调整配置和步骤。