-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathbuildscript.sh
More file actions
executable file
·177 lines (177 loc) · 9.02 KB
/
buildscript.sh
File metadata and controls
executable file
·177 lines (177 loc) · 9.02 KB
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
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
#!/bin/bash
# ── Configuration for defaults ─ Source File ─────────────────────────────────
source defaults
# ── User Config Inputs ───────────────────────────────────────────────────────
declare -A options=(
[a]=ALT # Alternate List (yes/No)
[c]=CLEAN # Clean Directories (Yes/no)
[d]=DEV # Developer Build [Skip some steps] (yes/No)
[e]=EPOCH # SOURCE_DATE_EPOCH [^ for reproducibility] (source_date_epoch/"today"/"^")
[m]=MOUNT # Mount External [U2F Backed Luks] ("mmcblk1p1")
[t]=TAG # Tag Release refs/tags/("tagname")
[w]=CROSS # Cross Compile (yes/No)
[z]=TARGET # Target Selection ("target1,target2,all")
)
while getopts ":a:c:d:e:m:t:w:z:" opt; do
case $opt in
\?)
echo "Invalid option: -$OPTARG" >&2
exit 1
;;
:)
echo "Option -$OPTARG requires an argument." >&2
exit 1
;;
*)
var=${options[$opt]}
[[ -n $var ]] && printf -v "$var" "%s" "$OPTARG"
;;
esac
done
# ── Defaults ─────────────────────────────────────────────────────────────────
if [ "$MOUNT" != "" ]; then
echo "MOUNT: /dev/$MOUNT"
fi
if [ "$CROSS" = "" ]; then
CROSS="no"
fi
if [ "$CLEAN" = "" ]; then
CLEAN="yes"
fi
if [ "$DEV" = "" ]; then
DEV="no"
fi
if [ "$EPOCH" = "" ]; then
EPOCH="today"
fi
## ─ Source Date Epoch ────────────────────────────────────────────────────────
if [ "$EPOCH" = "today" ]; then
timestamp=$(date -d $(date +%D) +%s);
if [ "${timestamp}" != "" ]; then
echo "SOURCE_DATE_EPOCH from today's date: $(date +%D) = @$timestamp";
EPOCH=$((timestamp));
else
echo "ERROR: Can't get timestamp. Defaulting to 1.";
EPOCH=1;
fi
elif [[ "$EPOCH" != 0 && "$EPOCH" != "^" ]]; then
echo "SOURCE_DATE_EPOCH: $EPOCH"
EPOCH=$(($EPOCH))
else
cp Results/release.sha512sum /tmp/release.last.sha512sum
cp Results/release.sha3sum /tmp/release.last.sha3sum
timestamp=$(</tmp/release.last.sha512sum | grep Epoch | cut -d ' ' -f5)
if [ "${timestamp}" != "" ]; then
echo "SOURCE_DATE_EPOCH from release.sha512sum: $(</tmp/release.last.sha512sum | grep Epoch | cut -d ' ' -f5)"
EPOCH=$((timestamp))
CHECK="yes"
else
echo "ERROR: Can't get latest commit timestamp. Defaulting to 1."
EPOCH=1
fi
fi
if [ "$CHECK" = "" ]; then
CHECK="no"
fi
# ── Clean Environment Variables ──────────────────────────────────────────────
env_elimnator() { # 1 = $PWD/file.sh, # 2 = logname
env -i - env TERM=screen - screen -h 10000 -L -Logfile $2.log env -u TERM -u TERMCAP -u STY - PATH=/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin bash --noprofile --norc -c "$1"
}
# ── Update + Clean ───────────────────────────────────────────────────────────
if [[ $(which pkexec) = "" ]]; then
sudo apt update && sudo apt upgrade -y && sudo apt install -y bc dosfstools parted pkexec rootlesskit screen slirp4netns snapd systemd-cryptsetup uidmap
sudo -K
elif [[ $(which bc) != "" && $(which dosfstools) != "" && $(which parted) != "" && $(which rootlesskit) != "" && $(which screen) != "" && $(which slirp4netns) != "" && $(which snapd) != "" && $(which systemd-cryptsetup) != "" && $(which uidmap) != "" && "$CLEAN" = "no" ]]; then
wait
else
./install.sh apt.update
fi
if [[ "$CLEAN" = "yes" && "$DEV" != "yes" ]]; then
env_elimnator "$PWD/clean.sh git.cleanup.cache" /tmp/clean
elif [ "$CLEAN" = "yes" ]; then
env_elimnator "$PWD/clean.sh git.cleanup" /tmp/clean
fi
> $HOME/rootless.sh
cat >> $HOME/rootless.sh << __EOF
#!/bin/bash
rootlesskit --copy-up=/etc --copy-up=/run --net=slirp4netns --disable-host-loopback --state-dir $HOME/tmp bash -i -c '
env > $HOME/tmp/environment-docker
grep ROOTLESS $HOME/tmp/environment-docker >> $HOME/tmp/environment-rootless
echo "HOME=$HOME" >> $HOME/tmp/environment-rootless
echo "XDG_RUNTIME_DIR=/run/user/1000" >> $HOME/tmp/environment-rootless
echo "PATH=$PATH:/snap/docker/current/bin" >> $HOME/tmp/environment-rootless
echo "\$(echo \$(<$HOME/tmp/environment-rootless)) /snap/docker/current/bin/dockerd --rootless" | bash 2> $HOME/tmp/log'
__EOF
chmod +x $HOME/rootless.sh
pushd Results
mv /tmp/clean.log logs/clean.log
if [ "$ALT" = "" ]; then
ALT="no"
fi
if [ "$ALT" = "yes" ]; then
export BUILD_LIST="PT2-rk3566:pinetab2-rk3566_defconfig"
export LIST="PT2-rk3566"
export ARCHS="rk3568"
sed -i s/"$(grep "BUILD_LIST" defaults | awk -F'"' '{print $2}')"/"$BUILD_LIST"/ defaults.set
sed -i s/"$(grep "LIST" defaults | awk -F'"' '{print $2}')"/"$LIST"/ defaults.set
sed -i s/"$(grep "ARCHS" defaults | awk -F'"' '{print $2}')"/"$ARCHS"/ defaults.set
else
export ARCHS="$(echo $ARCHS | tr ' ' '\n' | sort -u | tr '\n' ' ')"
fi
# ── Target Validation ────────────────────────────────────────────────────────
TRGLIST="(crosstool-ng|openssl|edk2|arm-trusted|optee|u-boot|ubuntu|base|base_extra)"
if [[ -z "$TARGET" || "$TARGET" == *all* ]]; then
export TARGETS="$(echo $TARGETS | tr ' ' '\n' | sort -u | tr '\n' ' ')"
TARGET="$TARGETS"
elif [[ "$TARGET" =~ $TRGLIST ]]; then
for TRG in $TARGET; do
if [[ "$TRG" =~ $TRGLIST ]]; then
export TARGETS="$TARGET"
export TARGETS="$(echo $TARGETS | tr ' ' '\n' | sort -u | tr '\n' ' ')"
sed -i s/"$(grep "TARGETS" defaults | awk -F'"' '{print $2}')"/"$TARGETS"/ defaults.set
else
echo "INVALID TARGET: $TRG"
exit 1
fi
done
else
echo "INVALID TARGET LIST: $TARGET"
exit 1
fi
# ── Check Variables ──────────────────────────────────────────────────────────
ENV=$(sha512sum defaults.set)
if [[ $ENV == *e795c85d93a484080d0605128f9274259b0ec169a06c9948de196f2dc20d420cdcce885882bcd7b7b4c2e02661a18b9103e65d0e5f1eaa720d521851c745e126* ]]; then
ENVV="MATCHED DEFAULTS CONFIG SHA512SUM"
else
ENVV="DEFAULTS MISSMATCH"
fi
# ── Build Info ───────────────────────────────────────────────────────────────
> release.sha512sum && > release.sha3sum && > build.info
sha512sum defaults.set >> release.sha512sum && openssl dgst -SHA3-256 defaults.set >> release.sha3sum
echo "Clean Build: $CLEAN" && echo "Clean Build: $CLEAN" >> build.info
echo "Cross-Compile: $CROSS" && echo "Cross-Compile: $CROSS" >> build.info
echo "Developer Build: $DEV" && echo "Developer Build: $DEV" >> build.info
echo "Using Alternate List: $ALT" && echo "Using Alternate List: $ALT" >> build.info
echo "Check Reporoducibility: $CHECK" && echo "Check Reporoducibility: $CHECK" >> build.info
echo "Source Date Epoch: $EPOCH" && echo "Source Date Epoch: $EPOCH" >> build.info
echo "Mounted External: /dev/$MOUNT" && echo "Mounted External: /dev/$MOUNT" >> build.info
echo "Tag Release: $TAG" && echo "Tag Release: $TAG" >> build.info
echo "Targeting: $TARGET" && echo "Targeting: $TARGET" >> build.info
echo "Env Config Sum: $ENVV" && echo "Env Config Sums: $ENVV" >> build.info
echo "export EPOCH=$EPOCH" > choices.set && echo "export CLEAN=$CLEAN" >> choices.set && echo "export DEV=$DEV" >> choices.set
echo "export CR_C=$CROSS" >> choices.set && echo "export MOUNT=$MOUNT" >> choices.set && echo "export CHECK=$CHECK" >> choices.set
echo "export HOME=$HOME" >> choices.set
sha512sum choices.set >> release.sha512sum && openssl dgst -SHA3-256 choices.set >> release.sha3sum
# ── Run re-run.sh to start build ─────────────────────────────────────────────
env_elimnator $PWD/../re-run.sh logs/builder
cat logs/builder.log | grep -n "Checksum Matched! " && mv builder.log ../../builder.log && [[ -f status.info ]] && status=$(<status.info) || echo "" && echo "Build Failed"
echo "" && cat release.sha512sum && echo "" && cat release.sha3sum && echo "" && sed -i 's/Builds/..\/Builds/g' release.sha512sum
popd
# ── Clean + Git ──────────────────────────────────────────────────────────────
if [ "$CLEAN" = "yes" ]; then
env_elimnator "$PWD/clean.sh tmp.cleanup" Results/logs/clean && ls -la Builds/*
read -p "$status: --> Continue"
if [ "$DEV" != "yes" ]; then
env_elimnator "$PWD/git.sh '$status' '$TAG'" Results/logs/git
fi
fi