summaryrefslogtreecommitdiffstats
path: root/src/ob-buildopk.sh
blob: 11c4434fa026a1e435a8899f7a15443338035e7a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
# 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 <http://www.gnu.org/licenses/>.

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 -)
	${TOUCH} -t "${date}" 'control.tar' 'data.tar'
	${GZIP} 'control.tar' 'data.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_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
}