Prusa-Firmware/lang/fw-build.sh
3d-gussner 83315d0494 Update config.h translation documentation and move language to group2
Update fw-build.sh
 - Output used space of each translation (easier to troubleshoot)
 - Read config.h max size per translation
 - output variant .map files (easier to troubleshoot and finding missing/unused messages)
2022-09-14 11:33:24 +02:00

152 lines
4.8 KiB
Bash
Executable File

#!/bin/bash
# TODO: write some up-to-date description
# Config:
if [ -z "$CONFIG_OK" ]; then source config.sh; fi
if [ -z "$CONFIG_OK" -o "$CONFIG_OK" -eq 0 ]; then echo "$(tput setaf 1)Config NG!$(tput sgr0)" >&2; exit 1; fi
# Community languages
if [ ! -z "$COMMUNITY_LANGUAGES" ]; then
LANGUAGES+=" $COMMUNITY_LANGUAGES"
fi
color 2 "fw-build.sh started" >&2
echo -n "fw-build languages: " >&2
color 2 "$LANGUAGES" >&2
finish()
{
echo >&2
if [ "$1" = "0" ]; then
color 2 "fw-build.sh finished with success" >&2
else
color 1 "fw-build.sh finished with errors!" >&2
fi
case "$-" in
*i*)
echo "press enter key"; read ;;
esac
exit $1
}
# Clean the temporary directory
TMPDIR=$(dirname "$0")/tmp
rm -rf "$TMPDIR"
mkdir -p "$TMPDIR"
BIN=$TMPDIR/firmware.bin
MAP=$TMPDIR/firmware.map
VARIANT=$(grep '^#define \+PRINTER_TYPE ' "$SRCDIR/Firmware/Configuration_prusa.h"|cut -d '_' -f3)
# Extract and patch the symbol table/language map
color 4 "generating firmware symbol map" >&2
"$OBJCOPY" -I ihex -O binary "$INOHEX" "$BIN"
./lang-map.py "$INOELF" "$BIN" > "$MAP"
cp -f $MAP firmware_$VARIANT.map
# Get the maximum size of a single language table
maxsize=$(grep '^#define \+LANG_SIZE_RESERVED \+' "$SRCDIR/Firmware/config.h" | sed -e 's/\s\+/ /g' | cut -d ' ' -f3)
# Build language catalogs
for lang in $LANGUAGES; do
pofile="po/Firmware_$lang.po"
binfile="$TMPDIR/lang_$lang.bin"
color 4 "compiling language \"$lang\" from $pofile" >&2
./lang-check.py --map "$MAP" "$pofile"
if [ "$?" != 0 ]; then
color 1 "$pofile: NG! - translation contains warnings or errors" >&2
fi
./lang-build.py "$MAP" "$pofile" "$binfile"
# ensure each catalog fits the reserved size
if [[ $(stat -c '%s' "$binfile") -gt $maxsize ]]; then
color 1 "$pofile: NG! - language data exceeds $maxsize bytes" >&2
finish 1
fi
done
# Detect the printer type and choose the language type
if grep -q '^#define \+PRINTER_TYPE \+PRINTER_\(MK25\|MK25S\)\b' "$SRCDIR/Firmware/Configuration_prusa.h"; then
has_xflash=0
else
has_xflash=1
fi
if [ "$has_xflash" = 1 ]; then
# Build the final hex file with XFLASH support (catalogs appended to a single hex file)
OUTHEX="${INTLHEX}.hex"
color 4 "assembling final firmware image" >&2
"$OBJCOPY" -I binary -O ihex "$BIN" "$OUTHEX"
truncate -s0 "$TMPDIR/lang.bin"
individual_lang_reserved_hex=$(grep --max-count=1 "^#define LANG_SIZE_RESERVED *" $SRCDIR/Firmware/config.h|sed -e's/ */ /g'|cut -d ' ' -f3|cut -d 'x' -f2)
individual_lang_reserved=$((16#$individual_lang_reserved_hex))
for lang in $LANGUAGES; do
cat "$TMPDIR/lang_$lang.bin" >> "$TMPDIR/lang.bin"
lang_size=$(stat -c '%s' "$TMPDIR/lang_$lang.bin")
lang_size_pad=$(( ($lang_size+256-1) / 256 * 256 ))
lang_free=$(($individual_lang_reserved - $lang_size))
echo >&2
echo -n " size usage" >&2
[ $lang_size -gt $individual_lang_reserved ] && c=1 || c=2
color $c " $lang $lang_size_pad ($lang_size)" >&2
echo -n " reserved size " >&2
color 2 "$individual_lang_reserved" >&2
echo -n " free bytes " >&2
color 2 "$lang_free" >&2
if [ $lang_size_pad -gt $individual_lang_reserved ]; then
color 1 "NG! - language $lang data too large" >&2
finish 1
fi
done
"$OBJCOPY" -I binary -O ihex "$TMPDIR/lang.bin" "$TMPDIR/lang.hex"
cat "$TMPDIR/lang.hex" >> "$OUTHEX"
# Check that the language data doesn't exceed the reserved XFLASH space
lang_size=$(stat -c '%s' "$TMPDIR/lang.bin")
lang_size_pad=$(( ($lang_size+4096-1) / 4096 * 4096 ))
# TODO: hard-coded! get value by preprocessing LANG_SIZE from xflash_layout.h!
lang_reserved=249856
echo >&2
echo -n " total size usage: " >&2
[ $lang_size_pad -gt $lang_reserved ] && c=1 || c=2
color $c "$lang_size_pad ($lang_size)" >&2
echo -n " reserved size: " >&2
color 2 "$lang_reserved" >&2
if [ $lang_size_pad -gt $lang_reserved ]; then
color 1 "NG! - language data too large" >&2
finish 1
fi
echo -n " multilanguage fw: " >&2
color 2 "$OUTHEX" >&2
else
# Build one hex file for each secondary language
color 4 "assembling final firmware images" >&2
echo >&2
echo -n " maximum size: " >&2
color 2 "$(( $maxsize ))" >&2
for lang in $LANGUAGES; do
OUTHEX="${INTLHEX}-en_${lang}.hex"
catfile="$TMPDIR/lang_$lang.bin"
bintmp="$TMPDIR/fw-en_$lang.bin"
# patch the secondary language table
cp "$BIN" "$bintmp"
./lang-patchsec.py "$INOELF" "$catfile" "$bintmp"
"$OBJCOPY" -I binary -O ihex "$bintmp" "$OUTHEX"
# print some stats
catsize=$(stat -c '%s' "$catfile")
echo -n " $lang: " >&2
color 2 "$(printf "%5d %s" "$catsize" "$OUTHEX")" >&2
done
fi
finish 0