You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
143 lines
3.7 KiB
143 lines
3.7 KiB
#!/bin/bash
|
|
|
|
# script/build: Build the TREZOR firmware in a clean working tree.
|
|
#
|
|
|
|
# this needs to be there, otherwise python click installer vomits an error
|
|
export LC_ALL=C.UTF-8
|
|
export LANG=C.UTF-8
|
|
|
|
set -eu
|
|
|
|
cd "$(dirname "$0")/../.."
|
|
|
|
readonly MCU_ROOT=legacy
|
|
|
|
readonly ARTIFACT_EXTENSIONS=(bin elf)
|
|
readonly BUILD_DIR="$(readlink -f build)"
|
|
|
|
readonly BOOTLOADER_DIR="$BUILD_DIR/legacy/bootloader"
|
|
readonly BOOTLOADER_FILENAME="$MCU_ROOT/bootloader/bootloader.bin"
|
|
readonly BOOTLOADER_PATH="$BOOTLOADER_DIR/$BOOTLOADER_FILENAME"
|
|
|
|
readonly FIRMWARE_DIR="$BUILD_DIR/legacy/firmware"
|
|
readonly FIRMWARE_FILENAME="$MCU_ROOT/firmware/trezor.bin"
|
|
readonly FIRMWARE_PATH="$FIRMWARE_DIR/$FIRMWARE_FILENAME"
|
|
|
|
readonly EMULATOR_DIR="$FIRMWARE_DIR"
|
|
readonly EMULATOR_FILENAME="$MCU_ROOT/firmware/trezor-emulator.elf"
|
|
readonly EMULATOR_PATH="$EMULATOR_DIR/$MCU_ROOT/firmware/trezor.elf"
|
|
|
|
worktree_setup() {
|
|
local path="$1"
|
|
local commit="$2"
|
|
|
|
rm -rf "$path"
|
|
git clone -n --reference=. . "$path" --recurse-submodules
|
|
|
|
# Use `git rev-parse` so that we can use any reference from the working repository.
|
|
git -C "$path" checkout "$(git rev-parse "$commit")"
|
|
|
|
( cd "$path/$MCU_ROOT" && script/setup )
|
|
}
|
|
|
|
worktree_build() {
|
|
local path="$1"
|
|
|
|
if [ ! -e "$path/$MCU_ROOT/Pipfile" ]; then
|
|
echo "Can't handle pre-monorepo tags properly. You will have to check out manually"
|
|
exit 1
|
|
fi
|
|
|
|
pushd $path/$MCU_ROOT
|
|
if ! pipenv install; then
|
|
# older tags can fail because they don't have protobuf in Pipfile
|
|
pipenv run pip install "protobuf==3.4.0"
|
|
pipenv install
|
|
fi
|
|
pipenv run script/cibuild
|
|
popd
|
|
}
|
|
|
|
worktree_copy() {
|
|
local path="$1"
|
|
local filename="$2"
|
|
local pattern="$3"
|
|
|
|
local describe="$(git -C "$path" describe --tags --match "legacy/$pattern")"
|
|
describe="${describe##legacy/}"
|
|
|
|
local src="$path/$filename"
|
|
|
|
local basename="$(basename "$filename")"
|
|
local dest="$BUILD_DIR/${basename%.*}-$describe.${basename##*.}"
|
|
|
|
if [ "$EMULATOR" = 1 ]; then
|
|
install -Dm0644 "${src%.*}.elf" "${dest%.*}.elf"
|
|
else
|
|
for extension in "${ARTIFACT_EXTENSIONS[@]}"; do
|
|
install -Dm0644 \
|
|
"${src%.*}.$extension" \
|
|
"${dest%.*}.$extension"
|
|
done
|
|
fi
|
|
|
|
printf "%s" "$dest"
|
|
}
|
|
|
|
main() {
|
|
local bootloader_commit="$1"
|
|
local firmware_commit="$2"
|
|
|
|
if [ "$bootloader_commit" != "HEAD" ]; then
|
|
bootloader_commit="legacy/$bootloader_commit"
|
|
fi
|
|
if [ "$firmware_commit" != "HEAD" ]; then
|
|
firmware_commit="legacy/$firmware_commit"
|
|
fi
|
|
|
|
worktree_setup "$FIRMWARE_DIR" "$firmware_commit"
|
|
|
|
if [ "$EMULATOR" != 1 ]; then
|
|
worktree_setup "$BOOTLOADER_DIR" "$bootloader_commit"
|
|
worktree_build "$BOOTLOADER_DIR"
|
|
|
|
cp "$BOOTLOADER_PATH" "$FIRMWARE_DIR/$BOOTLOADER_FILENAME"
|
|
fi
|
|
|
|
worktree_build "$FIRMWARE_DIR"
|
|
|
|
if [ "$EMULATOR" = 1 ]; then
|
|
cp "$EMULATOR_PATH" "$EMULATOR_DIR/$EMULATOR_FILENAME"
|
|
local firmware_path="$(worktree_copy \
|
|
"$EMULATOR_DIR" \
|
|
"$EMULATOR_FILENAME" \
|
|
"v*")"
|
|
chmod +x "$firmware_path"
|
|
|
|
else
|
|
|
|
local firmware_path="$(worktree_copy \
|
|
"$FIRMWARE_DIR" \
|
|
"$FIRMWARE_FILENAME" \
|
|
"v*")"
|
|
|
|
local bootloader_path="$(worktree_copy \
|
|
"$BOOTLOADER_DIR" \
|
|
"$BOOTLOADER_FILENAME" \
|
|
"bl*")"
|
|
|
|
printf "\n\n"; $PYTHON $MCU_ROOT/script/fingerprint \
|
|
"$bootloader_path" \
|
|
--max-size 32768 \
|
|
--double
|
|
fi
|
|
|
|
printf "\n\n"; $PYTHON $MCU_ROOT/script/fingerprint \
|
|
"$firmware_path" \
|
|
--offset 256 \
|
|
--max-size 983296 # 256 + 64*1024 + 3*128*1024 + 4*128*1024
|
|
}
|
|
|
|
main "$@"
|