From d2bac19750507c10fcb4c3a92017cdec03184885 Mon Sep 17 00:00:00 2001 From: Juan RP Date: Wed, 27 Apr 2016 20:16:59 +0200 Subject: xbps-src: re-introduce etc/virtual. The `etc/virtual` file declares the default package to be built for virtual dependencies declared as "virtual?foo" in $depends. Before this change, the run-time dependency was added as is to the final binary package but no pkg providing this virtual pkg was built. With this file we declare the *default* pkg to be built. NOTE: "virtual?foo" is only applicable to *run* time dependencies, i.e only those declared in $depends. --- common/hooks/pre-pkg/04-generate-runtime-deps.sh | 317 ++++++++++++----------- 1 file changed, 164 insertions(+), 153 deletions(-) (limited to 'common/hooks/pre-pkg') diff --git a/common/hooks/pre-pkg/04-generate-runtime-deps.sh b/common/hooks/pre-pkg/04-generate-runtime-deps.sh index 9a6cc592e4c..17616de77f8 100644 --- a/common/hooks/pre-pkg/04-generate-runtime-deps.sh +++ b/common/hooks/pre-pkg/04-generate-runtime-deps.sh @@ -1,170 +1,181 @@ +# vim: set ts=4 sw=4 et: +# # This hook executes the following tasks: -# - Generates rdeps file with run-time dependencies for xbps-create(8) -# - Generates shlib-requires file for xbps-create(8) +# - Generates rdeps file with run-time dependencies for xbps-create(1) +# - Generates shlib-requires file for xbps-create(1) add_rundep() { - local dep="$1" i= rpkgdep= _depname= _rdeps= found= + local dep="$1" i= rpkgdep= _depname= _rdeps= found= - _depname="$($XBPS_UHELPER_CMD getpkgdepname ${dep} 2>/dev/null)" - if [ -z "${_depname}" ]; then - _depname="$($XBPS_UHELPER_CMD getpkgname ${dep} 2>/dev/null)" - fi + _depname="$($XBPS_UHELPER_CMD getpkgdepname ${dep} 2>/dev/null)" + if [ -z "${_depname}" ]; then + _depname="$($XBPS_UHELPER_CMD getpkgname ${dep} 2>/dev/null)" + fi - for i in ${run_depends}; do - rpkgdep="$($XBPS_UHELPER_CMD getpkgdepname $i 2>/dev/null)" - if [ -z "$rpkgdep" ]; then - rpkgdep="$($XBPS_UHELPER_CMD getpkgname $i 2>/dev/null)" - fi - if [ "${rpkgdep}" != "${_depname}" ]; then - continue - fi - $XBPS_UHELPER_CMD cmpver "$i" "$dep" - rval=$? - if [ $rval -eq 255 ]; then - run_depends="${run_depends/${i}/${dep}}" - fi - found=1 - done - if [ -z "$found" ]; then - run_depends+=" ${dep}" - fi + for i in ${run_depends}; do + rpkgdep="$($XBPS_UHELPER_CMD getpkgdepname $i 2>/dev/null)" + if [ -z "$rpkgdep" ]; then + rpkgdep="$($XBPS_UHELPER_CMD getpkgname $i 2>/dev/null)" + fi + if [ "${rpkgdep}" != "${_depname}" ]; then + continue + fi + $XBPS_UHELPER_CMD cmpver "$i" "$dep" + rval=$? + if [ $rval -eq 255 ]; then + run_depends="${run_depends/${i}/${dep}}" + fi + found=1 + done + if [ -z "$found" ]; then + run_depends+=" ${dep}" + fi +} + +store_pkgdestdir_rundeps() { + if [ -n "$run_depends" ]; then + : > ${PKGDESTDIR}/rdeps + for f in ${run_depends}; do + _curdep="$(echo "$f" | sed -e 's,\(.*\)?.*,\1,')" + if [ -z "$($XBPS_UHELPER_CMD getpkgdepname ${_curdep} 2>/dev/null)" -a \ + -z "$($XBPS_UHELPER_CMD getpkgname ${_curdep} 2>/dev/null)" ]; then + _curdep="${_curdep}>=0" + fi + printf "${_curdep} " >> ${PKGDESTDIR}/rdeps + done + fi } hook() { - local depsftmp f j tmplf mapshlibs sorequires + local depsftmp f j tmplf mapshlibs sorequires _curdep + + # 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 + # error via msg_error(). + trap - ERR - # 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 - # error via msg_error(). - trap - ERR + mapshlibs=$XBPS_COMMONDIR/shlibs + tmplf=$XBPS_SRCPKGDIR/$pkgname/template - mapshlibs=$XBPS_COMMONDIR/shlibs - tmplf=$XBPS_SRCPKGDIR/$pkgname/template + if [ -n "$noarch" -o -n "$noverifyrdeps" ]; then + store_pkgdestdir_rundeps + return 0 + fi - if [ -n "$noarch" -o -n "$noverifyrdeps" ]; then - echo "$run_depends" > ${PKGDESTDIR}/rdeps - sed 's,virtual?,,g' -i ${PKGDESTDIR}/rdeps - return 0 - fi + depsftmp=$(mktemp -t xbps_src_depstmp.XXXXXXXXXX) || return 1 + find ${PKGDESTDIR} -type f -perm -u+w > $depsftmp 2>/dev/null - depsftmp=$(mktemp -t xbps_src_depstmp.XXXXXXXXXX) || return 1 - find ${PKGDESTDIR} -type f -perm -u+w > $depsftmp 2>/dev/null + exec 3<&0 # save stdin + exec < $depsftmp + while read f; do + case "$(file -bi "$f")" in + application/x-executable*|application/x-sharedlib*) + for nlib in $($OBJDUMP -p "$f"|grep NEEDED|awk '{print $2}'); do + if [ -z "$verify_deps" ]; then + verify_deps="$nlib" + continue + fi + for j in ${verify_deps}; do + [ "$j" != "$nlib" ] && continue + found_dup=1 + break + done + if [ -z "$found_dup" ]; then + verify_deps="$verify_deps $nlib" + fi + unset found_dup + done + ;; + esac + done + exec 0<&3 # restore stdin + rm -f $depsftmp - exec 3<&0 # save stdin - exec < $depsftmp - while read f; do - case "$(file -bi "$f")" in - application/x-executable*|application/x-sharedlib*) - for nlib in $($OBJDUMP -p "$f"|grep NEEDED|awk '{print $2}'); do - if [ -z "$verify_deps" ]; then - verify_deps="$nlib" - continue - fi - for j in ${verify_deps}; do - [ "$j" != "$nlib" ] && continue - found_dup=1 - break - done - if [ -z "$found_dup" ]; then - verify_deps="$verify_deps $nlib" - fi - unset found_dup - done - ;; - esac - done - exec 0<&3 # restore stdin - rm -f $depsftmp + # + # Add required run time packages by using required shlibs resolved + # above, the mapping is done thru the mapping_shlib_binpkg.txt 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|awk '{print $2}')" + rdepcnt="$(grep -E "^${_f}[[:blank:]]+.*$" $mapshlibs|awk '{print $2}'|wc -l)" + if [ -z "$rdep" ]; then + # Ignore libs by current pkg + soname=$(find ${PKGDESTDIR} -name "$f") + if [ -z "$soname" ]; then + msg_red_nochroot " SONAME: $f <-> UNKNOWN PKG PLEASE FIX!\n" + broken=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 + if [ "${_pkgname}" = "${x}" ]; then + found=1 + break + fi + done + if [ -n "$found" ]; then + _rdep=$j + break + fi + done + if [ -z "${_rdep}" ]; then + # otherwise pick up the first one. + for j in ${rdep}; do + [ -z "${_rdep}" ] && _rdep=$j + done + 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=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 + fi + done - # - # Add required run time packages by using required shlibs resolved - # above, the mapping is done thru the mapping_shlib_binpkg.txt 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|awk '{print $2}')" - rdepcnt="$(grep -E "^${_f}[[:blank:]]+.*$" $mapshlibs|awk '{print $2}'|wc -l)" - if [ -z "$rdep" ]; then - # Ignore libs by current pkg - soname=$(find ${PKGDESTDIR} -name "$f") - if [ -z "$soname" ]; then - msg_red_nochroot " SONAME: $f <-> UNKNOWN PKG PLEASE FIX!\n" - broken=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 - if [ "${_pkgname}" = "${x}" ]; then - found=1 - break - fi - done - if [ -n "$found" ]; then - _rdep=$j - break - fi - done - if [ -z "${_rdep}" ]; then - # otherwise pick up the first one. - for j in ${rdep}; do - [ -z "${_rdep}" ] && _rdep=$j - done - 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=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 - fi - done + if [ "${_pkgname}" != "${pkgname}" ]; then + echo " SONAME: $f <-> ${_sdep}" + sorequires+="${f} " + else + # Ignore libs by current pkg + echo " SONAME: $f <-> ${_rdep} (ignored)" + continue + fi + add_rundep "${_sdep}" + done + # + # If pkg uses any unknown SONAME error out. + # + if [ -n "$broken" -a -z "$allow_unknown_shlibs" ]; then + msg_error "$pkgver: cannot guess required shlibs, aborting!\n" + fi - if [ "${_pkgname}" != "${pkgname}" ]; then - echo " SONAME: $f <-> ${_sdep}" - sorequires+="${f} " - else - # Ignore libs by current pkg - echo " SONAME: $f <-> ${_rdep} (ignored)" - continue - fi - add_rundep "${_sdep}" - done - # - # If pkg uses any unknown SONAME error out. - # - if [ -n "$broken" -a -z "$allow_unknown_shlibs" ]; then - msg_error "$pkgver: cannot guess required shlibs, aborting!\n" - fi + store_pkgdestdir_rundeps - if [ -n "$run_depends" ]; then - echo "$run_depends" > ${PKGDESTDIR}/rdeps - fi - if [ -s ${PKGDESTDIR}/rdeps ]; then - sed 's,virtual?,,g' -i ${PKGDESTDIR}/rdeps - fi - for f in ${shlib_requires}; do - sorequires+="${f} " - done - if [ -n "${sorequires}" ]; then - echo "${sorequires}" > ${PKGDESTDIR}/shlib-requires - fi + for f in ${shlib_requires}; do + sorequires+="${f} " + done + if [ -n "${sorequires}" ]; then + echo "${sorequires}" > ${PKGDESTDIR}/shlib-requires + fi } -- cgit v1.2.3