build.sh 5.2 KB

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