build_dependencies.sh (15344B)
1# vim: set ts=4 sw=4 et: 2# 3setup_pkg_depends() { 4 local pkg="$1" out="$2" with_subpkgs="$3" j _rpkgname _depname _pkgname foo _deps collected 5 6 if [[ $pkg ]]; then 7 # subpkg 8 if declare -f ${pkg}_package >/dev/null; then 9 ${pkg}_package 10 fi 11 elif [[ $with_subpkgs ]]; then 12 collected="${depends}" 13 for pkg in $subpackages; do 14 [[ $pkg ]] || continue 15 ${pkg}_package 16 collected+=" ${depends}" 17 done 18 depends="${collected}" 19 fi 20 21 for j in ${depends}; do 22 _rpkgname="${j%\?*}" 23 _depname="${j#*\?}" 24 if [[ ${_rpkgname} == virtual ]]; then 25 _pkgname=$(xbps-uhelper getpkgname $_depname 2>/dev/null) 26 [ -z "$_pkgname" ] && _pkgname="$_depname" 27 if [ -s ${XBPS_DISTDIR}/etc/virtual ]; then 28 foo=$(egrep "^${_pkgname}[[:blank:]]" ${XBPS_DISTDIR}/etc/virtual|cut -d ' ' -f2) 29 elif [ -s ${XBPS_DISTDIR}/etc/defaults.virtual ]; then 30 foo=$(egrep "^${_pkgname}[[:blank:]]" ${XBPS_DISTDIR}/etc/defaults.virtual|cut -d ' ' -f2) 31 fi 32 if [ -z "$foo" ]; then 33 msg_error "$pkgver: failed to resolve virtual dependency for '$j' (missing from etc/virtual)\n" 34 fi 35 [[ $out ]] && echo "$foo" 36 else 37 foo="$($XBPS_UHELPER_CMD getpkgdepname ${_depname} 2>/dev/null)" 38 if [ -z "$foo" ]; then 39 foo="$($XBPS_UHELPER_CMD getpkgname ${_depname} 2>/dev/null)" 40 [ -z "$foo" ] && foo="${_depname}" 41 fi 42 [[ $out ]] && echo "$foo" 43 fi 44 run_depends+="${_depname} " 45 done 46 47 return 0 48} 49 50# 51# Install required package dependencies, like: 52# 53# xbps-install -Ay <pkgs> 54# 55# -A automatic mode 56# -y yes 57# 58# Returns 0 if package already installed or installed successfully. 59# Any other error number otherwise. 60# 61# SUCCESS (0): package installed successfully. 62# ENOENT (2): package missing in repositories. 63# ENXIO (6): package depends on invalid dependencies. 64# EAGAIN (11): package conflicts. 65# EBUSY (16): package 'xbps' needs to be updated. 66# EEXIST (17): file conflicts in transaction (XBPS_FLAG_IGNORE_FILE_CONFLICTS unset) 67# ENODEV (19): package depends on missing dependencies. 68# ENOTSUP (95): no repositories registered. 69# -1 (255): unexpected error. 70 71install_pkg_from_repos() { 72 local cross="$1" rval tmplogf cmd 73 shift 74 75 [ $# -eq 0 ] && return 0 76 77 mkdir -p $XBPS_STATEDIR 78 tmplogf=${XBPS_STATEDIR}/xbps_${XBPS_TARGET_MACHINE}_bdep_${pkg}.log 79 80 cmd=$XBPS_INSTALL_CMD 81 [[ $cross ]] && cmd=$XBPS_INSTALL_XCMD 82 $cmd -Ay "$@" >$tmplogf 2>&1 83 rval=$? 84 85 case "$rval" in 86 0) # success, check if there are errors. 87 errortmpf=$(mktemp) || exit 1 88 grep ^ERROR $tmplogf > $errortmpf 89 [ -s $errortmpf ] && cat $errortmpf 90 rm -f $errortmpf 91 ;; 92 *) 93 [ -z "$XBPS_KEEP_ALL" ] && remove_pkg_autodeps 94 msg_red "$pkgver: failed to install '$1' dependency! (error $rval)\n" 95 cat $tmplogf 96 rm -f $tmplogf 97 msg_error "Please see above for the real error, exiting...\n" 98 ;; 99 esac 100 rm -f $tmplogf 101 return $rval 102} 103 104# 105# Returns 0 if pkgpattern in $1 is installed and greater than current 106# installed package, otherwise 1. 107# 108check_installed_pkg() { 109 local pkg="$1" cross="$2" uhelper= pkgn= iver= 110 111 [ -z "$pkg" ] && return 2 112 113 pkgn="$($XBPS_UHELPER_CMD getpkgname ${pkg})" 114 [ -z "$pkgn" ] && return 2 115 116 uhelper=$XBPS_UHELPER_CMD 117 [[ $cross ]] && uhelper=$XBPS_UHELPER_XCMD 118 iver="$($uhelper version $pkgn)" 119 if [ $? -eq 0 -a -n "$iver" ]; then 120 $XBPS_CMPVER_CMD "${pkgn}-${iver}" "${pkg}" 121 [ $? -eq 0 -o $? -eq 1 ] && return 0 122 fi 123 124 return 1 125} 126 127# 128# Build all dependencies required to build and run. 129# 130install_pkg_deps() { 131 local pkg="$1" targetpkg="$2" target="$3" cross="$4" cross_prepare="$5" 132 local _vpkg curpkgdepname 133 local i j found style 134 local templates="" 135 136 local -a host_binpkg_deps binpkg_deps 137 local -a host_missing_deps missing_deps missing_rdeps 138 139 [ -z "$pkgname" ] && return 2 140 [ -z "$XBPS_CHECK_PKGS" ] && unset checkdepends 141 [[ $build_style ]] && style=" [$build_style]" 142 143 for s in $build_helper; do 144 style+=" [$s]" 145 done 146 147 if [ "$pkg" != "$targetpkg" ]; then 148 msg_normal "$pkgver: building${style} (dependency of $targetpkg) for $XBPS_TARGET_MACHINE...\n" 149 else 150 msg_normal "$pkgver: building${style} for $XBPS_TARGET_MACHINE...\n" 151 fi 152 153 # 154 # Host build dependencies. 155 # 156 if [[ ${hostmakedepends} ]]; then 157 templates="" 158 # check validity 159 for f in ${hostmakedepends}; do 160 if [ -f $XBPS_SRCPKGDIR/$f/template ]; then 161 templates+=" $f" 162 continue 163 fi 164 local _repourl=$($XBPS_QUERY_CMD -R -prepository "$f" 2>/dev/null) 165 if [ "$_repourl" ]; then 166 echo " [host] ${f}: found (${_repourl})" 167 host_binpkg_deps+=("$f") 168 continue 169 fi 170 msg_error "$pkgver: host dependency '$f' does not exist!\n" 171 done 172 while read -r _depname _deprepover _depver _subpkg _repourl; do 173 _vpkg=${_subpkg}-${_depver} 174 # binary package found in a repo 175 if [[ ${_depver} == ${_deprepover} ]]; then 176 echo " [host] ${_vpkg}: found (${_repourl})" 177 host_binpkg_deps+=("${_vpkg}") 178 continue 179 fi 180 # binary package not found 181 if [[ $_depname != $_subpkg ]]; then 182 # subpkg, check if it's a subpkg of itself 183 found=0 184 for f in ${subpackages}; do 185 if [[ ${_subpkg} == ${f} ]]; then 186 found=1 187 break 188 fi 189 done 190 if [[ $found -eq 1 ]] && [[ -z "$cross" ]]; then 191 echo " [host] ${_vpkg}: not found (subpkg, ignored)" 192 else 193 echo " [host] ${_vpkg}: not found" 194 host_missing_deps+=("$_vpkg") 195 fi 196 else 197 echo " [host] ${_vpkg}: not found" 198 host_missing_deps+=("$_vpkg") 199 fi 200 done < <($XBPS_CHECKVERS_CMD -D $XBPS_DISTDIR -sm $templates) 201 fi 202 203 # 204 # Host check dependencies. 205 # 206 if [[ ${checkdepends} ]] && [[ $XBPS_CHECK_PKGS ]] && [ -z "$XBPS_CROSS_BUILD" ]; then 207 templates="" 208 # check validity 209 for f in ${checkdepends}; do 210 if [ -f $XBPS_SRCPKGDIR/$f/template ]; then 211 templates+=" $f" 212 continue 213 fi 214 local _repourl=$($XBPS_QUERY_CMD -R -prepository "$f" 2>/dev/null) 215 if [ "$_repourl" ]; then 216 echo " [host] ${f}: found (${_repourl})" 217 host_binpkg_deps+=("$f") 218 continue 219 fi 220 msg_error "$pkgver: check dependency '$f' does not exist!\n" 221 done 222 while read -r _depname _deprepover _depver _subpkg _repourl; do 223 _vpkg=${_subpkg}-${_depver} 224 # binary package found in a repo 225 if [[ ${_depver} == ${_deprepover} ]]; then 226 echo " [check] ${_vpkg}: found (${_repourl})" 227 host_binpkg_deps+=("${_vpkg}") 228 continue 229 fi 230 # binary package not found 231 if [[ $_depname != $_subpkg ]]; then 232 # subpkg, check if it's a subpkg of itself 233 found=0 234 for f in ${subpackages}; do 235 if [[ ${_subpkg} == ${f} ]]; then 236 found=1 237 break 238 fi 239 done 240 if [[ $found -eq 1 ]]; then 241 echo " [check] ${_vpkg}: not found (subpkg, ignored)" 242 else 243 echo " [check] ${_vpkg}: not found" 244 host_missing_deps+=("$_vpkg") 245 fi 246 else 247 echo " [check] ${_vpkg}: not found" 248 host_missing_deps+=("$_vpkg") 249 fi 250 done < <($XBPS_CHECKVERS_CMD -D $XBPS_DISTDIR -sm ${templates}) 251 fi 252 253 # 254 # Target build dependencies. 255 # 256 if [[ ${makedepends} ]]; then 257 templates="" 258 # check validity 259 for f in ${makedepends}; do 260 if [ -f $XBPS_SRCPKGDIR/$f/template ]; then 261 templates+=" $f" 262 continue 263 fi 264 local _repourl=$($XBPS_QUERY_XCMD -R -prepository "$f" 2>/dev/null) 265 if [ "$_repourl" ]; then 266 echo " [target] ${f}: found (${_repourl})" 267 binpkg_deps+=("$f") 268 continue 269 fi 270 msg_error "$pkgver: target dependency '$f' does not exist!\n" 271 done 272 while read -r _depname _deprepover _depver _subpkg _repourl; do 273 _vpkg=${_subpkg}-${_depver} 274 # binary package found in a repo 275 if [[ ${_depver} == ${_deprepover} ]]; then 276 echo " [target] ${_vpkg}: found (${_repourl})" 277 binpkg_deps+=("${_vpkg}") 278 continue 279 fi 280 # binary package not found 281 if [[ $_depname != $_subpkg ]]; then 282 # subpkg, check if it's a subpkg of itself 283 found=0 284 for f in ${subpackages}; do 285 if [[ ${_subpkg} == ${f} ]]; then 286 found=1 287 break 288 fi 289 done 290 if [[ $found -eq 1 ]]; then 291 msg_error "[target] ${_vpkg}: target dependency '${_subpkg}' is a subpackage of $pkgname\n" 292 else 293 echo " [target] ${_vpkg}: not found" 294 missing_deps+=("$_vpkg") 295 fi 296 else 297 echo " [target] ${_vpkg}: not found" 298 missing_deps+=("$_vpkg") 299 fi 300 done < <($XBPS_CHECKVERS_XCMD -D $XBPS_DISTDIR -sm $templates) 301 fi 302 303 # 304 # Target run time dependencies 305 # 306 local _cleandeps=$(setup_pkg_depends "" 1 1) || exit 1 307 if [[ ${_cleandeps} ]]; then 308 templates="" 309 for f in ${_cleandeps}; do 310 if [ -f $XBPS_SRCPKGDIR/$f/template ]; then 311 templates+=" $f" 312 continue 313 fi 314 local _repourl=$($XBPS_QUERY_XCMD -R -prepository "$f" 2>/dev/null) 315 if [ "$_repourl" ]; then 316 echo " [target] ${f}: found (${_repourl})" 317 continue 318 fi 319 msg_error "$pkgver: target dependency '$f' does not exist!\n" 320 done 321 while read -r _depname _deprepover _depver _subpkg _repourl; do 322 _vpkg=${_subpkg}-${_depver} 323 # binary package found in a repo 324 if [[ ${_depver} == ${_deprepover} ]]; then 325 echo " [runtime] ${_vpkg}: found (${_repourl})" 326 continue 327 fi 328 # binary package not found 329 if [[ $_depname != $_subpkg ]]; then 330 # subpkg, check if it's a subpkg of itself 331 found=0 332 for f in ${subpackages}; do 333 if [[ ${_subpkg} == ${f} ]]; then 334 found=1 335 break 336 fi 337 done 338 if [[ $found -eq 1 ]]; then 339 echo " [runtime] ${_vpkg}: not found (subpkg, ignored)" 340 else 341 echo " [runtime] ${_vpkg}: not found" 342 missing_rdeps+=("$_vpkg") 343 fi 344 elif [[ ${_depname} == ${pkgname} ]]; then 345 echo " [runtime] ${_vpkg}: not found (self, ignored)" 346 else 347 echo " [runtime] ${_vpkg}: not found" 348 missing_rdeps+=("$_vpkg") 349 fi 350 done < <($XBPS_CHECKVERS_XCMD -D $XBPS_DISTDIR -sm $templates) 351 fi 352 353 if [ -n "$XBPS_BUILD_ONLY_ONE_PKG" ]; then 354 for i in ${host_missing_deps[@]}; do 355 msg_error "dep ${i} not found: -1 passed: instructed not to build\n" 356 done 357 for i in ${missing_rdeps[@]}; do 358 msg_error "dep ${i} not found: -1 passed: instructed not to build\n" 359 done 360 for i in ${missing_deps[@]}; do 361 msg_error "dep ${i} not found: -1 passed: instructed not to build\n" 362 done 363 fi 364 365 # Missing host dependencies, build from srcpkgs. 366 for i in ${host_missing_deps[@]}; do 367 # packages not found in repos, install from source. 368 ( 369 curpkgdepname=$($XBPS_UHELPER_CMD getpkgname "$i" 2>/dev/null) 370 setup_pkg $curpkgdepname 371 exec env XBPS_DEPENDENCY=1 XBPS_BINPKG_EXISTS=1 XBPS_DEPENDS_CHAIN="$XBPS_DEPENDS_CHAIN, $sourcepkg(host)" \ 372 $XBPS_LIBEXECDIR/build.sh $sourcepkg $pkg $target $cross_prepare || exit $? 373 ) || exit $? 374 host_binpkg_deps+=("$i") 375 done 376 377 # Missing target dependencies, build from srcpkgs. 378 for i in ${missing_deps[@]}; do 379 # packages not found in repos, install from source. 380 ( 381 382 curpkgdepname=$($XBPS_UHELPER_CMD getpkgname "$i" 2>/dev/null) 383 setup_pkg $curpkgdepname $cross 384 exec env XBPS_DEPENDENCY=1 XBPS_BINPKG_EXISTS=1 XBPS_DEPENDS_CHAIN="$XBPS_DEPENDS_CHAIN, $sourcepkg(${cross:-host})" \ 385 $XBPS_LIBEXECDIR/build.sh $sourcepkg $pkg $target $cross $cross_prepare || exit $? 386 ) || exit $? 387 binpkg_deps+=("$i") 388 done 389 390 # Target runtime missing dependencies, build from srcpkgs. 391 for i in ${missing_rdeps[@]}; do 392 # packages not found in repos, install from source. 393 ( 394 curpkgdepname=$($XBPS_UHELPER_CMD getpkgdepname "$i" 2>/dev/null) 395 if [ -z "$curpkgdepname" ]; then 396 curpkgdepname=$($XBPS_UHELPER_CMD getpkgname "$i" 2>/dev/null) 397 if [ -z "$curpkgdepname" ]; then 398 curpkgdepname="$i" 399 fi 400 fi 401 setup_pkg $curpkgdepname $cross 402 exec env XBPS_DEPENDENCY=1 XBPS_BINPKG_EXISTS=1 XBPS_DEPENDS_CHAIN="$XBPS_DEPENDS_CHAIN, $sourcepkg(${cross:-host})" \ 403 $XBPS_LIBEXECDIR/build.sh $sourcepkg $pkg $target $cross $cross_prepare || exit $? 404 ) || exit $? 405 done 406 407 if [[ ${host_binpkg_deps} ]]; then 408 if [ -z "$XBPS_QUIET" ]; then 409 # normal messages in bold 410 [[ $NOCOLORS ]] || printf "\033[1m" 411 echo "=> $pkgver: installing host dependencies: ${host_binpkg_deps[@]} ..." 412 [[ $NOCOLORS ]] || printf "\033[m" 413 fi 414 install_pkg_from_repos "" "${host_binpkg_deps[@]}" 415 fi 416 417 if [[ ${binpkg_deps} ]]; then 418 if [ -z "$XBPS_QUIET" ]; then 419 # normal messages in bold 420 [[ $NOCOLORS ]] || printf "\033[1m" 421 echo "=> $pkgver: installing target dependencies: ${binpkg_deps[@]} ..." 422 [[ $NOCOLORS ]] || printf "\033[m" 423 fi 424 install_pkg_from_repos "$cross" "${binpkg_deps[@]}" 425 fi 426 427 return 0 428}