Biên Dịch Lại Phần Mềm Với ServBay
ServBay cung cấp cho người dùng macOS một môi trường phát triển web nội bộ mạnh mẽ và đầy đủ, bao gồm nhiều gói phần mềm và công cụ thiết yếu. Ngoài các phiên bản phần mềm cài sẵn từ ServBay, thỉnh thoảng lập trình viên cần biên dịch lại một số thành phần phục vụ nhu cầu đặc biệt, ví dụ:
- Bật các tuỳ chọn biên dịch cụ thể cho một gói phần mềm.
- Thêm các module hoặc extension mà mặc định ServBay chưa bao gồm (ví dụ như extension mới cho PHP hoặc module mở rộng của PostgreSQL).
- Biên dịch với thư viện khác với phiên bản tiêu chuẩn mà ServBay cung cấp.
- Tuỳ biến và chỉnh sửa các gói phần mềm do ServBay cung cấp.
ServBay mang đến đầy đủ môi trường biên dịch cùng các công cụ cần thiết, giúp bạn dễ dàng thực hiện các tác vụ biên dịch lại này.
Để thao tác suôn sẻ, bạn nên nắm sơ qua quy trình biên dịch phần mềm trên nền tảng Unix/Linux (ví dụ các lệnh configure
, make
, make install
).
Điều Kiện Tiên Quyết
Trước khi bắt đầu biên dịch lại, hãy chắc chắn bạn đã đáp ứng các điều kiện sau:
Cài đặt ServBay Development Library: Đây là thành phần thiết yếu cho quá trình biên dịch lại. Nó chứa toàn bộ các thư viện (
.so
,.a
), tập tin header (.h
) và các tài nguyên phát triển cần thiết trong môi trường ServBay. Bạn có thể cài đặt thư viện này tại mục Gói Phần Mềm trên giao diện ứng dụng ServBay.Cài đặt Xcode Command Line Tools: Bộ công cụ phát triển cơ bản của Apple cung cấp trình biên dịch (Clang), linker và nhiều công cụ thiết yếu. Mở Terminal và chạy lệnh:
bashxcode-select --install
1Nếu đã cài đặt rồi, hệ thống sẽ thông báo.
Cài đặt các công cụ biên dịch bổ sung: Để biên dịch hầu hết phần mềm mã nguồn mở, bạn cần các công cụ như
autoconf
,automake
,libtool
… Bạn có thể sử dụng trình quản lý gói Homebrew để cài đặt:bashbrew install autoconf automake libtool cmake
1Nếu máy chưa có Homebrew, vui lòng tham khảo tài liệu chính thức của Homebrew để cài đặt trước.
Cài Đặt Môi Trường Biên Dịch
Sau khi đã cài đủ ServBay Development Library và các công cụ cần thiết, bạn cần khởi tạo môi trường biên dịch cho Terminal. Bước này gồm việc thiết lập nhiều biến môi trường (như PATH
, CFLAGS
, LDFLAGS
, CPPFLAGS
) để trình biên dịch và hệ thống build biết chính xác thư viện, đường dẫn header và tệp nhị phân ở đâu nhằm xử lý phụ thuộc, liên kết đúng đắn.
Tuỳ theo CPU trên máy Mac của bạn là Intel (x86_64) hay Apple Silicon (Arm64), môi trường runtime của ServBay cũng khác nhau. Bạn cần chọn lệnh khởi tạo phù hợp với kiến trúc hiện tại.
Kiểm Tra Kiến Trúc CPU của ServBay Runtime
Bạn có thể kiểm tra kiến trúc bằng cách xem một file thực thi bất kỳ trong thư mục bin
của ServBay, ví dụ kiểm tra file bison
:
bash
# Thực hiện lệnh sau trong Terminal
$ file /Applications/ServBay/bin/bison
/Applications/ServBay/bin/bison: Mach-O 64-bit executable arm64
1
2
3
2
3
bash
# Thực hiện lệnh sau trong Terminal
$ file /Applications/ServBay/bin/bison
/Applications/ServBay/bin/bison: Mach-O 64-bit executable x86_64
1
2
3
2
3
Sau khi xác định kiến trúc, chọn script khởi tạo biến môi trường tương ứng.
Khởi Tạo Biến Môi Trường Cho Biên Dịch
Mở một cửa sổ Terminal mới, sao chép script phù hợp với loại CPU và dán vào Terminal để khởi tạo biến môi trường. Các script sau sẽ thiết lập mọi đường dẫn và biến phù hợp cho môi trường biên dịch với ServBay.
bash
# Đặt số lượng lõi CPU để dùng cho biên dịch song song
CPU_NUMBER=$(sysctl -n hw.ncpu)
# Đường dẫn gốc cài ServBay
SERVBAY_BASE_FULL_PATH="/Applications/ServBay"
# Tên thư mục gói phần mềm
SERVBAY_PACKAGE_DIR_NAME="package"
# Đường dẫn đầy đủ tới gói phần mềm
SERVBAY_PACKAGE_FULL_PATH="${SERVBAY_BASE_FULL_PATH}/${SERVBAY_PACKAGE_DIR_NAME}"
# Đường dẫn tới các file nhị phân của ServBay
SERVBAY_BIN_PATH="${SERVBAY_PACKAGE_FULL_PATH}/bin"
SERVBAY_SBIN_PATH="${SERVBAY_PACKAGE_FULL_PATH}/sbin"
# Đường dẫn file cấu hình
SERVBAY_ETC_PATH="${SERVBAY_PACKAGE_FULL_PATH}/etc"
# Đường dẫn dữ liệu biến
SERVBAY_VAR_PATH="${SERVBAY_PACKAGE_FULL_PATH}/var"
# Đường dẫn cài ServBay Development Library
SERVBAY_COMMON_PATH="${SERVBAY_PACKAGE_FULL_PATH}/common"
# Đường dẫn header của Development Library
SERVBAY_COMMON_INCLUDE_PATH="${SERVBAY_COMMON_PATH}/include"
# Đường dẫn thư viện
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"
# Thư mục build hiện tại
SERVBAY_BUILD_DIR=$(pwd)
SERVBAY_BUILD_SRC_DIR=${SERVBAY_BUILD_DIR}/src
# Phiên bản OpenSSL
OPENSSL_SELECTED_VERSION="3.2"
OPENSSL_VERSION="3.2.1"
# Phiên bản macOS tối thiểu
BUILD_OS_MIN_VERSION="12.00" # macOS Monterey hoặc mới hơn
# Thông số kiến trúc CPU
BUILD_CPU_ARCH="-arch arm64"
BUILD_CPU_ARCH_CMAKE="arm64"
BUILD_MACOS_TARGET="" # Arm64 thường không cần -target
# Thiết lập các cờ biên dịch C: tối ưu hóa, phiên bản macOS tối thiểu, kiến trúc
export CFLAGS="-Qunused-arguments -O3 -mmacosx-version-min=${BUILD_OS_MIN_VERSION} ${BUILD_CPU_ARCH} ${BUILD_MACOS_TARGET}"
# Cờ liên kết: thêm rpath, thư viện, phiên bản macOS, kiến trúc
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ờ header cho C & C++
export CPPFLAGS="-I${SERVBAY_COMMON_INCLUDE_PATH}"
export CXXFLAGS="-Qunused-arguments -O3 -mmacosx-version-min=${BUILD_OS_MIN_VERSION} ${BUILD_CPU_ARCH} ${BUILD_MACOS_TARGET}"
# Đặt PATH ưu tiên bin/sbin của ServBay
export PATH="${SERVBAY_BIN_PATH}:${SERVBAY_SBIN_PATH}:/usr/bin:/bin:/usr/sbin:/sbin:/Library/Apple/usr/bin"
# Đường dẫn pkg-config
export PKG_CONFIG_PATH="${SERVBAY_COMMON_LIB_PATH}/pkgconfig"
# Đường dẫn tới pkg-config binary
export PKG_CONFIG="${SERVBAY_BIN_PATH}/pkg-config"
export PKG_CONFIG_LIBDIR="${SERVBAY_COMMON_LIB_PATH}/pkgconfig"
# Thêm bin/sbin của hệ điều hành và Homebrew vào PATH
export PATH=$PATH:"/usr/local/bin:/usr/local/sbin"
export PATH=$PATH:"/opt/homebrew/bin/" # Đường cài mặc định của Homebrew
# Thêm đường dẫn OpenSSL vào LDFLAGS và 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}"
# Thêm pkgconfig của OpenSSL
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"
# Sau khi thiết lập xong, bạn đã sẵn sàng biên dịch trong cửa sổ này
echo "Đã thiết lập môi trường biên dịch Arm64 cho ServBay."
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
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
bash
# Đặt số lượng lõi CPU để dùng cho biên dịch song song
CPU_NUMBER=$(sysctl -n hw.ncpu)
# Đường dẫn gốc cài ServBay
SERVBAY_BASE_FULL_PATH="/Applications/ServBay"
# Tên thư mục gói phần mềm
SERVBAY_PACKAGE_DIR_NAME="package"
# Đường dẫn đầy đủ tới gói phần mềm
SERVBAY_PACKAGE_FULL_PATH="${SERVBAY_BASE_FULL_PATH}/${SERVBAY_PACKAGE_DIR_NAME}"
# Đường dẫn tới các file nhị phân của ServBay
SERVBAY_BIN_PATH="${SERVBAY_PACKAGE_FULL_PATH}/bin"
SERVBAY_SBIN_PATH="${SERVBAY_PACKAGE_FULL_PATH}/sbin"
# Đường dẫn file cấu hình
SERVBAY_ETC_PATH="${SERVBAY_PACKAGE_FULL_PATH}/etc"
# Đường dẫn dữ liệu biến
SERVBAY_VAR_PATH="${SERVBAY_PACKAGE_FULL_PATH}/var"
# Đường dẫn cài ServBay Development Library
SERVBAY_COMMON_PATH="${SERVBAY_PACKAGE_FULL_PATH}/common"
# Đường dẫn header của Development Library
SERVBAY_COMMON_INCLUDE_PATH="${SERVBAY_COMMON_PATH}/include"
# Đường dẫn thư viện
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"
# Thư mục build hiện tại
SERVBAY_BUILD_DIR=$(pwd)
SERVBAY_BUILD_SRC_DIR=${SERVBAY_BUILD_DIR}/src
# Phiên bản OpenSSL
OPENSSL_SELECTED_VERSION="1.1.1u"
OPENSSL_VERSION="1.1.1u"
# Phiên bản macOS tối thiểu
BUILD_OS_MIN_VERSION="12.00" # macOS Monterey hoặc mới hơn
# Thông số kiến trúc CPU
BUILD_CPU_ARCH="-arch x86_64"
BUILD_CPU_ARCH_CMAKE="x86_64"
# Thông số nền tảng (Intel cần khai báo bổ sung)
BUILD_MACOS_TARGET="-target x86_64-apple-macos${BUILD_OS_MIN_VERSION}"
# Thiết lập các cờ biên dịch C: tối ưu hóa, phiên bản macOS tối thiểu, kiến trúc, đích
export CFLAGS="-Qunused-arguments -O3 -mmacosx-version-min=${BUILD_OS_MIN_VERSION} ${BUILD_CPU_ARCH} ${BUILD_MACOS_TARGET}"
# Cờ liên kết: thêm rpath, thư viện, phiên bản macOS, kiến trúc, đích
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ờ header cho C & C++
export CPPFLAGS="-I${SERVBAY_COMMON_INCLUDE_PATH}"
export CXXFLAGS="-Qunused-arguments -O3 -mmacosx-version-min=${BUILD_OS_MIN_VERSION} ${BUILD_CPU_ARCH} ${BUILD_MACOS_TARGET}"
# Đặt PATH ưu tiên bin/sbin của ServBay
export PATH="${SERVBAY_BIN_PATH}:${SERVBAY_SBIN_PATH}:/usr/bin:/bin:/usr/sbin:/sbin:/Library/Apple/usr/bin"
# Đường dẫn pkg-config
export PKG_CONFIG_PATH="${SERVBAY_COMMON_LIB_PATH}/pkgconfig"
# Đường dẫn tới pkg-config binary
export PKG_CONFIG="${SERVBAY_BIN_PATH}/pkg-config"
export PKG_CONFIG_LIBDIR="${SERVBAY_COMMON_LIB_PATH}/pkgconfig"
# Thêm bin/sbin của hệ điều hành và Homebrew vào PATH
export PATH=$PATH:"/usr/local/bin:/usr/local/sbin"
export PATH=$PATH:"/opt/homebrew/bin/" # Đường cài mặc định của Homebrew
# Thêm đường dẫn OpenSSL vào LDFLAGS và 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}"
# Thêm pkgconfig của OpenSSL
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"
# Sau khi thiết lập xong, bạn đã sẵn sàng biên dịch trong cửa sổ này
echo "Đã thiết lập môi trường biên dịch x86_64 cho ServBay."
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
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
Lưu ý: Các biến môi trường này chỉ áp dụng cho phiên làm việc Terminal hiện tại. Nếu bạn đóng Terminal hoặc mở cửa sổ mới, hãy chạy lại script để thiết lập môi trường biên dịch lại từ đầu.
Ví Dụ Biên Dịch
Sau khi đã thiết lập môi trường, bạn có thể tải mã nguồn và thực hiện biên dịch. Sau đây là một số ví dụ điển hình.
Biên Dịch ImageMagick
ImageMagick là thư viện xử lý ảnh nổi tiếng, là phụ thuộc bắt buộc cho extension PHP imagick
. ServBay đã bao gồm ImageMagick theo mặc định, nên thường không cần tự biên dịch lại. Phần hướng dẫn này minh hoạ quy trình biên dịch một dự án sử dụng Autotools (configure/make) với môi trường ServBay.
Tải mã nguồn và giải nén ImageMagick:
bash# Thay đường dẫn tới phiên bản mới nhất nếu cần 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
4Chạy script
./configure
: Hãy đảm bảo sử dụng biến môi trường đã thiết lập. Các tham số--prefix
,--libdir
,--includedir
… trỏ về các thư mục con của${SERVBAY_COMMON_PATH}
, đảm bảo mọi thứ sau khi biên dịch sẽ tương thích và được tìm thấy trong môi trường ServBay. Bạn có thể chỉnh thêm các tuỳ chọn phù hợp với nhu cầu.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
30Thực thi
make
vàmake install
: Lệnhmake
sẽ xây dựng mã nguồn, thêm tuỳ chọn-j ${CPU_NUMBER}
để tăng tốc với nhiều nhân CPU. Cuối cùng,make install
sẽ cài đặt vào thư mục ServBay Development Library đã chỉ định.bashmake -j ${CPU_NUMBER} make install
1
2
Biên Dịch Phần Mềm Với cmake
Với các phần mềm sử dụng hệ thống build cmake
, quy trình có một số điểm khác biệt. Ví dụ dưới đây trình bày cách biên dịch protobuf
(Protocol Buffers):
Tải mã nguồn protobuf và vào thư mục nguồn.
Chạy lệnh cấu hình với
cmake
: Tham số-S .
quy định thư mục nguồn,-B builddir
tạo thư mục build riêng. Các tham số-DCMAKE_INSTALL_PREFIX
,… quy định đường cài đặt tương tự Autotools nhưng chuẩn hóa cho cmake. Các tham số-D
khác là tuỳ chỉnh dành riêng cho protobuf.-DCMAKE_MACOSX_RPATH=1
và-DCMAKE_INSTALL_RPATH
giúp các thư viện xây dựng xong "nhìn thấy" các thư viện trong môi trường ServBay.bash# Giả sử bạn đã ở thư mục mã nguồn 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
21Thực thi
cmake --build
vàcmake --install
: Lệnhcmake --build builddir
sẽ biên dịch dự án;cmake --install builddir
cài các file vào đúng thư mục Development Library đã chỉ định.bashcmake --build builddir -j ${CPU_NUMBER} cmake --install builddir
1
2
Biên Dịch Module PHP
Nếu bạn muốn biên dịch thêm extension cho một phiên bản PHP bất kỳ trong ServBay (như swoole
, redis
, mongodb
…), vui lòng tham khảo hướng dẫn dành riêng:
Hướng dẫn biên dịch module PHP
Biên Dịch Module PostgreSQL
Nếu bạn muốn biên dịch module mở rộng cho một phiên bản PostgreSQL trong ServBay, hãy xem hướng dẫn chuyên biệt sau:
Hướng dẫn biên dịch module PostgreSQL
Tổng Kết
Với ServBay Development Library cùng các biến môi trường cấu hình đầy đủ, bạn hoàn toàn có thể biên dịch và tuỳ chỉnh lại các gói phần mềm một cách linh hoạt trên macOS. Điều này mở rộng khả năng tích hợp các thành phần đặc biệt, hoặc sử dụng phiên bản thư viện mới nhất cho dự án của bạn. Hãy luôn tìm hiểu kỹ hướng dẫn biên dịch chính thức của phần mềm trước khi thực hiện, và điều chỉnh tuỳ chọn cấu hình theo thông tin từ tài liệu đó.