diff options
Diffstat (limited to 'src/ob-buildopk.sh')
-rw-r--r-- | src/ob-buildopk.sh | 64 |
1 files changed, 50 insertions, 14 deletions
diff --git a/src/ob-buildopk.sh b/src/ob-buildopk.sh index dc630d1..dc88758 100644 --- a/src/ob-buildopk.sh +++ b/src/ob-buildopk.sh @@ -1,6 +1,6 @@ # Pack binary package files into an opk file # -# Copyright (C) 2012 Patrick McDermott +# Copyright (C) 2012, 2019 Patrick McDermott # # This file is part of opkbuild. # @@ -27,41 +27,77 @@ build_opk() 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}_${version}_${arch}_${plat}.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. - if ${HAVE_TOUCH_NODEREF}; then - find_not_link='' touch_noderef='-h' + 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. - find "${binary}.control" "${binary}.data" | xargs chown -h 0:0 + 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 | \ + (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 | \ + (cd -- "${binary}.data" && find '.' | LC_ALL=C sort ${sort_r} | \ ${TAR} -cf '../data.tar' --no-recursion -T -) - ${TOUCH} -t "${date}" 'control.tar' 'data.tar' ${GZIP} 'control.tar' 'data.tar' + ${TOUCH} -t "${date}" 'control.tar.gz' 'data.tar.gz' - ${TAR} -cf "../../${binary}_${version}_${arch}_${plat}.tar" \ + ${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}_${version}_${arch}_${plat}.tar" - ${GZIP} "../../${binary}_${version}_${arch}_${plat}.tar" - mv "../../${binary}_${version}_${arch}_${plat}.tar.gz" \ - "../../${binary}_${version}_${arch}_${plat}.opk" + ${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 } @@ -85,7 +121,7 @@ main() 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}" \ + build_opk "src:${OPK_SOURCE}" "${OPK_SOURCE_VERSION}" \ 'src' 'all' "${date}" else for pkg in ${OPK_PACKAGES_REDUCED}; do |