void-packages

Void Source Packages
git clone git://ezup.dev/void-packages.git
Log | Files | Refs | README | LICENSE

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}