From a80636e6d36c12cec7775f8c39bd20ea73fa30fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=90o=C3=A0n=20Tr=E1=BA=A7n=20C=C3=B4ng=20Danh?= Date: Wed, 9 Aug 2023 19:52:39 +0700 Subject: [PATCH 1/4] hooks: move prepare-32bit and shlib-provides to post-install In a later change, we will generate shlib-depends cross subpkgs during pre-pkg stage. Thus we need shlib-provides information of all subpkgs ready before pre-pkg is run. Those information can only be read in post-install stage at the eariliest. Let's move the shlib-provides to post-install. This hook requires prepare-32bit, so, let's move that hook, too. --- .../05-prepare-32bit.sh => post-install/80-prepare-32bit.sh} | 0 .../06-shlib-provides.sh => post-install/98-shlib-provides.sh} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename common/hooks/{pre-pkg/05-prepare-32bit.sh => post-install/80-prepare-32bit.sh} (100%) rename common/hooks/{pre-pkg/06-shlib-provides.sh => post-install/98-shlib-provides.sh} (100%) diff --git a/common/hooks/pre-pkg/05-prepare-32bit.sh b/common/hooks/post-install/80-prepare-32bit.sh similarity index 100% rename from common/hooks/pre-pkg/05-prepare-32bit.sh rename to common/hooks/post-install/80-prepare-32bit.sh diff --git a/common/hooks/pre-pkg/06-shlib-provides.sh b/common/hooks/post-install/98-shlib-provides.sh similarity index 100% rename from common/hooks/pre-pkg/06-shlib-provides.sh rename to common/hooks/post-install/98-shlib-provides.sh From 26c3e2ff318c59934b8a170c8ca410f984a9a9f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=90o=C3=A0n=20Tr=E1=BA=A7n=20C=C3=B4ng=20Danh?= Date: Tue, 8 Aug 2023 22:08:27 +0700 Subject: [PATCH 2/4] hooks/shlib-provides: record shared libraries without SONAME In a later change, we would like to generate runtime-deps between sub-packages. In order to do that, we can add everything into etc/shlibs or we can look into other subpackages directly. The former is cumbersome if such package has lot of shared-objects. The latter requires traversing and checking a lot of files. Furtunately, we can speed up the latter one by storing all shared-objects' information in a centralised place. --- .../hooks/post-install/98-shlib-provides.sh | 21 +++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/common/hooks/post-install/98-shlib-provides.sh b/common/hooks/post-install/98-shlib-provides.sh index a09eb6f5c3b33..e9d20e740ae9d 100644 --- a/common/hooks/post-install/98-shlib-provides.sh +++ b/common/hooks/post-install/98-shlib-provides.sh @@ -6,19 +6,25 @@ collect_sonames() { local _pattern="^[[:alnum:]]+(.*)+\.so(\.[0-9]+)*$" local _versioned_pattern="^[[:alnum:]]+(.*)+\.so(\.[0-9]+)+$" local _tmpfile=$(mktemp) || exit 1 + local _mainpkg="$2" + local _shlib_dir="${XBPS_STATEDIR}/shlib-provides" + local _no_soname=$(mktemp) || exit 1 + mkdir -p "${_shlib_dir}" || exit 1 if [ ! -d ${_destdir} ]; then rm -f ${_tmpfile} + rm -f ${_no_soname} return 0 fi + # real pkg find ${_destdir} -type f -name "*.so*" | while read f; do _fname="${f##*/}" case "$(file -bi "$f")" in application/x-sharedlib*|application/x-pie-executable*) # shared library - _soname=$(${OBJDUMP} -p "$f"|grep SONAME|awk '{print $2}') + _soname=$(${OBJDUMP} -p "$f"|awk '/SONAME/{print $2}') # Register all versioned sonames, and # unversioned sonames only when in libdir. if [[ ${_soname} =~ ${_versioned_pattern} ]] || @@ -27,6 +33,9 @@ collect_sonames() { -e ${_destdir}/usr/lib32/${_fname} ) ]]; then echo "${_soname}" >> ${_tmpfile} echo " SONAME ${_soname} from ${f##${_destdir}}" + else + # register all shared lib for rt-deps between sub-pkg + echo "${_fname}" >>${_no_soname} fi ;; esac @@ -38,6 +47,14 @@ collect_sonames() { if [ -s "${_tmpfile}" ]; then tr '\n' ' ' < "${_tmpfile}" > ${_destdir}/shlib-provides echo >> ${_destdir}/shlib-provides + if [ "$_mainpkg" ]; then + cp "${_tmpfile}" "${_shlib_dir}/${pkgname}.soname" + fi + fi + if [ "$_mainpkg" ] && [ -s "${_no_soname}" ]; then + mv "${_no_soname}" "${_shlib_dir}/${pkgname}.nosoname" + else + rm -f ${_no_soname} fi rm -f ${_tmpfile} } @@ -50,7 +67,7 @@ hook() { fi # native pkg - collect_sonames ${PKGDESTDIR} + collect_sonames ${PKGDESTDIR} yes # 32bit pkg collect_sonames ${_destdir32} } From 769f158568a19bc491c66a851f5e1357dce2326e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=90o=C3=A0n=20Tr=E1=BA=A7n=20C=C3=B4ng=20Danh?= Date: Wed, 9 Aug 2023 19:53:05 +0700 Subject: [PATCH 3/4] hooks/gen-rt-deps: Look for rt-deps by subpkg first, common/shlibs later --- .../hooks/pre-pkg/04-generate-runtime-deps.sh | 80 +++++++------------ 1 file changed, 29 insertions(+), 51 deletions(-) diff --git a/common/hooks/pre-pkg/04-generate-runtime-deps.sh b/common/hooks/pre-pkg/04-generate-runtime-deps.sh index a291f2ccc8720..64b3462657c45 100644 --- a/common/hooks/pre-pkg/04-generate-runtime-deps.sh +++ b/common/hooks/pre-pkg/04-generate-runtime-deps.sh @@ -47,6 +47,7 @@ store_pkgdestdir_rundeps() { hook() { local depsftmp f lf j mapshlibs sorequires _curdep elfmagic broken_shlibs verify_deps + local _shlib_dir="${XBPS_STATEDIR}/shlib-provides" # Disable trap on ERR, xbps-uhelper cmd might return error... but not something # to be worried about because if there are broken shlibs this hook returns @@ -95,65 +96,42 @@ hook() { # above, the mapping is done thru the common/shlibs file. # for f in ${verify_deps}; do - unset _f j rdep _rdep rdepcnt soname _pkgname _rdepver found - _f=$(echo "$f"|sed -E 's|\+|\\+|g') - rdep="$(grep -E "^${_f}[[:blank:]]+.*$" $mapshlibs|cut -d ' ' -f2)" - rdepcnt="$(grep -E "^${_f}[[:blank:]]+.*$" $mapshlibs|cut -d ' ' -f2|wc -l)" - if [ -z "$rdep" ]; then + unset _rdep _pkgname _rdepver + + if [ "$(find ${PKGDESTDIR} -name "$f")" ]; then # Ignore libs by current pkg - soname=$(find ${PKGDESTDIR} -name "$f") - if [ -z "$soname" ]; then + echo " SONAME: $f <-> $pkgname (ignored)" + continue + # If this library is provided by a subpkg of sourcepkg, use that subpkg + elif _pkgname="$(cd "$_shlib_dir" && grep -F -l -x "$f" *.soname)"; then + # If that library has SONAME, add it to shlibs-requires, too. + _pkgname=${_pkgname%.soname} + _sdep="${_pkgname}-${version}_${revision}" + sorequires+="${f} " + elif _pkgname="$(cd "$_shlib_dir" && grep -F -l -x "$f" *.nosoname)"; then + _pkgname=${_pkgname%.nosoname} + _sdep="${_pkgname}-${version}_${revision}" + else + _rdep="$(awk -v sl="$f" '$1 == sl { print $2; exit; }' "$mapshlibs")" + + if [ -z "$_rdep" ]; then msg_red_nochroot " SONAME: $f <-> UNKNOWN PKG PLEASE FIX!\n" broken_shlibs=1 - else - echo " SONAME: $f <-> $pkgname (ignored)" - fi - continue - elif [ "$rdepcnt" -gt 1 ]; then - unset j found - # Check if shlib is provided by multiple pkgs. - for j in ${rdep}; do - _pkgname=$($XBPS_UHELPER_CMD getpkgname "$j") - # if there's a SONAME matching pkgname, use it. - for x in ${pkgname} ${subpackages}; do - [[ $_pkgname == $x ]] && found=1 && break - done - [[ $found ]] && _rdep=$j && break - done - if [ -z "${_rdep}" ]; then - # otherwise pick up the first one. - for j in ${rdep}; do - [ -z "${_rdep}" ] && _rdep=$j - done + continue fi - else - _rdep=$rdep - fi - _pkgname=$($XBPS_UHELPER_CMD getpkgname "${_rdep}" 2>/dev/null) - _rdepver=$($XBPS_UHELPER_CMD getpkgversion "${_rdep}" 2>/dev/null) - if [ -z "${_pkgname}" -o -z "${_rdepver}" ]; then - msg_red_nochroot " SONAME: $f <-> UNKNOWN PKG PLEASE FIX!\n" - broken_shlibs=1 - continue - fi - # Check if pkg is a subpkg of sourcepkg; if true, ignore version - # in common/shlibs. - _sdep="${_pkgname}>=${_rdepver}" - for _subpkg in ${subpackages}; do - if [ "${_subpkg}" = "${_pkgname}" ]; then - _sdep="${_pkgname}-${version}_${revision}" - break + _pkgname=$($XBPS_UHELPER_CMD getpkgname "${_rdep}" 2>/dev/null) + _rdepver=$($XBPS_UHELPER_CMD getpkgversion "${_rdep}" 2>/dev/null) + if [ -z "${_pkgname}" -o -z "${_rdepver}" ]; then + msg_red_nochroot " SONAME: $f <-> UNKNOWN PKG PLEASE FIX!\n" + broken_shlibs=1 + continue fi - done + _sdep="${_pkgname}>=${_rdepver}" - if [ "${_pkgname}" != "${pkgname}" ]; then - echo " SONAME: $f <-> ${_sdep}" + # By this point, SONAME can't be found in current pkg sorequires+="${f} " - else - # Ignore libs by current pkg - echo " SONAME: $f <-> ${_rdep} (ignored)" - continue fi + echo " SONAME: $f <-> ${_sdep}" add_rundep "${_sdep}" done # From df08ed2b500103ab1a593a7cb6444d89759985f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=90o=C3=A0n=20Tr=E1=BA=A7n=20C=C3=B4ng=20Danh?= Date: Wed, 9 Aug 2023 19:53:12 +0700 Subject: [PATCH 4/4] libreoffice: verify dependencies --- srcpkgs/libreoffice-epub | 1 - srcpkgs/libreoffice/template | 27 +++------------------------ 2 files changed, 3 insertions(+), 25 deletions(-) delete mode 120000 srcpkgs/libreoffice-epub diff --git a/srcpkgs/libreoffice-epub b/srcpkgs/libreoffice-epub deleted file mode 120000 index d5e3a56f35028..0000000000000 --- a/srcpkgs/libreoffice-epub +++ /dev/null @@ -1 +0,0 @@ -libreoffice \ No newline at end of file diff --git a/srcpkgs/libreoffice/template b/srcpkgs/libreoffice/template index a5ade73cc1969..709ffe8d7161b 100644 --- a/srcpkgs/libreoffice/template +++ b/srcpkgs/libreoffice/template @@ -488,8 +488,9 @@ do_install() { libreoffice-common_package() { short_desc+=" - Common files" - depends="hunspell hyphen mythes openldap libreoffice-i18n-en-US>=${version}_${revision}" + depends="libreoffice-i18n-en-US>=${version}_${revision}" skiprdeps=/usr/lib/libreoffice/program/libofficebean.so + replaces="libreoffice-epub>=0" pkg_install() { _split common } @@ -498,7 +499,6 @@ libreoffice-common_package() { libreoffice-base_package() { short_desc+=" - Database frontend" depends="libreoffice-writer>=${version}_${revision}" - noverifyrdeps=yes pkg_install() { _split base } @@ -507,7 +507,6 @@ libreoffice-base_package() { libreoffice-calc_package() { short_desc+=" - Spreadsheet" depends="libreoffice-writer>=${version}_${revision}" - noverifyrdeps=yes pkg_install() { _split calc } @@ -516,7 +515,6 @@ libreoffice-calc_package() { libreoffice-draw_package() { short_desc+=" - Drawing application" depends="sane libreoffice-writer>=${version}_${revision}" - noverifyrdeps=yes pkg_install() { _split draw } @@ -556,8 +554,6 @@ libreoffice-fonts_package() { libreoffice-gnome_package() { short_desc+=" - GNOME integration" - depends="libreoffice-common>=${version}_${revision}" - noverifyrdeps=yes pkg_install() { _split gnome } @@ -566,7 +562,6 @@ libreoffice-gnome_package() { libreoffice-impress_package() { short_desc+=" - Presentation application" depends="libreoffice-writer>=${version}_${revision}" - noverifyrdeps=yes pkg_install() { _split impress } @@ -574,8 +569,6 @@ libreoffice-impress_package() { libreoffice-kde_package() { short_desc+=" - KDE integration" - depends="libreoffice-common>=${version}_${revision}" - noverifyrdeps=yes pkg_install() { cat > ${wrksrc}/file-lists/kde5_list.txt <<-EOF %dir /usr/lib/libreoffice/program @@ -593,8 +586,6 @@ libreoffice-kde_package() { libreoffice-qt6_package() { short_desc+=" - Qt6 integration" - depends="libreoffice-common>=${version}_${revision}" - noverifyrdeps=yes pkg_install() { cat > ${wrksrc}/file-lists/qt6_list.txt <<-EOF %dir /usr/lib/libreoffice/program @@ -615,7 +606,6 @@ libreoffice-kit_package() { libreoffice-math_package() { short_desc+=" - Equation editor" depends="libreoffice-writer>=${version}_${revision}" - noverifyrdeps=yes pkg_install() { _split math } @@ -623,8 +613,7 @@ libreoffice-math_package() { libreoffice-postgresql_package() { short_desc+=" - Connector for PostgreSQL" - depends="libreoffice-base>=${version}_${revision} libreoffice-common>=${version}_${revision}" - noverifyrdeps=yes + depends="libreoffice-base>=${version}_${revision}" pkg_install() { _split postgresql } @@ -632,25 +621,15 @@ libreoffice-postgresql_package() { libreoffice-writer_package() { short_desc+=" - Word processor" - depends="libreoffice-common>=${version}_${revision}" - noverifyrdeps=yes pkg_install() { _split writer } } -libreoffice-epub_package() { - short_desc+=" - EPUB output" - build_style=meta - depends="libreoffice-common>=${version}_${revision} libepubgen libabw libe-book - libetonyek libwps" -} - # Use a name which makes this catch-all subpackage the last one libreoffice-xtensions_package() { short_desc+=" - Extensions" depends="libreoffice-common>=${version}_${revision}" - noverifyrdeps=yes pkg_install() { # Remove empty files find ${DESTDIR}/all -size 0 -delete