# Pack binary package files into an opk file # # Copyright (C) 2012, 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 build_opk() { local binary="${1}" local version="${2}" local arch="${3}" local plat="${4}" local date="${5}" shift 5 local binary_qual= local find_not_link= local touch_noderef= local sort_r= if [ "x${arch}" = 'xsrc' ]; then binary_qual="${binary}" else binary_qual="$(ob_qualify_package_name "${binary}" \ "${OPK_HOST_ARCH}")" fi ob_info "$(ob_get_msg 'build_opk')" \ "${binary_qual}_${version}_${arch}_${plat}.opk" mkdir -p '.opkbuild' # Don't dereference symbolic links. They might be absolute paths, and # we don't want to attempt to affect the system on which we're building. # Also, we want to set the mtimes of the links themselves, if possible. rm -f '.opkbuild/touch-noderef.none' '.opkbuild/touch-noderef.link' ln -s '.opkbuild/touch-noderef.none' '.opkbuild/touch-noderef.link' if ${TOUCH} -h '.opkbuild/touch-noderef.link' 1>/dev/null 2>/dev/null then if test -f '.opkbuild/touch-noderef.none'; then find_not_link='! -type l' touch_noderef='' else find_not_link='' touch_noderef='-h' fi else find_not_link='! -type l' touch_noderef='' fi rm -f '.opkbuild/touch-noderef.none' '.opkbuild/touch-noderef.link' # Detect whether BusyBox tar inserts files listed with -T in reverse # order. touch '.opkbuild/a' '.opkbuild/b' if [ x"$(printf '.opkbuild/a\n.opkbuild/b\n' | ${TAR} -c -T - | \ ${TAR} -t | head -n 1)" = x'.opkbuild/b' ]; then sort_r='-r' else sort_r='' fi rm -f '.opkbuild/a' '.opkbuild/b' find "${binary}.control" "${binary}.data" ${find_not_link} | xargs \ ${TOUCH} ${touch_noderef} -t "${date}" # This utility runs with (fake) privileges, so we can chown what we're # about to tar. if [ "x${arch}" = 'xsrc' ]; then find "${binary}.control" "${binary}.data" | xargs chown -h 0:0 else find "${binary}.control" | xargs chown -h 0:0 fi (cd -- "${binary}.control" && find '.' | LC_ALL=C sort ${sort_r} | \ ${TAR} -cf '../control.tar' --no-recursion -T -) (cd -- "${binary}.data" && find '.' | LC_ALL=C sort ${sort_r} | \ ${TAR} -cf '../data.tar' --no-recursion -T -) ${GZIP} 'control.tar' 'data.tar' ${TOUCH} -t "${date}" 'control.tar.gz' 'data.tar.gz' ${TAR} -cf "../../${binary_qual}_${version}_${arch}_${plat}.tar" \ 'debian-binary' 'control.tar.gz' 'data.tar.gz' rm -Rf 'control.tar.gz' 'data.tar.gz' ${TOUCH} -t "${date}" \ "../../${binary_qual}_${version}_${arch}_${plat}.tar" ${GZIP} "../../${binary_qual}_${version}_${arch}_${plat}.tar" mv "../../${binary_qual}_${version}_${arch}_${plat}.tar.gz" \ "../../${binary_qual}_${version}_${arch}_${plat}.opk" return 0 } main() { local date= local pkg= local arch= local plat= 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 date="$(ob_touch_t_gmtime "${SOURCE_DATE_EPOCH}")" printf '2.0\n' >'debian-binary' ${TOUCH} -t "${date}" 'debian-binary' if [ x"${OB_DO_SOURCE:+set}" = x'set' ]; then build_opk "src:${OPK_SOURCE}" "${OPK_SOURCE_VERSION}" \ 'src' 'all' "${date}" else for pkg in ${OPK_PACKAGES_REDUCED}; do arch="$(ob_get_binary_parameter "${pkg}" \ 'Architecture')" [ x"${arch}" != x'all' ] && arch="${OPK_HOST_ARCH}" plat="$(ob_get_binary_parameter "${pkg}" 'Platform')" [ x"${plat}" != x'all' ] && plat="${OPK_HOST_PLAT}" build_opk "${pkg}" "${OPK_BINARY_VERSION}" \ "${arch}" "${plat}" "${date}" done fi rm 'debian-binary' return 0 }