Files
Alicho/build.sh
2025-10-24 18:17:58 +08:00

310 lines
8.3 KiB
Bash
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/bin/bash
# ================================================================================================
# Audio Backend Framework - Linux/macOS构建脚本
# ================================================================================================
# 描述: Linux和macOS平台的自动化构建脚本
# 功能: Conan依赖安装、CMake配置、项目编译
# 用法: ./build.sh [Debug|Release|clean|help]
# ================================================================================================
set -e # 遇到错误立即退出
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# 项目配置
PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
BUILD_TYPE="Release"
CLEAN_BUILD=0
JOBS=$(nproc 2>/dev/null || sysctl -n hw.ncpu 2>/dev/null || echo 4)
# 检测操作系统
detect_os() {
if [[ "$OSTYPE" == "darwin"* ]]; then
OS="macOS"
CMAKE_GENERATOR="Unix Makefiles"
elif [[ "$OSTYPE" == "linux"* ]]; then
OS="Linux"
CMAKE_GENERATOR="Unix Makefiles"
else
echo -e "${RED}[错误] 不支持的操作系统: $OSTYPE${NC}"
exit 1
fi
}
# 显示帮助信息
show_help() {
echo
echo "Audio Backend Framework - Linux/macOS 构建脚本"
echo
echo "用法:"
echo " ./build.sh [选项]"
echo
echo "选项:"
echo " Debug - 构建Debug版本包含调试符号"
echo " Release - 构建Release版本默认优化编译"
echo " clean - 清理所有构建文件"
echo " help - 显示此帮助信息"
echo
echo "示例:"
echo " ./build.sh # 构建Release版本"
echo " ./build.sh Debug # 构建Debug版本"
echo " ./build.sh clean # 清理构建文件"
echo
echo "依赖要求:"
echo " - CMake 3.20+"
echo " - Conan 2.x"
echo " - GCC 13+ 或 Clang 17+"
echo " - C++23 支持的编译器"
echo
echo "系统包依赖 (Ubuntu/Debian):"
echo " sudo apt install build-essential cmake python3-pip"
echo " sudo apt install libasound2-dev libpulse-dev libjack-jackd2-dev"
echo
echo "系统包依赖 (macOS):"
echo " brew install cmake conan"
echo
}
# 解析命令行参数
parse_args() {
case "${1:-}" in
"Debug"|"debug")
BUILD_TYPE="Debug"
;;
"Release"|"release"|"")
BUILD_TYPE="Release"
;;
"clean")
CLEAN_BUILD=1
;;
"help"|"-h"|"--help")
show_help
exit 0
;;
*)
echo -e "${RED}[错误] 未知参数: $1${NC}"
echo "使用 './build.sh help' 查看帮助"
exit 1
;;
esac
}
# 打印标题
print_header() {
echo
echo "========================================"
echo " Audio Backend Framework 构建系统"
echo "========================================"
echo "项目目录: $PROJECT_ROOT"
echo "操作系统: $OS"
echo "构建类型: $BUILD_TYPE"
echo "并行任务: $JOBS"
echo
}
# 清理构建
clean_build() {
echo -e "${YELLOW}[清理] 正在清理构建目录...${NC}"
if [ -d "build" ]; then
rm -rf build
echo -e "${GREEN}[清理] ✓ 已删除 build 目录${NC}"
fi
if [ -f "CMakeCache.txt" ]; then
rm -f CMakeCache.txt
echo -e "${GREEN}[清理] ✓ 已删除 CMakeCache.txt${NC}"
fi
echo -e "${GREEN}[清理] ✓ 清理完成${NC}"
exit 0
}
# 检查必要工具
check_tools() {
echo -e "${BLUE}[检查] 验证必要工具...${NC}"
# 检查CMake
if ! command -v cmake &> /dev/null; then
echo -e "${RED}[错误] 未找到 CMake请先安装 CMake${NC}"
if [[ "$OS" == "macOS" ]]; then
echo " 安装命令: brew install cmake"
else
echo " 安装命令: sudo apt install cmake"
fi
exit 1
fi
# 检查Conan
if ! command -v conan &> /dev/null; then
echo -e "${RED}[错误] 未找到 Conan请先安装 Conan${NC}"
echo " 安装命令: pip3 install conan"
exit 1
fi
# 检查编译器
if [[ "$OS" == "macOS" ]]; then
if ! command -v clang++ &> /dev/null; then
echo -e "${RED}[错误] 未找到 Clang++,请安装 Xcode Command Line Tools${NC}"
echo " 安装命令: xcode-select --install"
exit 1
fi
else
if ! command -v g++ &> /dev/null && ! command -v clang++ &> /dev/null; then
echo -e "${RED}[错误] 未找到 G++ 或 Clang++,请安装编译器${NC}"
echo " 安装令: sudo apt install build-essential"
exit 1
fi
fi
echo -e "${GREEN}[检查] ✓ CMake 已安装$(cmake --version | head -n1 | cut -d' ' -f3)${NC}"
echo -e "${GREEN}[检查] ✓ Conan 已安装$(conan --version 2>/dev/null | cut -d' ' -f3)${NC}"
echo -e "${GREEN}[检查] ✓ 编译器已安装${NC}"
}
# 安装系统依赖提示
check_system_deps() {
if [[ "$OS" == "Linux" ]]; then
echo -e "${YELLOW}[提示] 确保已安装音频开发库:${NC}"
echo " sudo apt install libasound2-dev libpulse-dev libjack-jackd2-dev"
echo " sudo apt install libfftw3-dev libsndfile1-dev libsamplerate0-dev"
echo
fi
}
# 安装Conan依赖
install_dependencies() {
echo
echo -e "${BLUE}[Conan] 正在安装依赖包...${NC}"
echo -e "${BLUE}[Conan] 构建类型: $BUILD_TYPE${NC}"
echo -e "${BLUE}[Conan] C++标准: C++23${NC}"
echo
# 创建build目录
mkdir -p build
cd build
# 执行Conan安装
conan install .. \
--output-folder=. \
--build=missing \
--settings=build_type="$BUILD_TYPE" \
--settings=compiler.cppstd=23
echo
echo -e "${GREEN}[Conan] ✓ 依赖安装成功${NC}"
echo
}
# 配置CMake项目
configure_cmake() {
echo -e "${BLUE}[CMake] 正在配置项目...${NC}"
echo -e "${BLUE}[CMake] 构建类型: $BUILD_TYPE${NC}"
echo -e "${BLUE}[CMake] 生成器: $CMAKE_GENERATOR${NC}"
echo
# 设置平台特定的选项
CMAKE_ARGS=()
CMAKE_ARGS+=("-G" "$CMAKE_GENERATOR")
CMAKE_ARGS+=("-DCMAKE_BUILD_TYPE=$BUILD_TYPE")
CMAKE_ARGS+=("-DCMAKE_TOOLCHAIN_FILE=generators/conan_toolchain.cmake")
CMAKE_ARGS+=("-DDAW_ENABLE_SIMD=ON")
CMAKE_ARGS+=("-DDAW_ENABLE_TESTS=ON")
CMAKE_ARGS+=("-DDAW_ENABLE_EXAMPLES=ON")
# 根据系统架构设置AVX512支持
if [[ $(uname -m) == "x86_64" ]]; then
CMAKE_ARGS+=("-DDAW_ENABLE_AVX512=ON")
else
CMAKE_ARGS+=("-DDAW_ENABLE_AVX512=OFF")
fi
# macOS特定配置
if [[ "$OS" == "macOS" ]]; then
CMAKE_ARGS+=("-DCMAKE_OSX_DEPLOYMENT_TARGET=11.0")
fi
# 执行CMake配置
cmake .. "${CMAKE_ARGS[@]}"
echo
echo -e "${GREEN}[CMake] ✓ 项目配置成功${NC}"
echo
}
# 编译项目
build_project() {
echo -e "${BLUE}[编译] 正在编译项目...${NC}"
echo -e "${BLUE}[编译] 配置: $BUILD_TYPE${NC}"
echo -e "${BLUE}[编译] 并行任务: $JOBS${NC}"
echo
# 编译项目
cmake --build . --config "$BUILD_TYPE" --parallel "$JOBS"
echo
echo -e "${GREEN}[编译] ✓ 项目编译成功${NC}"
echo
}
# 显示构建结果
show_results() {
cd "$PROJECT_ROOT"
echo
echo "========================================"
echo " 构建成功!"
echo "========================================"
echo "构建类型: $BUILD_TYPE"
echo "输出目录: $PROJECT_ROOT/build/bin"
echo "库目录: $PROJECT_ROOT/build/lib"
echo
echo "运行测试: cd build && ctest -C $BUILD_TYPE"
echo "安装项目: cd build && make install"
echo
}
# 主函数
main() {
cd "$PROJECT_ROOT"
# 检测操作系统
detect_os
# 解析参数
parse_args "$1"
# 显示标题
print_header
# 处理清理
if [ $CLEAN_BUILD -eq 1 ]; then
clean_build
fi
# 检查工具
check_tools
# 检查系统依赖
check_system_deps
# 安装依赖
install_dependencies
# 配置项目
configure_cmake
# 编译项目
build_project
# 显示结果
show_results
}
# 执行主函数
main "$@"