summaryrefslogtreecommitdiffstats
path: root/src/ob-buildopk.sh
diff options
context:
space:
mode:
Diffstat (limited to 'src/ob-buildopk.sh')
-rw-r--r--src/ob-buildopk.sh64
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