-
Notifications
You must be signed in to change notification settings - Fork 5
/
build.subr
83 lines (68 loc) · 2.82 KB
/
build.subr
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
#!/usr/bin/env bash
#
# Shell script for building Phoenix-RTOS ports
#
# Common functions
#
# Copyright 2024 Phoenix Systems
# Author: Daniel Sawka
#
# Variables needed for the functions below
: "${PREFIX_PORT:?variable unset}"
: "${PREFIX_PORT_BUILD:?variable unset}"
: "${PORTS_MIRROR_BASEURL:?variable unset}"
# b_port_download(baseurl, filename, [orig_filename])
# Fetch a file from ${baseurl}${filename} (or ${baseurl}${orig_filename} if provided) and save as ${filename}
# in current port's directory. Provide ${orig_filename} if filename on the external server doesn't follow the
# package-X.Y.Z.ext convention (e.g. it's a hash). If download fails, try again from ${PORTS_MIRROR_BASEURL}${filename}.
#
# This function also verifies file integrity if checksums/${filename}.sha256 file exists (opt-in feature).
b_port_download() {
local baseurl="${1:?baseurl missing}"
local filename="${2:?filename missing}"
local orig_filename="${3:-$filename}"
local checksum_file="${PREFIX_PORT}/checksums/${filename}.sha256"
if [ ! -f "${PREFIX_PORT}/${filename}" ]; then
if ! wget "${baseurl}${orig_filename}" -O "${PREFIX_PORT}/${filename}.part" --no-check-certificate; then
wget "${PORTS_MIRROR_BASEURL}${filename}" -O "${PREFIX_PORT}/${filename}.part" --no-check-certificate
fi
if [ -f "${checksum_file}" ]; then
read -r line < "${checksum_file}" || true
local expected_checksum="${line%% *}"
if [ -z "${expected_checksum}" ]; then
b_die "No checksum found in ${checksum_file}"
fi
local actual_checksum="$(shasum -b -a 256 "${PREFIX_PORT}/${filename}.part")"
actual_checksum="${actual_checksum%% *}"
if [ "${expected_checksum}" = "${actual_checksum}" ]; then
echo "Checksum OK for \"${filename}\""
else
b_die "Checksum INVALID for \"${filename}\": expected \"${expected_checksum}\", got \"${actual_checksum}\""
fi
fi
mv -f "${PREFIX_PORT}/${filename}.part" "${PREFIX_PORT}/${filename}"
fi
}
# b_port_apply_patches(srcdir, [patch_subdir])
# Apply patches to files in ${srcdir}. Non-recursive - use multiple calls with
# ${patch_subdir} if you group patches into separate directories.
b_port_apply_patches() {
local srcdir="${1:?srcdir missing}"
local patch_subdir="${2:-.}"
local patch_dir="${PREFIX_PORT}/patches/${patch_subdir}"
local marker_dir="${PREFIX_PORT_BUILD}/markers/${patch_subdir}"
if [ -d "${patch_dir}" ]; then
mkdir -p "${marker_dir}"
fi
# Restores the initial value of nullglob option upon function return
trap "$(shopt -p nullglob)" RETURN
shopt -s nullglob
for patchfile in "${patch_dir}"/*.patch; do
if [ ! -f "${marker_dir}/$(basename "${patchfile}").applied" ]; then
echo "applying patch: ${patchfile}"
patch -d "${srcdir}" -p1 < "${patchfile}"
touch "${marker_dir}/$(basename "${patchfile}").applied"
fi
done
}
export -f b_port_download b_port_apply_patches