# Make sure that package build dependencies are installed # # Copyright (C) 2012, 2014, 2019 Patrick McDermott # # This file is part of opkbuild. # # opkbuild is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # opkbuild is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with opkbuild. If not, see . set -eu opkg_compare_versions_reference_status= compare_versions() { local pkg_ver="${1}" local dep_rel="${2}" local dep_ver="${3}" shift 3 # Older versions of opkg return 1 on a true comparison and 0 on a false # comparison. "Classic"/Yocto opkg commit d55020a (opkg-lede commit # 93de62b) reversed this. Compare the compare-versions exit status with # a reference exit status from a true statement (1 << 2). ! "${OPKG}" compare-versions "${pkg_ver}" "${dep_rel}" "${dep_ver}" # The "-e" setting is ignored while executing anything, including # commands in a function, within the context of the condition of an "if" # statement. [ ${?} -eq ${opkg_compare_versions_reference_status} ] } check_dep() { local dep="${1}" local dep_pkg= local dep_rel= local dep_ver= local status= local pkg_ver= # Leave stdout for caller to collect. ob_parse_dep -P dep_pkg -r dep_rel -v dep_ver -- "${dep}" status="$("${OPKG}" status "${dep_pkg}")" if ! printf '%s\n' "${status}" | grep '^Status: .* .* installed$' \ >/dev/null 2>&1; then return 1 fi if [ "x${dep_rel}" != 'x' ]; then pkg_ver="$(printf '%s\n' "${status}" | \ sed -n 's/^Version: //p')" if ! compare_versions "${pkg_ver}" "${dep_rel}" "${dep_ver}" then return 1 fi fi return 0 } check_build_deps() { local deps= local missing= local dep= ob_info "$(ob_get_msg 'checking_build_deps')" deps="$(ob_get_source_parameter 'Build-Depends')" deps="$(ob_reduce_deps -a "${OPK_HOST_ARCH}" \ -p "${OPK_HOST_PLAT}" -- "${deps}")" deps="$(ob_substvars "${deps}")" missing='' IFS=',' for dep in ${deps}; do unset IFS if ! dep="$(check_dep "${dep}")"; then missing="${missing}, ${dep}" fi done unset IFS missing="${missing#, }" if [ "x${missing}" != 'x' ]; then ob_error "$(ob_get_msg 'missing_build_deps')" "${missing}" return 1 fi return 0 } main() { if ! ob_set_text_domain 'opkbuild'; then printf '%s: Error: Failed to load locale messages\n' \ "${0##*/}" >&2 return 1 fi ob_init_package '..' || return 1 ob_set_package_substvars '' # See compare_versions() above. # The "-e" setting is ignored for pipelines beginning with "!". ! "${OPKG}" compare-versions 1 '<<' 2 opkg_compare_versions_reference_status=${?} check_build_deps || return ${?} return 0 }