build.sh 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. #!/usr/bin/env bash
  2. # usage
  3. # sh build.sh build-firmware RAK_4631_Repeater
  4. # sh build.sh build-firmwares
  5. # sh build.sh build-companion-firmwares
  6. # sh build.sh build-repeater-firmwares
  7. # sh build.sh build-room-server-firmwares
  8. # get a list of pio env names that start with "env:"
  9. get_pio_envs() {
  10. echo $(pio project config | grep 'env:' | sed 's/env://')
  11. }
  12. # $1 should be the string to find (case insensitive)
  13. get_pio_envs_containing_string() {
  14. shopt -s nocasematch
  15. envs=($(get_pio_envs))
  16. for env in "${envs[@]}"; do
  17. if [[ "$env" == *${1}* ]]; then
  18. echo $env
  19. fi
  20. done
  21. }
  22. # build firmware for the provided pio env in $1
  23. build_firmware() {
  24. # get git commit sha
  25. COMMIT_HASH=$(git rev-parse --short HEAD)
  26. # set firmware build date
  27. FIRMWARE_BUILD_DATE=$(date '+%d-%b-%Y')
  28. # get FIRMWARE_VERSION, which should be provided by the environment
  29. if [ -z "$FIRMWARE_VERSION" ]; then
  30. echo "FIRMWARE_VERSION must be set in environment"
  31. exit 1
  32. fi
  33. # set firmware version string
  34. # e.g: v1.0.0-abcdef
  35. FIRMWARE_VERSION_STRING="${FIRMWARE_VERSION}-${COMMIT_HASH}"
  36. # craft filename
  37. # e.g: RAK_4631_Repeater-v1.0.0-SHA
  38. FIRMWARE_FILENAME="$1-${FIRMWARE_VERSION_STRING}"
  39. # export build flags for pio so we can inject firmware version info
  40. export PLATFORMIO_BUILD_FLAGS="-DFIRMWARE_BUILD_DATE='\"${FIRMWARE_BUILD_DATE}\"' -DFIRMWARE_VERSION='\"${FIRMWARE_VERSION_STRING}\"'"
  41. # build firmware target
  42. pio run -e $1
  43. # build merge-bin for esp32 fresh install
  44. if [ -f .pio/build/$1/firmware.bin ]; then
  45. pio run -t mergebin -e $1
  46. fi
  47. # build .uf2 for RAK_4631 and t1000e
  48. if [[ $1 == *"RAK_4631"* || $1 == *"t1000e"* ]]; then
  49. python bin/uf2conv/uf2conv.py .pio/build/$1/firmware.hex -c -o .pio/build/$1/firmware.uf2 -f 0xADA52840
  50. fi
  51. # copy .bin, .uf2, and .zip to out folder
  52. # e.g: Heltec_v3_room_server-v1.0.0-SHA.bin
  53. # e.g: RAK_4631_Repeater-v1.0.0-SHA.uf2
  54. # copy .bin for esp32 boards
  55. cp .pio/build/$1/firmware.bin out/${FIRMWARE_FILENAME}.bin 2>/dev/null || true
  56. cp .pio/build/$1/firmware-merged.bin out/${FIRMWARE_FILENAME}-merged.bin 2>/dev/null || true
  57. # copy .zip and .uf2 of nrf52 boards
  58. cp .pio/build/$1/firmware.uf2 out/${FIRMWARE_FILENAME}.uf2 2>/dev/null || true
  59. cp .pio/build/$1/firmware.zip out/${FIRMWARE_FILENAME}.zip 2>/dev/null || true
  60. }
  61. # firmwares containing $1 will be built
  62. build_all_firmwares_matching() {
  63. envs=($(get_pio_envs_containing_string "$1"))
  64. for env in "${envs[@]}"; do
  65. build_firmware $env
  66. done
  67. }
  68. build_repeater_firmwares() {
  69. # # build specific repeater firmwares
  70. # build_firmware "Heltec_v2_repeater"
  71. # build_firmware "Heltec_v3_repeater"
  72. # build_firmware "Xiao_C3_Repeater_sx1262"
  73. # build_firmware "Xiao_S3_WIO_Repeater"
  74. # build_firmware "LilyGo_T3S3_sx1262_Repeater"
  75. # build_firmware "RAK_4631_Repeater"
  76. # build all repeater firmwares
  77. build_all_firmwares_matching "repeater"
  78. }
  79. build_companion_firmwares() {
  80. # # build specific companion firmwares
  81. # build_firmware "Heltec_v2_companion_radio_usb"
  82. # build_firmware "Heltec_v2_companion_radio_ble"
  83. # build_firmware "Heltec_v3_companion_radio_usb"
  84. # build_firmware "Heltec_v3_companion_radio_ble"
  85. # build_firmware "Xiao_S3_WIO_companion_radio_ble"
  86. # build_firmware "LilyGo_T3S3_sx1262_companion_radio_usb"
  87. # build_firmware "LilyGo_T3S3_sx1262_companion_radio_ble"
  88. # build_firmware "RAK_4631_companion_radio_usb"
  89. # build_firmware "RAK_4631_companion_radio_ble"
  90. # build_firmware "t1000e_companion_radio_ble"
  91. # build all companion firmwares
  92. build_all_firmwares_matching "companion_radio_usb"
  93. build_all_firmwares_matching "companion_radio_ble"
  94. }
  95. build_room_server_firmwares() {
  96. # # build specific room server firmwares
  97. # build_firmware "Heltec_v3_room_server"
  98. # build_firmware "RAK_4631_room_server"
  99. # build all room server firmwares
  100. build_all_firmwares_matching "room_server"
  101. }
  102. build_firmwares() {
  103. build_companion_firmwares
  104. build_repeater_firmwares
  105. build_room_server_firmwares
  106. }
  107. # clean build dir
  108. rm -rf out
  109. mkdir -p out
  110. # handle script args
  111. if [[ $1 == "build-firmware" ]]; then
  112. if [ "$2" ]; then
  113. build_firmware $2
  114. fi
  115. elif [[ $1 == "build-firmwares" ]]; then
  116. build_firmwares
  117. elif [[ $1 == "build-companion-firmwares" ]]; then
  118. build_companion_firmwares
  119. elif [[ $1 == "build-repeater-firmwares" ]]; then
  120. build_repeater_firmwares
  121. elif [[ $1 == "build-room-server-firmwares" ]]; then
  122. build_room_server_firmwares
  123. fi