156 lines
3.6 KiB
Bash
156 lines
3.6 KiB
Bash
|
#!/bin/bash
|
|||
|
set -e
|
|||
|
|
|||
|
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
|||
|
# 默认参数
|
|||
|
QEMU_VERSION="9.2.1"
|
|||
|
TARGET_LIST="loongarch64-softmmu"
|
|||
|
USE_MIRROR=0
|
|||
|
DEST_DIR="${HOME}/opt/qemu-${QEMU_VERSION}"
|
|||
|
SOURCE_PACKAGES_DIR="$SCRIPT_DIR/source_packages"
|
|||
|
BUILD_DIR="$SCRIPT_DIR/build_dir"
|
|||
|
|
|||
|
SUDO=sudo
|
|||
|
FORCE=0
|
|||
|
|
|||
|
# 检查是否为root用户
|
|||
|
if [ "$(id -u)" -eq 0 ]; then
|
|||
|
SUDO=""
|
|||
|
fi
|
|||
|
|
|||
|
# 参数解析
|
|||
|
while [[ $# -gt 0 ]]; do
|
|||
|
case "$1" in
|
|||
|
--version)
|
|||
|
QEMU_VERSION="$2"
|
|||
|
shift 2
|
|||
|
DEST_DIR="${HOME}/opt/qemu-${QEMU_VERSION}" # 更新默认路径
|
|||
|
;;
|
|||
|
--target-list)
|
|||
|
TARGET_LIST="$2"
|
|||
|
shift 2
|
|||
|
;;
|
|||
|
--use-mirror)
|
|||
|
USE_MIRROR=1
|
|||
|
shift
|
|||
|
;;
|
|||
|
--dest-dir)
|
|||
|
DEST_DIR="$2"
|
|||
|
shift 2
|
|||
|
;;
|
|||
|
-f|--force)
|
|||
|
FORCE=1
|
|||
|
shift
|
|||
|
;;
|
|||
|
*)
|
|||
|
echo "未知参数: $1"
|
|||
|
exit 1
|
|||
|
;;
|
|||
|
esac
|
|||
|
done
|
|||
|
|
|||
|
# 检查是否已存在qemu-system-loongarch64
|
|||
|
QEMU_BINARY="${DEST_DIR}/bin/qemu-system-loongarch64"
|
|||
|
if [ -f "$QEMU_BINARY" ] && [ "$FORCE" -eq 0 ]; then
|
|||
|
echo "检测到已存在 qemu-system-loongarch64 在 ${QEMU_BINARY}"
|
|||
|
echo "如需强制重新构建,请使用 -f 或 --force 参数"
|
|||
|
exit 1
|
|||
|
fi
|
|||
|
|
|||
|
# 依赖检查函数
|
|||
|
check_dependency() {
|
|||
|
if ! dpkg -l | grep -q "^ii $1 "; then
|
|||
|
echo "安装依赖: $1"
|
|||
|
${SUDO} apt-get install -y "$1"
|
|||
|
fi
|
|||
|
}
|
|||
|
|
|||
|
# 镜像源设置
|
|||
|
if [[ $USE_MIRROR -eq 1 ]]; then
|
|||
|
echo "使用国内镜像源..."
|
|||
|
# APT镜像
|
|||
|
${SUDO} sed -i \
|
|||
|
's|//.*archive.ubuntu.com|//mirrors.ustc.edu.cn|g' \
|
|||
|
/etc/apt/sources.list
|
|||
|
|
|||
|
# PyPI镜像
|
|||
|
PIP_MIRROR="https://pypi.mirrors.ustc.edu.cn/simple"
|
|||
|
else
|
|||
|
PIP_MIRROR="https://pypi.org/simple"
|
|||
|
fi
|
|||
|
|
|||
|
# 更新源
|
|||
|
${SUDO} apt-get update
|
|||
|
|
|||
|
# 安装基础依赖
|
|||
|
check_dependency build-essential
|
|||
|
check_dependency ninja-build
|
|||
|
check_dependency meson
|
|||
|
check_dependency pkg-config
|
|||
|
check_dependency libglib2.0-dev
|
|||
|
check_dependency libslirp-dev
|
|||
|
check_dependency wget
|
|||
|
check_dependency git
|
|||
|
|
|||
|
# Python环境配置
|
|||
|
if ! command -v python3 &> /dev/null; then
|
|||
|
${SUDO} apt-get install -y python3 python3-pip
|
|||
|
elif ! command -v pip3 &> /dev/null; then
|
|||
|
${SUDO} apt-get install -y python3-pip
|
|||
|
fi
|
|||
|
|
|||
|
if ! pip3 show tomli &> /dev/null; then
|
|||
|
pip3 install --user -i $PIP_MIRROR tomli
|
|||
|
fi
|
|||
|
|
|||
|
# 创建目录结构
|
|||
|
mkdir -p "$DEST_DIR"
|
|||
|
mkdir -p $SOURCE_PACKAGES_DIR
|
|||
|
mkdir -p $BUILD_DIR
|
|||
|
|
|||
|
# 下载源码包
|
|||
|
QEMU_TAR="qemu-${QEMU_VERSION}.tar.xz"
|
|||
|
QEMU_SRC_DIR="$SOURCE_PACKAGES_DIR/qemu-${QEMU_VERSION}"
|
|||
|
|
|||
|
if [ ! -f "$SOURCE_PACKAGES_DIR/${QEMU_TAR}" ]; then
|
|||
|
echo "正在下载QEMU源码包..."
|
|||
|
wget "https://download.qemu.org/${QEMU_TAR}" -O "$SOURCE_PACKAGES_DIR/${QEMU_TAR}"
|
|||
|
fi
|
|||
|
|
|||
|
# 解压源码
|
|||
|
if [ ! -d "${QEMU_SRC_DIR}" ]; then
|
|||
|
echo "解压QEMU源码..."
|
|||
|
tar xf "$SOURCE_PACKAGES_DIR/${QEMU_TAR}" -C $SOURCE_PACKAGES_DIR
|
|||
|
fi
|
|||
|
|
|||
|
# 配置构建目录
|
|||
|
BUILD_DIR="$BUILD_DIR/qemu-${QEMU_VERSION}_${TARGET_LIST//,/}"
|
|||
|
mkdir -p "${BUILD_DIR}"
|
|||
|
|
|||
|
pushd $(pwd)
|
|||
|
|
|||
|
cd "${BUILD_DIR}"
|
|||
|
|
|||
|
# 运行配置
|
|||
|
echo "配置编译参数..."
|
|||
|
"${QEMU_SRC_DIR}/configure" \
|
|||
|
--prefix="$DEST_DIR" \
|
|||
|
--enable-slirp \
|
|||
|
--target-list="$TARGET_LIST" \
|
|||
|
--enable-kvm
|
|||
|
|
|||
|
# 编译和安装
|
|||
|
echo "开始编译(使用$(nproc)线程)..."
|
|||
|
make -j "$(nproc)"
|
|||
|
make install
|
|||
|
|
|||
|
popd
|
|||
|
# 清理
|
|||
|
rm -rf "./${BUILD_DIR}"
|
|||
|
rm -rf "${QEMU_SRC_DIR}"
|
|||
|
|
|||
|
echo -e "\n编译完成!安装路径: ${DEST_DIR}"
|
|||
|
echo -e "运行以下命令使用QEMU:"
|
|||
|
echo -e " 或者将其添加到你的shell配置文件中(例如~/.bashrc或~/.zshrc):"
|
|||
|
echo "export PATH=\"${DEST_DIR}/bin:\$PATH\""
|