Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
128 changes: 57 additions & 71 deletions linglong.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -24,24 +24,9 @@ command:
- deepin-reader

build: |
# 下载和安装依赖
# libqt6waylandclient6: libdtk6gui 的隐式依赖(未在 deb 声明),必须随 apt 的 Qt 6.8.0 一起打包,
# 否则链接时会拉取 /runtime 中 webengine 运行时的 libQt6WaylandClient,其私有 ABI 与打包的 Qt 不一致导致链接失败
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 libqt6waylandclient6 cargo rustc pkg-config libjbig2dec0-dev
# 供 rofd 源码构建使用:cargo/rustc 构建工具链;pkg-config 供 sys crate 探测系统库;
# libjbig2dec0-dev 对应 rofd-render 默认开启的 jbig2 特性(cairo/freetype/glib 的 -dev 已在上方列表中)
# libjbig2dec0 已被 base 安装,上面的 --download-only 不会下载其 deb,用 --reinstall
# 强制下载;注意必须先于下方 install_dep 执行,install_dep 才能在 archives 里找到它
apt -y install --download-only --reinstall libjbig2dec0
# 第三个参数强制安装 runtime 已提供的 libqt6waylandclient6;libjbig2dec0 是 rofd 的运行时
# 依赖(jbig2 特性),base 虽自带,但为不随 base 组成变化而破,强制解压随包分发
bash ./install_dep /var/cache/apt/archives "$PREFIX" "libqt6waylandclient6,libjbig2dec0"

# cargo/rustc 等构建工具由 install_dep 解压到 $PREFIX,加入 PATH 供 rofd 构建调用
export PATH="$PREFIX/bin:$PATH"

# ================= 从源码构建 rofd(OFD 支持库) =================
# 源码来自上方 sources 段;crates.io 依赖由 Cargo.lock 固定,构建机需可访问 github 与 crates.io
# 源码来自上方 sources 段;crates.io 依赖由 Cargo.lock 固定,构建机需可访问 github 与 crates.io。
# cargo/rustc 由 buildext.apt.build_depends 声明式安装(base 镜像自带 gcc/g++/cmake/make,无需声明)。
ROFD_SRC=""
for d in /project/linglong/sources/rofd /project/sources/rofd /project/rofd /source/rofd; do
if [ -f "$d/Cargo.toml" ] && [ -f "$d/crates/rofd-ffi/include/rofd.h" ]; then ROFD_SRC="$d"; break; fi
Expand All @@ -61,76 +46,77 @@ build: |
# 依赖它生效;--manifest-path 不参与配置查找,在 /project 下跑会走 crates.io 导致 CI 无外网时失败。
# 必须用子 shell:否则 cwd 停留在 rofd 目录,后续 build/ 与 cmake .. 等相对路径全部错位
(cd "$ROFD_SRC" && CARGO_TARGET_DIR=/tmp/rofd-build cargo build --release -p rofd-ffi)
# 安装到与 librofd-ffi0/librofd-ffi-dev deb 解包完全相同的布局(soname 由 rofd build.rs 固定为 librofd_ffi.so.0,
# deploy_dep 与主工程 CMake 的 find_path/find_library 依赖这些路径)
# 安装到与 librofd-ffi deb 相同的布局(soname 由 rofd build.rs 固定为 librofd_ffi.so.0,
# 主工程 CMake 的 find_path/find_library 依赖这些路径)
ROFD_FFI_VER=$(sed -n 's/^version = "\(.*\)"/\1/p' "$ROFD_SRC/crates/rofd-ffi/Cargo.toml" | head -1)
install -d -m 0755 $PREFIX/lib/${TRIPLET} $PREFIX/include
install -m 0755 /tmp/rofd-build/release/librofd_ffi.so $PREFIX/lib/${TRIPLET}/librofd_ffi.so.$ROFD_FFI_VER
ln -sf librofd_ffi.so.$ROFD_FFI_VER $PREFIX/lib/${TRIPLET}/librofd_ffi.so.0
ln -sf librofd_ffi.so.0 $PREFIX/lib/${TRIPLET}/librofd_ffi.so
install -m 0644 "$ROFD_SRC/crates/rofd-ffi/include/rofd.h" $PREFIX/include/rofd.h
# 刷新 ld 缓存,保证后续 ldd/deploy_dep 能解析 $PREFIX 下 rofd 的运行时依赖(如 libjbig2dec)
if [ -n "$LINGLONG_LD_SO_CACHE" ]; then ldconfig -C "$LINGLONG_LD_SO_CACHE"; fi

# 构建(CMake)
# ================= pandoc 数据目录 =================
# reader 以 --data-dir=${prefix}/share/pandoc/data 调用 pandoc;buildext.apt.depends 合并产物
# 时仅收集 bin/sbin/lib,share/ 会被丢弃,故在构建期从 /usr/share 复制随包分发
# (pandoc 本体经 buildext.apt.depends 声明式分发,其 libyaml/liblua 闭包由 apt 自动解析)
if [ ! -d /usr/share/pandoc/data ]; then
echo "ERROR: /usr/share/pandoc/data 不存在,pandoc 包布局与预期不符" >&2
exit 1
fi
mkdir -p ${PREFIX}/share
cp -a /usr/share/pandoc ${PREFIX}/share/pandoc

