From 20de2d68b0154e3f9750d79fa449e2629c185e25 Mon Sep 17 00:00:00 2001 From: re2zero Date: Wed, 28 Oct 2026 18:19:36 +0800 Subject: [PATCH] refactor(packaging): migrate dependencies to buildext MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. Remove the manual install_dep/deploy_dep dependency handling from the Linglong build. 2. Declare the required build and runtime dependencies in buildext.apt. 3. Delete the obsolete install_dep and deploy_dep scripts. Log: Linglong dependencies are now resolved declaratively. Influence: 1. Verify ll-builder can parse and build the project with buildext.apt. 2. Confirm the application still starts and its runtime libraries are present. 3. Confirm no build script still references install_dep or deploy_dep. refactor(packaging): 将依赖迁移到 buildext 1. 移除 Linglong 构建中的 install_dep/deploy_dep 手动依赖处理。 2. 在 buildext.apt 中声明构建期和运行期依赖。 3. 删除不再使用的 install_dep 和 deploy_dep 脚本。 Log: Linglong 依赖改为声明式解析。 Influence: 1. 验证 ll-builder 能解析并构建项目。 2. 确认应用可正常启动且运行库齐全。 3. 确认构建脚本不再引用 install_dep 或 deploy_dep。 PMS:Task-396575 Multica: V-7089 --- deploy_dep | 73 ----------------------- install_dep | 162 -------------------------------------------------- linglong.yaml | 55 +++++------------ 3 files changed, 14 insertions(+), 276 deletions(-) delete mode 100644 deploy_dep delete mode 100644 install_dep diff --git a/deploy_dep b/deploy_dep deleted file mode 100644 index ddf29555a..000000000 --- a/deploy_dep +++ /dev/null @@ -1,73 +0,0 @@ -# SPDX-FileCopyrightText: 2023-2024 UnionTech Software Technology Co., Ltd. -# -# SPDX-License-Identifier: GPL-3.0-or-later - -#!/bin/bash -set -e - -# 生成安装目录/文件和运行时依赖的必要库 -# 获取应用id -ID_VALUE=$(awk -F ': ' '/^ id: / {print $2}' linglong.yaml) - -## 获取安装的文件列表并写入安装脚本(排除头文件、pc和cmake文件) -# cmake 安装 -if ! grep -- "-- Installing:" install.log | awk '{print $NF}' | grep -vE '\.(h|cmake|pc)$' > ${ID_VALUE}.install; then - echo "cmake install files are empty!" -fi -# qmake 安装 -if ! grep -- "-install qinstall" install.log | awk '{print $NF}' | grep -vE '\.(h|cmake|pc)$' >> ${ID_VALUE}.install; then - echo "qmake install files are empty!" -fi -# 动态库软连接 -if ! grep -- "^ln -f -s " install.log | awk '{print $NF}' >> ${ID_VALUE}.install; then - echo "Get library softlink empty!" -fi - -# glib-compile-schemas 文件添加到 install 文件 -for SCHEMAS in "${PREFIX}"/share/glib-2.0/schemas/gschema*; do - if [[ -f "$SCHEMAS" ]]; then - echo "$SCHEMAS" >> "${ID_VALUE}.install" - fi -done - -# 获取依赖的所有文件 -for LDFILE in "$@"; do - - # 判断文件是否以 .so 结尾 - if [[ "$LDFILE" == *.so ]]; then - FILE_PATH="${PREFIX}/lib/${TRIPLET}/$LDFILE" - - # 添加依赖库到 install 文件 - for SOFILE in "${PREFIX}/lib/${TRIPLET}"/${LDFILE}*; do - if [[ -f "$SOFILE" ]]; then - echo "$SOFILE" >> "${ID_VALUE}.install" - fi - done - else - FILE_PATH="${PREFIX}/bin/$LDFILE" - fi - - # 获取依赖库 - DEPENDENCIES=$(ldd "$FILE_PATH" | grep "$PREFIX") || continue - if [[ ! -z "$DEPENDENCIES" ]]; then - echo "$DEPENDENCIES" | while IFS= read -r line; do - LIB_PATH=${line##*=> } - LIB_PATH=${LIB_PATH%%(*} - - # 获取基本库名并匹配相关库 - LIB_DIR=$(dirname "$LIB_PATH") - BASE_LIB_NAME=$(basename "$LIB_PATH") - - # 使用通配符查找相关库文件并添加到 install 文件 - for FILE in "$LIB_DIR"/${BASE_LIB_NAME%.*}*; do - if [[ -f "$FILE" ]]; then - echo "$FILE" >> "${ID_VALUE}.install" - fi - done - done - fi -done - -# 排除静态链接库 -#echo '^'${PREFIX}'/'${TRIPLET}'/.+(?> "${ID_VALUE}.install" -#echo '^'${PREFIX}'/lib/.+(?> "${ID_VALUE}.install" \ No newline at end of file diff --git a/install_dep b/install_dep deleted file mode 100644 index d3cb3cfce..000000000 --- a/install_dep +++ /dev/null @@ -1,162 +0,0 @@ -# SPDX-FileCopyrightText: 2023-2024 UnionTech Software Technology Co., Ltd. -# -# SPDX-License-Identifier: GPL-3.0-or-later - -#!/bin/bash -set -e -project_dir=$PWD -cache_dir=${LINGLONG_FETCH_CACHE:-$PWD/linglong/cache} -mkdir -p "$cache_dir" -# 文件名 deb-source.bash -# 包含要解压的deb目录 -deb_dir=$(realpath "$1") -# 将deb解压到输出目录 -target=$(realpath "$2") -# 默认会跳过base已安装的包,可以强制解压已安装的包 -include="$3" -# 临时目录,将内容处理后再移动到 target -out_dir="$(mktemp -d)" -cd "$out_dir" -# 临时文件,用于记录deb文件列表 -deb_list_file="$out_dir/deb.list" -# 临时文件,用于记录强制安装的包名 -include_list_file="$out_dir/include.packages.list" -# 临时文件,用于记录跳过安装的包名 -exclude_list_file="$out_dir/exclude.packages.list" -# 包数据存放的临时目录 -data_list_dir="$out_dir/data" -# 生成文件列表 -find "$deb_dir" -type f -name "*.deb" >"$deb_list_file" -echo "$include" | tr ',' '\n' >"$include_list_file" -# 用于记录安装的所有文件来自哪个包 -mkdir /tmp/deb-source-file || true - -# 如果base和runtime已安装则跳过,旧版本base没有/packages.list文件就使用/var/lib/dpkg/status -grep 'Package: ' /var/lib/dpkg/status >"$exclude_list_file" || true -# 跳过base和runtime已安装的包,也可使用install_dep_skip.list文件控制跳过哪些包 -cat /packages.list /runtime/packages.list "$PREFIX/packages.list" "$project_dir/install_dep_skip.list" >>"$exclude_list_file" || true - -# 遍历文件列表 -while IFS= read -r deb_file; do - # 输出deb名,但不换行,便于在包名后面加skip - echo -n "$deb_file" - # 提取control文件 - control_file=$(ar -t "$deb_file" | grep control.tar) - ar -x "$deb_file" "$control_file" - # 获取包名 - pkg=$(tar -xf "$control_file" ./control -O | grep '^Package:' | awk '{print $2}') - rm "$control_file" - # 如果在base和runtime中已安装,并且不包含在include(强制安装)列表则跳过安装,否则安装到$PREFIX目录 - if grep -q "^Package: $pkg$" "$exclude_list_file" && ! grep -q "^$pkg$" "$include_list_file"; then - echo " skip" - echo "$deb_file" >>/tmp/deb-source-file/skip.list - continue - fi - # 记录到 packages.list - echo "Package: $pkg" >>"$PREFIX/packages.list" - # 换行 - echo "" - # 缓存解压后的data.tar文件,便于在下次使用时,加快安装速度 - deb_sha=$(sha256sum "$deb_file" | awk '{print $1}') - data_cache="$cache_dir/install_dep_$deb_sha" - if [ ! -e "$data_cache" ]; then - data_cache_tmp="$cache_dir/install_dep_tmp_$deb_sha" - # 查找data.tar文件,文件会因为压缩格式不同,有不同的后缀,例如data.tar.xz、data.tar.gz - data_file=$(ar -t "$deb_file" | grep data.tar) - case "$data_file" in - *.xz) ar -p "$deb_file" "$data_file" | unxz >"$data_cache_tmp" ;; - *.gz) ar -p "$deb_file" "$data_file" | gunzip >"$data_cache_tmp" ;; - *.zst) ar -p "$deb_file" "$data_file" | unzstd >"$data_cache_tmp" ;; - *) - echo "unknown file type" - exit 1 - ;; - esac - mv "$data_cache_tmp" "$data_cache" - fi - # 解压data.tar文件到输出目录 - mkdir "$data_list_dir" - tar -xvf "$data_cache" -C "$data_list_dir" >>"/tmp/deb-source-file/$(basename "$deb_file").list" - # 清理不需要复制的目录 - rm -r "${data_list_dir:?}/usr/share/applications"* 2>/dev/null || true - # 修改pc文件的prefix - sed -i "s#/usr#$PREFIX#g" "$data_list_dir"/usr/lib/"$TRIPLET"/pkgconfig/*.pc 2>/dev/null || true - sed -i "s#/usr#$PREFIX#g" "$data_list_dir"/usr/share/pkgconfig/*.pc 2>/dev/null || true - # 修改指向/lib的绝对路径的软链接 - find "$data_list_dir" -type l | while IFS= read -r file; do - linkTarget=$(readlink "$file") - # 如果指向的路径以/lib开头,并且文件不存在,则添加 /runtime 前缀 - # 部分 dev 包会创建 so 文件的绝对链接指向 /lib 目录下 - if echo "$linkTarget" | grep -q ^/lib && ! [ -f "$linkTarget" ]; then - ln -sf "$target$linkTarget" "$file" - echo " FIX LINK" "$linkTarget" "=>" "$target$linkTarget" - fi - done - - # 修复动态库的RUNPATH - find "$data_list_dir" -type f | while IFS= read -r file; do - fileinfo=$(file "$file") - # skip non-dynamic librarie - if ! echo "$fileinfo" | grep -q 'shared object'; then - continue - fi - # skip debug file - if echo "$fileinfo" | grep -q 'with debug_info'; then - continue - fi - runpath=$(readelf -d "$file" | grep RUNPATH | awk '{print $NF}') - # skip without runpath - if ! echo "$runpath" | grep -q '^\[/'; then - continue - fi - # 如果RUNPATH使用绝对路径,则添加/runtime前缀 - runpath=${runpath#[} - runpath=${runpath%]} - newRunpath=${runpath//usr\/lib/runtime\/lib} - newRunpath=${newRunpath//usr/runtime} - patchelf --set-rpath "$newRunpath" "$file" - echo " FIX RUNPATH" "$file" "$runpath" "=>" "$newRunpath" - done - # 复制/lib,/bin,/usr目录 - cp -rP "$data_list_dir/lib" "$target" 2>/dev/null || true - cp -rP "$data_list_dir/bin" "$target" 2>/dev/null || true - cp -rP "$data_list_dir"/usr/* "$target" || true - rm -r "$data_list_dir" -done <"$deb_list_file" - -# 修复相对路径的软链接(dev包内的软连接尝试修复指向base) -find "$target" -type l | while IFS= read -r file; do - # 获取链接的绝对路径 - linkTarget=$(readlink -m "$file") - # 如果链接指向的文件不存在 - if [ ! -e "$linkTarget" ]; then - # 去掉前缀查看/lib下是否存在 - linkTarget="${linkTarget#$target}" - if [ -e "$linkTarget" ]; then - ln -sf "$linkTarget" "$file" - echo " FIX LINK" "$file" "=>" "$target$linkTarget" - fi - # 添加usr前缀查看/usr/lib下是否存在 - linkTarget="/usr$target" - if [ -e "$linkTarget" ]; then - ln -sf "$target$linkTarget" "$file" - echo " FIX LINK" "$file" "=>" "$target$linkTarget" - fi - # 添加 /runtime 前缀查看是否存在 - linkTarget=$(readlink -m "$file") - linkTargetNoPrefix="${linkTarget#$target}" - runtimeLib="/runtime$linkTargetNoPrefix" - if [ -e "$runtimeLib" ]; then - ln -sf "$runtimeLib" "$file" - echo " FIX LINK" "$file" "=>" "$runtimeLib" - fi - fi -done - -# 更新ld.so.cache -if [ -n "$LINGLONG_LD_SO_CACHE" ]; then - ldconfig -C "$LINGLONG_LD_SO_CACHE" -fi - -# 清理临时目录 -rm -r "$out_dir" diff --git a/linglong.yaml b/linglong.yaml index 6363f24b0..8abe9d0d7 100644 --- a/linglong.yaml +++ b/linglong.yaml @@ -19,10 +19,6 @@ command: - deepin-reader build: | - # 下载和安装依赖 - apt -y install --download-only qt6-base-dev qt6-base-dev-tools qt6-tools-dev libdtk6widget-dev libspectre-dev libdjvulibre-dev libtiff-dev libjpeg-dev libicu-dev libpng-dev zlib1g-dev liblcms2-dev libopenjp2-7-dev libfreetype6-dev libgtest-dev libchardet-dev qt6-webengine-dev qt6-5compat-dev libdtk6gui-dev libdtk6core-dev qt6-svg-dev pandoc libgxps-dev libcairo2-dev libglib2.0-dev - bash ./install_dep /var/cache/apt/archives "$PREFIX" - # 设置INCLUDEPATH为引入的CFLAGS环境变量获取的路径 sed -i '33i INCLUDEPATH += $$INCPATHS' 3rdparty/deepin-pdfium/src/src.pro sed -i '35i INCLUDEPATH += $$INCPATHS' htmltopdf/htmltopdf.pro @@ -41,46 +37,23 @@ build: | "INSTALL_ROOT=${PREFIX}" \ ../deepin_reader.pro make -j`nproc` - make install > ../install.log 2>&1 + make install cd .. - # 项目生成应用名和动态隐式加载的依赖库,ldd无法找到的其他库 - LDD_FILES=( - deepin-reader - ../lib/deepin-reader/htmltopdf - pandoc - libdeepin-pdfium-reader.so - # 定制插件不存在 - libzpdcallback.so - ) - - # 生成.install 文件 - ID_VALUE=$(awk -F ': ' '/^ id: / {print $2}' linglong.yaml) - bash ./deploy_dep "${LDD_FILES[@]}" - - # lib/deepin-reader 文件添加到 install 文件 - for OTHER in "${PREFIX}"/lib/deepin-reader/*; do - if [[ -f "$OTHER" ]]; then - echo "$OTHER" >> "${ID_VALUE}.install" - fi - done - - EXEC_FILES=( - pandoc - ) - # 添加额外依赖进程到 install 文件 - for EXEFILE in "${PREFIX}/bin"/${EXEC_FILES[@]}*; do - echo "$EXEFILE" >> "${ID_VALUE}.install" - done - - # pandoc data 文件添加到 install 文件 - find "${PREFIX}/share/pandoc/" -type f -o -type d >> "${ID_VALUE}.install" - - # 添加帮助手册到 install - find $PREFIX/share/deepin-manual/manual-assets/application/deepin-reader >> "${ID_VALUE}.install" - # allow apt download in build and do apt update buildext: apt: build_depends: - - libc6 + - libdjvulibre-dev + - libicu-dev + - liblcms2-dev + - libopenjp2-7-dev + - libchardet-dev + - libkf6globalaccel-dev + - libkf6i18n-dev + depends: + - pandoc + - libdjvulibre21 + - libchardet1 + - libkf6globalaccel6 + - libkf6i18n6