summaryrefslogtreecommitdiffstats
path: root/scripts/apk-build
blob: dc712a96a1391a6b692ae0addcb51beadf665cdf (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
#!/bin/bash

pkginfo_val() {
	local key="$1"
	local file="$2"
	awk -F ' = ' "\$1 == \"$key\" {print \$2}" "$file"
}

datadir="$1"
outputdir="$2"
BUILD_KEY_RSA="$3"
tmp_dir=$(mktemp -d -t apk-XXXXXXXXXX)
file="$tmp_dir/.PKGINFO"

sed -n \
	-e 's/Package:/pkgname =/p' \
	-e 's/Version:/pkgver =/p' \
	-e 's/Installed-Size:/size =/p' \
	-e 's/Description:/pkgdesc =/p' \
	-e 's/License:/license =/p' \
	-e 's/Source:/origin =/p' \
	-e 's/Architecture:/arch =/p' \
	"$datadir/CONTROL/control" \
	>"$file"

grep "Depends" "$datadir/CONTROL/control" | sed \
	-e 's/Depends://' \
	-e "s/ (=/></g" \
	-e "s/)//g" \
	-e 's/ /depend = /g' \
	-e 's/,/\n/g' \
	>>"$file"

dir="${file%/.PKGINFO}"
name=$(pkginfo_val pkgname "$file")
ver=$(pkginfo_val pkgver "$file")
size=$(pkginfo_val size "$file")
arch=$(pkginfo_val arch "$file")
apk="${name}_${ver}_${arch}.apk"
metafiles=".PKGINFO"
keyname=${BUILD_KEY_RSA##*/}.pub
sig_rsa=".SIGN.RSA.$keyname"

echo "$metafiles" >"$dir/.metafiles"
rm -f "$dir/data.tar.gz" "$dir/control.tar.gz"

(
	cd "$datadir" || exit 1
	# data.tar.gz

	echo "Package size: ${size}"
	echo "Compressing data..."
	set -- *
	if [ "$1" = '*' ]; then
		touch .dummy
		set -- .dummy
	fi

	# normalize timestamps
	find "$@" -exec touch -h -d "@$SOURCE_DATE_EPOCH" {} +
	find "$@" -print0 | LC_ALL=C sort -z | tar --xattrs \
		--exclude=CONTROL \
		--format=posix \
		--pax-option=exthdr.name=%d/PaxHeaders/%f,atime:=0,ctime:=0 \
		--mtime="@${SOURCE_DATE_EPOCH}" \
		--no-recursion --null -T - \
		-f - -c | abuild-tar --hash | gzip -n -9 >"$tmp_dir/data.tar.gz"

	# data.tar.gz
	echo "Create checksum..."
	# append the hash for data.tar.gz
	sha256=$(sha256sum "$dir"/data.tar.gz | cut -f1 -d' ')
	echo "datahash = $sha256" >>"$dir"/.PKGINFO

	cd "$tmp_dir" || exit 1
	tar \
		--format=posix \
		--pax-option=exthdr.name=%d/PaxHeaders/%f,atime:=0,ctime:=0 \
		--mtime="@${SOURCE_DATE_EPOCH}" \
		-f - -c $(cat "$dir/.metafiles") | abuild-tar --cut |
		gzip -n -9 >control.tar.gz

	# signing works but requires manually generated private key
	openssl dgst -sha1 -sign "$BUILD_KEY_RSA" -out "$sig_rsa" "control.tar.gz"
	touch -h -d "@$SOURCE_DATE_EPOCH" "$sig_rsa"

	tmptargz=$(mktemp)
	tar -f - -c .SIGN* | abuild-tar --cut | gzip -n -9 >"$tmptargz"
	tmpsigned=$(mktemp)
	cat "$tmptargz" "control.tar.gz" >"$tmpsigned"
	mv "$tmpsigned" "control.tar.gz"

	echo "Create $apk"
	cat control.tar.gz data.tar.gz >"$outputdir/$apk"
)