# ================= 主工程(CMake) =================
# Qt/DTK 开发文件由 runtime 层提供(挂载于 /runtime),经 CMAKE_PREFIX_PATH 探测:
# 构建期与运行期使用同一套 runtime Qt(含 waylandclient),不再需要打包 apt 的
# libqt6waylandclient6 来规避 apt Qt 与 runtime Qt 混用导致的私有 ABI 链接失败。
# pkg-config 探测的第三方 -dev 库由 buildext.apt.build_depends 安装到 /usr;
# 显式补充 PKG_CONFIG_PATH,确保 /usr 与 $PREFIX 下的 .pc 无论环境默认值如何均可见。
export PKG_CONFIG_PATH="${PREFIX}/lib/${TRIPLET}/pkgconfig:/usr/lib/${TRIPLET}/pkgconfig:/usr/share/pkgconfig${PKG_CONFIG_PATH:+:$PKG_CONFIG_PATH}"
rm -rf build && mkdir -p build && cd build
cmake .. \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX=${PREFIX} \
-DCMAKE_INSTALL_LIBDIR=lib/${TRIPLET} \
-DCMAKE_PREFIX_PATH=${PREFIX} \
-DCMAKE_PREFIX_PATH="${PREFIX};/runtime" \
-DROFD_ROOT=${PREFIX} \
-DCMAKE_EXE_LINKER_FLAGS="-Wl,-rpath-link,${PREFIX}/lib/${TRIPLET}" \
-DCMAKE_SHARED_LINKER_FLAGS="-Wl,-rpath-link,${PREFIX}/lib/${TRIPLET}"
-DCMAKE_EXE_LINKER_FLAGS="-Wl,-rpath-link,${PREFIX}/lib/${TRIPLET}:/runtime/lib/${TRIPLET}:/runtime/lib" \
-DCMAKE_SHARED_LINKER_FLAGS="-Wl,-rpath-link,${PREFIX}/lib/${TRIPLET}:/runtime/lib/${TRIPLET}:/runtime/lib"
make -j$(nproc)
make install > ../install.log 2>&1
cd ..

# 项目生成应用名和动态隐式加载的依赖库,ldd无法找到的其他库
LDD_FILES=(
deepin-reader
deepin-reader-batchprint
../lib/${TRIPLET}/deepin-reader/htmltopdf
pandoc
libdeepin-pdfium-reader.so
# dtk6gui 的隐式依赖,需打包与本体 Qt 版本一致的 waylandclient,避免运行时混用 /runtime 的 Qt
libQt6WaylandClient.so
# 定制插件不存在
libzpdcallback.so
# OFD 支持库,sources 方式源码构建(soname 为 librofd_ffi.so.0,deploy_dep 的 .so 通配
# 会同时收编 .so/.so.0/.so.<ver>);libjbig2dec 为 rofd 默认 jbig2 特性的运行时依赖,
# runtime(webengine) 不提供,必须随包分发
librofd_ffi.so
libjbig2dec.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/${TRIPLET}/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
# 依赖声明:构建期依赖安装进构建容器(/usr);depends 在构建完成后安装并仅合并
# bin/sbin/lib 进产物(share/ 不合并,需要的文件须在 build 中显式复制)。
# 分类依据(base/runtime 包清单核对):
# - base 已提供运行库:libjbig2dec0、liblcms2-2、libopenjp2-7、libfreetype6、libcairo2、
# libglib2.0-0、libjpeg62-turbo —— 不进 depends(depends 对 base 已有包是无效 no-op);
# - runtime 层提供 Qt/DTK 全套开发包(qt6-*-dev、libdtk6*-dev),经 /runtime 前缀探测,
# 不重复列入 build_depends;gcc/cmake/make 由 base 镜像自带,pkg-config 由 runtime 提供;
# - 旧列表中的 libspectre-dev/libicu-dev/libgtest-dev 工程内无对应探测,属冗余,剔除。
buildext:
apt:
build_depends:
- libc6
# rofd(Rust)构建工具链,构建容器内不预置
- cargo
- rustc
# 构建期取 /usr/share/pandoc 数据目录随包复制(见 build 段说明)
- pandoc
# pkg-config 探测的第三方开发库(.pc + 头文件)
- libjbig2dec0-dev # rofd 默认开启的 jbig2 特性
- libdjvulibre-dev # reader: pkg_check_modules(ddjvuapi)
- libgxps-dev # reader: XPS(libgxps cairo glib gobject freetype2)
- libcairo2-dev # reader: XPS/OFD 的 cairo 探测
- libglib2.0-dev # reader: glib-2.0/gobject-2.0 探测
- libfreetype6-dev # reader: XPS 的 freetype2 探测
- libjpeg-dev # reader: pkg_check_modules(libjpeg)
- libchardet-dev # 3rdparty/deepin-pdfium(vendored)
- liblcms2-dev # 3rdparty/deepin-pdfium(vendored)
- libopenjp2-7-dev # 3rdparty/deepin-pdfium(vendored)
- libicu-dev # 3rdparty/deepin-pdfium:pdfium 源码直接包含 <unicode/uchar.h>,
# 无 pkg-config 探测故须显式声明
depends:
# base 与 runtime 均不提供、必须随包分发的运行时依赖
- pandoc # 文档转换子进程(libyaml-0-2/liblua5.3-0 等闭包由 apt 自动解析)
- libdjvulibre21 # reader DT_NEEDED libdjvulibre.so.21
- libgxps2 # reader DT_NEEDED libgxps.so.2
- libchardet1 # 3rdparty/deepin-pdfium DT_NEEDED libchardet.so.1
Loading