diff --git a/deploy_dep b/deploy_dep deleted file mode 100644 index 808261dc..00000000 --- a/deploy_dep +++ /dev/null @@ -1,74 +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" - fi - done | sort -r >> "${ID_VALUE}.install" - - 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 d3cb3cfc..00000000 --- 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 5c836d9a..69e5b8db 100644 --- a/linglong.yaml +++ b/linglong.yaml @@ -19,36 +19,35 @@ command: - deepin-editor build: | - # 下载和安装依赖 - apt -y install --download-only qt6-5compat-dev qt6-base-dev qt6-tools-dev-tools qt6-tools-dev qt6-base-private-dev qt6-svg-dev libdtk6widget-dev libdtk6gui-dev libdtk6core-dev libdtk6declarative-dev libpolkit-qt6-1-dev libkf6syntaxhighlighting-dev libkf6codecs-dev libgtest-dev libgmock-dev libchardet-dev libuchardet-dev libicu-dev deepin-event-log - bash ./install_dep /var/cache/apt/archives "$PREFIX" - # 修改路径 sed -i 's|set(QT_LRELEASE "/lib/qt${QT_VERSION_MAJOR}/bin/lrelease")|set(QT_LRELEASE "lrelease")|g' cmake/translation-generate.cmake # 构建 + # 优先从 /runtime 解析 Qt6/DTK6,避免 buildext 装入 /usr 的 qt6 开发包抢占 find_package VERSION=$(head -1 debian/changelog | awk -F'[()]' '{print $2}') cmake -B build ${conf_args} \ + -DCMAKE_PREFIX_PATH=/runtime \ -DCMAKE_SAFETYTEST_ARG="CMAKE_SAFETYTEST_ARG_OFF" \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_INSTALL_PREFIX="${PREFIX}" \ -DBUILD_TESTS=OFF \ -DVERSION=${VERSION} cmake --build build -j`nproc` - cmake --build build --target install > install.log 2>&1 - - # 项目生成应用名和动态隐式加载的依赖库,ldd无法找到的其他库 - LDD_FILES=( - deepin-editor - libdeepin-event-log.so - libzpdcallback.so - ) - - # 生成.install 文件 - bash ./deploy_dep "${LDD_FILES[@]}" + cmake --build build --target install -# allow apt download in build and do apt update +# 构建期与运行期缺失依赖声明式安装,由 linglong 解析闭包 buildext: apt: build_depends: - - libc6 + - cmake + - libchardet-dev + - libicu-dev + - libkf6codecs-dev + - libkf6syntaxhighlighting-dev + - libuchardet-dev + depends: + - deepin-event-log + - libchardet1 + - libkf6codecs6 + - libkf6syntaxhighlighting6 + - libuchardet0