05-prepare-32bit.sh (5136B)
1# This hook creates a new PKGDESTDIR with 32bit files for x86_64. 2# 3# Variables that can be used in templates: 4# - lib32depends: if set, 32bit pkg will use this rather than "depends". 5# - lib32disabled: if set, no 32bit pkg will be created. 6# - lib32files: additional files to add to the 32bit pkg (abs paths, separated by blanks). 7# - lib32symlinks: makes a symlink from lib32 to lib of the specified file (basename). 8# - lib32mode: 9# * if unset only files for libraries will be copied. 10# * if set to "full" all files will be copied. 11 12hook() { 13 local destdir32=${XBPS_DESTDIR}/${pkgname}-32bit-${version} 14 15 # By default always enabled unless "lib32disabled" is set. 16 if [ -n "$lib32disabled" ]; then 17 return 18 fi 19 # This hook will only work when building for x86. 20 if [ "$XBPS_TARGET_MACHINE" != "i686" ]; then 21 return 22 fi 23 if [ -z "$lib32mode" ]; then 24 # Library mode, copy only relevant files to new destdir. 25 # 26 # If /usr/lib does not exist don't continue... 27 if [ ! -d ${PKGDESTDIR}/usr/lib ]; then 28 return 29 fi 30 mkdir -p ${destdir32}/usr/lib32 31 cp -a ${PKGDESTDIR}/usr/lib/* ${destdir32}/usr/lib32 32 33 # Only keep shared libs, static libs, and pkg-config files. 34 find "${destdir32}" -not \( \ 35 -name '*.pc' -or \ 36 -name '*.so' -or \ 37 -name '*.so.*' -or \ 38 -name '*.a' -or \ 39 -name '*.la' -or \ 40 -name '*.o' -or \ 41 -type d \ 42 \) -delete 43 44 # Remove empty dirs. 45 while IFS= read -r -d '' f; do 46 _dir="${f##${destdir32}}" 47 [ -z "${_dir}" ] && continue 48 rmdir --ignore-fail-on-non-empty -p "$f" &>/dev/null 49 done < <(find ${destdir32} -type d -empty -print0 | sort -uz) 50 51 # Switch pkg-config files to lib32. 52 if [ -d ${destdir32}/usr/lib32/pkgconfig ]; then 53 sed -e 's,/usr/lib$,/usr/lib32,g' \ 54 -e 's,${exec_prefix}/lib$,${exec_prefix}/lib32,g' \ 55 -i ${destdir32}/usr/lib32/pkgconfig/*.pc 56 fi 57 elif [ "$lib32mode" = "full" ]; then 58 # Full 32bit mode; copy everything to new destdir. 59 mkdir -p ${destdir32} 60 cp -a ${PKGDESTDIR}/* ${destdir32}/ 61 # remove symlink 62 if [ -h ${destdir32}/usr/lib32 ]; then 63 rm ${destdir32}/usr/lib32 64 fi 65 # if /usr/lib dir exists move it to lib32. 66 if [ -d ${destdir32}/usr/lib ]; then 67 mv ${destdir32}/usr/lib ${destdir32}/usr/lib32 68 fi 69 fi 70 if [ ! -d ${destdir32} ]; then 71 return 72 fi 73 74 # If the rdeps file exist (runtime deps), copy and then modify it for 75 # 32bit dependencies. 76 trap - ERR 77 78 : > ${destdir32}/rdeps 79 80 if [ -s "$PKGDESTDIR/rdeps" ]; then 81 if [ -n "$lib32depends" ]; then 82 _deps="${lib32depends}" 83 else 84 _deps="$(<${PKGDESTDIR}/rdeps)" 85 fi 86 for f in ${_deps}; do 87 unset found pkgn pkgv _shprovides 88 89 pkgn="$($XBPS_UHELPER_CMD getpkgdepname $f)" 90 if [ -z "${pkgn}" ]; then 91 pkgn="$($XBPS_UHELPER_CMD getpkgname $f)" 92 if [ -z "${pkgn}" ]; then 93 msg_error "$pkgver: invalid dependency $f\n" 94 fi 95 pkgv="-$($XBPS_UHELPER_CMD getpkgversion ${f})" 96 else 97 pkgv="$($XBPS_UHELPER_CMD getpkgdepversion ${f})" 98 fi 99 # If dependency is a development pkg switch it to 32bit. 100 if [[ $pkgn =~ '-devel' ]]; then 101 echo " RDEP: $f -> ${pkgn}-32bit${pkgv} (development)" 102 printf "${pkgn}-32bit${pkgv} " >> ${destdir32}/rdeps 103 continue 104 fi 105 # If dependency does not have "shlib-provides" do not 106 # change it to 32bit. 107 for x in ${subpackages}; do 108 if [ "$x" = "$pkgn" ]; then 109 found=1 110 break 111 fi 112 done 113 if [ -z "$found" ]; then 114 # Dependency is not a subpkg, check shlib-provides 115 # via binpkgs. 116 _shprovides="$($XBPS_QUERY_CMD -R --property=shlib-provides "$pkgn")" 117 if [ -n "${_shprovides}" ]; then 118 echo " RDEP: $f -> ${pkgn}-32bit${pkgv} (shlib-provides)" 119 printf "${pkgn}-32bit${pkgv} " >> ${destdir32}/rdeps 120 else 121 echo " RDEP: $f -> ${pkgn}${pkgv} (no shlib-provides)" 122 printf "${pkgn}${pkgv} " >> ${destdir32}/rdeps 123 fi 124 else 125 if [ -s ${XBPS_DESTDIR}/${pkgn}-${version}/shlib-provides ]; then 126 # Dependency is a subpkg; check if it provides any shlib 127 # and convert to 32bit if true. 128 echo " RDEP: $f -> ${pkgn}-32bit${pkgv} (subpkg, shlib-provides)" 129 printf "${pkgn}-32bit${pkgv} " >> ${destdir32}/rdeps 130 else 131 echo " RDEP: $f -> ${pkgn}${pkgv} (subpkg, no shlib-provides)" 132 printf "${pkgn}${pkgv} " >> ${destdir32}/rdeps 133 fi 134 fi 135 done 136 fi 137 138 # Also install additional files set via "lib32files". 139 for f in ${lib32files}; do 140 echo "$pkgver: installing additional files: $f ..." 141 _targetdir=${destdir32}/${f%/*}/ 142 mkdir -p ${_targetdir/\/usr\/lib/\/usr\/lib32} 143 cp -a ${PKGDESTDIR}/${f} ${_targetdir/\/usr\/lib/\/usr\/lib32} 144 done 145 # Additional symlinks to the native libdir. 146 for f in ${lib32symlinks}; do 147 echo "$pkgver: symlinking $f to the native libdir..." 148 if [ "${f%/*}" != "${f}" ]; then 149 mkdir -p ${destdir32}/usr/lib{,32}/${f%/*}/ 150 else 151 mkdir -p ${destdir32}/usr/lib{,32}/ 152 fi 153 ln -sfr ${destdir32}/usr/lib32/$f ${destdir32}/usr/lib/$f 154 done 155 # If it's a development pkg add a dependency to the 64bit pkg. 156 if [[ $pkgname =~ '-devel' ]]; then 157 echo " RDEP: ${pkgver}" 158 printf "${pkgver} " >> ${destdir32}/rdeps 159 fi 160 printf "\n" >> ${destdir32}/rdeps 161}