build-qemu-la64-for-ubuntu.sh 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. #!/bin/bash
  2. set -e
  3. SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
  4. # 默认参数
  5. QEMU_VERSION="9.2.1"
  6. TARGET_LIST="loongarch64-softmmu"
  7. USE_MIRROR=0
  8. DEST_DIR="${HOME}/opt/qemu-${QEMU_VERSION}"
  9. SOURCE_PACKAGES_DIR="$SCRIPT_DIR/source_packages"
  10. BUILD_DIR="$SCRIPT_DIR/build_dir"
  11. SUDO=sudo
  12. FORCE=0
  13. # 检查是否为root用户
  14. if [ "$(id -u)" -eq 0 ]; then
  15. SUDO=""
  16. fi
  17. # 参数解析
  18. while [[ $# -gt 0 ]]; do
  19. case "$1" in
  20. --version)
  21. QEMU_VERSION="$2"
  22. shift 2
  23. DEST_DIR="${HOME}/opt/qemu-${QEMU_VERSION}" # 更新默认路径
  24. ;;
  25. --target-list)
  26. TARGET_LIST="$2"
  27. shift 2
  28. ;;
  29. --use-mirror)
  30. USE_MIRROR=1
  31. shift
  32. ;;
  33. --dest-dir)
  34. DEST_DIR="$2"
  35. shift 2
  36. ;;
  37. -f|--force)
  38. FORCE=1
  39. shift
  40. ;;
  41. *)
  42. echo "未知参数: $1"
  43. exit 1
  44. ;;
  45. esac
  46. done
  47. # 检查是否已存在qemu-system-loongarch64
  48. QEMU_BINARY="${DEST_DIR}/bin/qemu-system-loongarch64"
  49. if [ -f "$QEMU_BINARY" ] && [ "$FORCE" -eq 0 ]; then
  50. echo "检测到已存在 qemu-system-loongarch64 在 ${QEMU_BINARY}"
  51. echo "如需强制重新构建,请使用 -f 或 --force 参数"
  52. exit 1
  53. fi
  54. # 依赖检查函数
  55. check_dependency() {
  56. if ! dpkg -l | grep -q "^ii $1 "; then
  57. echo "安装依赖: $1"
  58. ${SUDO} apt-get install -y "$1"
  59. fi
  60. }
  61. # 镜像源设置
  62. if [[ $USE_MIRROR -eq 1 ]]; then
  63. echo "使用国内镜像源..."
  64. # APT镜像
  65. ${SUDO} sed -i \
  66. 's|//.*archive.ubuntu.com|//mirrors.ustc.edu.cn|g' \
  67. /etc/apt/sources.list
  68. # PyPI镜像
  69. PIP_MIRROR="https://pypi.mirrors.ustc.edu.cn/simple"
  70. else
  71. PIP_MIRROR="https://pypi.org/simple"
  72. fi
  73. # 更新源
  74. ${SUDO} apt-get update
  75. # 安装基础依赖
  76. check_dependency build-essential
  77. check_dependency ninja-build
  78. check_dependency meson
  79. check_dependency pkg-config
  80. check_dependency libglib2.0-dev
  81. check_dependency libslirp-dev
  82. check_dependency wget
  83. check_dependency git
  84. # Python环境配置
  85. if ! command -v python3 &> /dev/null; then
  86. ${SUDO} apt-get install -y python3 python3-pip
  87. elif ! command -v pip3 &> /dev/null; then
  88. ${SUDO} apt-get install -y python3-pip
  89. fi
  90. if ! pip3 show tomli &> /dev/null; then
  91. pip3 install --user -i $PIP_MIRROR tomli
  92. fi
  93. # 创建目录结构
  94. mkdir -p "$DEST_DIR"
  95. mkdir -p $SOURCE_PACKAGES_DIR
  96. mkdir -p $BUILD_DIR
  97. # 下载源码包
  98. QEMU_TAR="qemu-${QEMU_VERSION}.tar.xz"
  99. QEMU_SRC_DIR="$SOURCE_PACKAGES_DIR/qemu-${QEMU_VERSION}"
  100. if [ ! -f "$SOURCE_PACKAGES_DIR/${QEMU_TAR}" ]; then
  101. echo "正在下载QEMU源码包..."
  102. wget "https://download.qemu.org/${QEMU_TAR}" -O "$SOURCE_PACKAGES_DIR/${QEMU_TAR}"
  103. fi
  104. # 解压源码
  105. if [ ! -d "${QEMU_SRC_DIR}" ]; then
  106. echo "解压QEMU源码..."
  107. tar xf "$SOURCE_PACKAGES_DIR/${QEMU_TAR}" -C $SOURCE_PACKAGES_DIR
  108. fi
  109. # 配置构建目录
  110. BUILD_DIR="$BUILD_DIR/qemu-${QEMU_VERSION}_${TARGET_LIST//,/}"
  111. mkdir -p "${BUILD_DIR}"
  112. pushd $(pwd)
  113. cd "${BUILD_DIR}"
  114. # 运行配置
  115. echo "配置编译参数..."
  116. "${QEMU_SRC_DIR}/configure" \
  117. --prefix="$DEST_DIR" \
  118. --enable-slirp \
  119. --target-list="$TARGET_LIST" \
  120. --enable-kvm
  121. # 编译和安装
  122. echo "开始编译(使用$(nproc)线程)..."
  123. make -j "$(nproc)"
  124. make install
  125. popd
  126. # 清理
  127. rm -rf "./${BUILD_DIR}"
  128. rm -rf "${QEMU_SRC_DIR}"
  129. echo -e "\n编译完成!安装路径: ${DEST_DIR}"
  130. echo -e "运行以下命令使用QEMU:"
  131. echo -e " 或者将其添加到你的shell配置文件中(例如~/.bashrc或~/.zshrc):"
  132. echo "export PATH=\"${DEST_DIR}/bin:\$PATH\""