#!/bin/bash
export LANG="zh_CN.UTF-8"
export LC_ALL="zh_CN.UTF-8"
function log_info() {
echo "[INFO] $1"
}
function log_error() {
echo "[ERROR] $1" >&2
}
function check_dependencies() {
local tools=('gcc' 'clang++' 'file' 'ls' 'mkdir' 'rm' 'find')
local missing=0
for tool in "${tools[@]}"; do
if ! command -v "$tool" &> /dev/null; then
log_error "缺少必要的工具: $tool"
missing=1
fi
done
return $missing
}
function clean_build() {
log_info "清理构建环境..."
find "$current_dir" -type f -name "*.o" -exec rm -f {} \;
if [ -f "$pebview_dylib_file" ]; then
log_info "删除现有库文件: $pebview_dylib_file"
rm -f "$pebview_dylib_file"
fi
}
function build_library() {
local compiler="$1"
local flags="$2"
local source="$3"
local output="$4"
local includes="$5"
log_info "编译 $source..."
$compiler $flags $includes -c "$source" -o "$output"
if [ $? -ne 0 ]; then
log_error "编译 $source 失败!"
return 1
fi
return 0
}
function main() {
current_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
if ! check_dependencies; then
log_error "请安装缺少的工具后重试"
exit 1
fi
arch="$(uname -m)"
lib_dir="$current_dir/../lib/macos"
case "$arch" in
x86_64)
pebview_dylib_file="$lib_dir/x86_64/PebView.dylib"
toast_dylib_file="$lib_dir/x86_64/Toast.dylib"
extra_flags="-arch x86_64"
;;
arm64)
pebview_dylib_file="$lib_dir/arm64/PebView.dylib"
toast_dylib_file="$lib_dir/arm64/Toast.dylib"
extra_flags="-arch arm64"
;;
*)
log_error "不支持的架构: $arch"
exit 1
;;
esac
mkdir -p "$(dirname "$pebview_dylib_file")" "$current_dir/seticon" "$current_dir/dialog" "$current_dir/webview" "$current_dir/window"
clean_build
COMMON_FLAGS="-Wall -Wextra -pedantic -O3 -mmacosx-version-min=10.10"
CFLAGS="$COMMON_FLAGS -std=c99"
CXXFLAGS="$COMMON_FLAGS -DWEBVIEW_STATIC -std=c++11"
OBJCFLAGS="$COMMON_FLAGS -DWEBVIEW_COCOA"
LDFLAGS="-ObjC"
FRAMEWORKS="-framework WebKit -framework Cocoa -framework Carbon"
icon_o="$current_dir/seticon/icon.o"
dialog_o="$current_dir/dialog/osdialog_mac.o"
dialogc_o="$current_dir/dialog/osdialog.o"
webview_o="$current_dir/webview/webview.o"
window_o="$current_dir/window/window_mac.o"
icon_i="-I$current_dir/seticon"
dialog_i="-I$current_dir/dialog"
webview_i="-I$current_dir/webview"
window_i="-I$current_dir/window"
if ! build_library "gcc" "$extra_flags $CFLAGS" "$current_dir/seticon/icon.c" "$icon_o" "$icon_i"; then
exit 1
fi
if ! build_library "clang" "$extra_flags $OBJCFLAGS" "$current_dir/dialog/osdialog.c" "$dialogc_o" "$dialog_i"; then
exit 1
fi
if ! build_library "clang" "$extra_flags $OBJCFLAGS" "$current_dir/window/window_mac.m" "$window_o" "$window_i"; then
exit 1
fi
if ! build_library "clang" "$extra_flags $OBJCFLAGS" "$current_dir/dialog/osdialog_mac.m" "$dialog_o" "$dialog_i"; then
exit 1
fi
if ! build_library "c++" "$extra_flags $CXXFLAGS" "$current_dir/webview/webview.cc" "$webview_o" "$webview_i"; then
exit 1
fi
log_info "链接动态库..."
clang++ $extra_flags -dynamiclib $LDFLAGS -install_name "@rpath/$(basename "$pebview_dylib_file")" -o "$pebview_dylib_file" "$webview_o" "$icon_o" "$dialogc_o" "$dialog_o" "$window_o" $FRAMEWORKS
if [ $? -ne 0 ]; then
log_error "链接动态库失败!"
exit 1
fi
if [ -f "$pebview_dylib_file" ]; then
log_info "生成的动态库信息:"
ls -lh "$pebview_dylib_file"
file "$pebview_dylib_file"
nm -g "$pebview_dylib_file"
log_info "构建过程完成!"
else
log_error "动态库文件未生成!"
return 1
fi
g++ -std=c++11 -shared -fPIC -o "$toast_dylib_file" "$current_dir/toast/macos/toast.mm" -framework Foundation -framework AppKit -mmacosx-version-min=10.10
if [ -f "$toast_dylib_file" ]; then
log_info "生成的动态库信息:"
ls -lh "$toast_dylib_file"
file "$toast_dylib_file"
nm -g "$toast_dylib_file"
log_info "构建过程完成!"
else
log_error "动态库文件未生成!"
return 1
fi
return 0
}
main
chmod +x "$0"