310 lines
8.3 KiB
Bash
310 lines
8.3 KiB
Bash
#!/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 "$@" |