1
0
Fork 0
mirror of https://github.com/EdgeTX/edgetx.git synced 2025-07-25 17:25:10 +03:00

[build] Add comprehensive firmware size reporting scripts for ARM MCUs. (#4218)

* [build] Add comprehensive firmware size reporting scripts for ARM MCUs.

* [build] Add firmware size reports to commit-tests.sh.

* [build] Set permissions on new scripts.

* [build] Add -Wno-error option to commit-tests.sh.

* [build] Revert firmware size report to using `arm-none-eabi-size` if bash not found (eg. on Windows).

* [git] Add .gitattributes to force line endings on UNIX shell scripts.
This commit is contained in:
Max Paperno 2017-01-12 15:32:36 -05:00 committed by Bertrand Songis
parent 3944f30d06
commit f4f07d3c0c
9 changed files with 409 additions and 25 deletions

1
.gitattributes vendored Normal file
View file

@ -0,0 +1 @@
*.sh eol=lf

View file

@ -451,11 +451,20 @@ if(NOT MSVC)
WORKING_DIRECTORY ${CMAKE_BINARY_DIR} WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
) )
add_custom_target(firmware-size find_program(BASH bash HINTS "c:/cygwin/bin/" DOC "bash shell for firmware size report (eg. c:/cygwin/bin/bash.exe on Windows).")
COMMAND arm-none-eabi-size firmware.elf if (BASH)
DEPENDS firmware add_custom_target(firmware-size
WORKING_DIRECTORY ${CMAKE_BINARY_DIR} COMMAND ${BASH} -kc '${RADIO_DIRECTORY}/util/elf-size-report.sh --mcu=${CPU_TYPE_FULL} ${SIZE_TARGET_MEM_DEFINE} firmware.elf'
) DEPENDS firmware
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
)
else()
add_custom_target(firmware-size
COMMAND arm-none-eabi-size -A firmware.elf
DEPENDS firmware
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
)
endif()
else() # AVR else() # AVR

View file

@ -25,6 +25,9 @@ set(FLAVOUR horus)
set(RAMBACKUP YES) set(RAMBACKUP YES)
set(LUA YES) set(LUA YES)
set(PPM_LIMITS_SYMETRICAL YES) set(PPM_LIMITS_SYMETRICAL YES)
# for size report script
set(CPU_TYPE_FULL STM32F429xI)
set(SIZE_TARGET_MEM_DEFINE "MEM_SIZE_SDRAM2=8192")
if(SPLASH STREQUAL OFF) if(SPLASH STREQUAL OFF)
message(FATAL_ERROR "Option SPLASH=OFF not supported on Horus") message(FATAL_ERROR "Option SPLASH=OFF not supported on Horus")

View file

@ -15,6 +15,7 @@ if(PCB STREQUAL 9XRPRO)
set(LINKER_SCRIPT targets/sky9x/sam3s8c_flash.ld) set(LINKER_SCRIPT targets/sky9x/sam3s8c_flash.ld)
set(TARGET_SRC ${TARGET_SRC} rtc_driver.cpp) set(TARGET_SRC ${TARGET_SRC} rtc_driver.cpp)
set(OPENRC_BOOTLOADER bootflash8.lbm) set(OPENRC_BOOTLOADER bootflash8.lbm)
set(CPU_TYPE_FULL ATSAM3S8C) # for size report
elseif(PCB STREQUAL AR9X) elseif(PCB STREQUAL AR9X)
add_definitions(-Dat91sam3s8 -DAR9X -DSOFTWARE_VOLUME) add_definitions(-Dat91sam3s8 -DAR9X -DSOFTWARE_VOLUME)
set(FLAVOUR ar9x) set(FLAVOUR ar9x)
@ -23,20 +24,28 @@ elseif(PCB STREQUAL AR9X)
set(TARGET_SRC ${TARGET_SRC} i2c_driver.cpp rtc_ds3231_driver.cpp) set(TARGET_SRC ${TARGET_SRC} i2c_driver.cpp rtc_ds3231_driver.cpp)
set(LINKER_SCRIPT targets/sky9x/sam3s8c_flash.ld) set(LINKER_SCRIPT targets/sky9x/sam3s8c_flash.ld)
set(OPENRC_BOOTLOADER bootflash8.lbm) set(OPENRC_BOOTLOADER bootflash8.lbm)
set(CPU_TYPE_FULL ATSAM3S8C) # for size report
else() else()
set(FLAVOUR sky9x) set(FLAVOUR sky9x)
option(PCBREV "PCB Revision" REVC) set(PCBREV "REVC" CACHE STRING "PCB Revision (REVA/REVB/REVC)")
set_property(CACHE PCBREV PROPERTY STRINGS "REVA" "REVB" "REVC")
set(TARGET_SRC ${TARGET_SRC} coproc_driver.cpp rotenc_driver.cpp rtc_driver.cpp) set(TARGET_SRC ${TARGET_SRC} coproc_driver.cpp rotenc_driver.cpp rtc_driver.cpp)
set(OPENRC_BOOTLOADER bootflash4.lbm) set(OPENRC_BOOTLOADER bootflash4.lbm)
if(PCBREV STREQUAL REVA) if(PCBREV STREQUAL REVA)
add_definitions(-DDREVA) add_definitions(-DDREVA)
set(LINKER_SCRIPT targets/sky9x/sam3s2c_flash.ld) set(LINKER_SCRIPT targets/sky9x/sam3s2c_flash.ld)
elseif(PCBREV STREQUAL REVB) set(CPU_TYPE_FULL ATSAM3S2C) # for size report
add_definitions(-DDREVB -DCOPROCESSOR)
set(LINKER_SCRIPT targets/sky9x/sam3s4c_flash.ld)
else() else()
add_definitions(-DDREVC -DCOPROCESSOR) if(PCBREV STREQUAL REVB)
add_definitions(-DDREVB)
elseif(PCBREV STREQUAL REVC)
add_definitions(-DDREVC)
else()
message(SEND_ERROR "Unknown PCB Revision '${PCBREV}'")
endif()
add_definitions(-DCOPROCESSOR)
set(LINKER_SCRIPT targets/sky9x/sam3s4c_flash.ld) set(LINKER_SCRIPT targets/sky9x/sam3s4c_flash.ld)
set(CPU_TYPE_FULL ATSAM3S4C) # for size report
endif() endif()
endif() endif()

View file

@ -5,6 +5,7 @@ option(TARANIS_INTERNAL_PPM "Taranis internal module hack to output PPM" OFF)
if(PCB STREQUAL X9E) if(PCB STREQUAL X9E)
set(STICKS "STANDARD" CACHE STRING "Sticks type (STANDARD/HORUS)") set(STICKS "STANDARD" CACHE STRING "Sticks type (STANDARD/HORUS)")
set(CPU_TYPE STM32F4) set(CPU_TYPE STM32F4)
set(CPU_TYPE_FULL STM32F407xE) # for size report
set(LINKER_SCRIPT targets/taranis/stm32f4_flash.ld) set(LINKER_SCRIPT targets/taranis/stm32f4_flash.ld)
set(HAPTIC YES) set(HAPTIC YES)
set(LUA_EXPORT lua_export_x9e) set(LUA_EXPORT lua_export_x9e)
@ -28,6 +29,7 @@ if(PCB STREQUAL X9E)
set(GVAR_SCREEN model_gvars.cpp) set(GVAR_SCREEN model_gvars.cpp)
elseif(PCB STREQUAL X9D+) elseif(PCB STREQUAL X9D+)
set(CPU_TYPE STM32F2) set(CPU_TYPE STM32F2)
set(CPU_TYPE_FULL STM32F205xE) # for size report
set(LINKER_SCRIPT targets/taranis/stm32f2_flash.ld) set(LINKER_SCRIPT targets/taranis/stm32f2_flash.ld)
set(HAPTIC YES) set(HAPTIC YES)
set(LUA_EXPORT lua_export_x9d) set(LUA_EXPORT lua_export_x9d)
@ -42,6 +44,7 @@ elseif(PCB STREQUAL X9D+)
set(GVAR_SCREEN model_gvars.cpp) set(GVAR_SCREEN model_gvars.cpp)
elseif(PCB STREQUAL X9D) elseif(PCB STREQUAL X9D)
set(CPU_TYPE STM32F2) set(CPU_TYPE STM32F2)
set(CPU_TYPE_FULL STM32F205xE) # for size report
set(LINKER_SCRIPT targets/taranis/stm32f2_flash.ld) set(LINKER_SCRIPT targets/taranis/stm32f2_flash.ld)
option(HAPTIC "Haptic support" OFF) option(HAPTIC "Haptic support" OFF)
set(LUA_EXPORT lua_export_x9d) set(LUA_EXPORT lua_export_x9d)
@ -56,6 +59,7 @@ elseif(PCB STREQUAL X9D)
set(GVAR_SCREEN model_gvars.cpp) set(GVAR_SCREEN model_gvars.cpp)
elseif(PCB STREQUAL X7) elseif(PCB STREQUAL X7)
set(CPU_TYPE STM32F2) set(CPU_TYPE STM32F2)
set(CPU_TYPE_FULL STM32F205xE) # for size report
set(LINKER_SCRIPT targets/taranis/stm32f2_flash.ld) set(LINKER_SCRIPT targets/taranis/stm32f2_flash.ld)
set(HAPTIC YES) set(HAPTIC YES)
set(LUA_EXPORT lua_export_x7) set(LUA_EXPORT lua_export_x7)

70
radio/util/elf-size-compare.awk Executable file
View file

@ -0,0 +1,70 @@
#!/usr/bin/awk -nf
#
# Parses the output of elf-size-report.awk and calculates segment memory usage deltas between the analyzed elf files.
#
# License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html
# Copyright (c)2016 Maxim Paperno
# Copyright (c)2017 OpenTX
#
BEGIN {
in_ttls = 0;
elf_cnt = 0;
sec_cnt = 0;
}
{
if ($1 == "----" && NF > 5 && $5 ~ /\.elf$/) {
fname[elf_cnt] = $5;
}
else if (tolower($1) ~ /totals/) {
in_ttls = 1;
elf_cnt++;
}
else if (in_ttls && NF != 5) {
in_ttls = 0;
}
else if (in_ttls) {
if (elf_cnt == 1)
a[++sec_cnt] = $1;
d[elf_cnt][$1]["total"] = $2;
}
}
END {
printf("\n---- Comparing results of %d files ----\n\n", elf_cnt);
PROCINFO["sorted_in"] = "@ind_num_asc"
for (j in d) {
if (length(fname[j-1]))
printf("file %d: %s\n", j, fname[j-1])
}
printf("\n%-8s ", "Section");
for (j in d) {
printf("%8s ", "file " j);
if (j > 1)
printf("(%7s) ", "\xCE\x94 vs f1");
if (j > 2)
printf("(%7s) ", "\xCE\x94 vs f" j-1);
}
printf("\n");
for (i in a) {
n = a[i];
printf("%8s ", n);
for (j in d) {
printf("%8.2f ", d[j][n]["total"]);
if (j > 1)
printDelta(d[j][n]["total"] - d[1][n]["total"]);
if (j > 2)
printDelta(d[j][n]["total"] - d[j-1][n]["total"]);
}
printf("\n");
}
printf("\n");
}
function printDelta(dlta) {
if (dlta)
printf("(%+7.2f) ", dlta);
else
printf("(%7s) ", "--.--");
}

105
radio/util/elf-size-report.awk Executable file
View file

@ -0,0 +1,105 @@
#!/usr/bin/awk -nf
#
# Process gcc binutils 'size -A' output to show more specific and summarized information about memory segment usage.
#
# This script expects some variables to be set on the command line with -v:
# names : list of segment names ("Flash", "RAM" etc.)
# addrs : list of segment start addresses in hex/oct/dec (in same order as names)
# sizes : list of segment sizes in KB (in same order as names)
# elf : name of elf file (optional, for display only)
# mcu : name of MCU (optional, for display only)
# skip_data : skip duplicate .data in Flash (0/1 default: 0)
#
# NOTE: The memory segments should be specified in increasing address order (low to high).
#
# Usage example:
# arm-none-eabi-size -A -x firmware.elf | ./elf-size-report.awk \
# -v elf="firmware.elf" \
# -v mcu="STM32F401VG" \
# -v names="Flash RAM" \
# -v addrs "0x08000000 0x100000000" \
# -v sizes "512 128"
#
# License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html
# Copyright (c)2016 Maxim Paperno
# Copyright (c)2017 OpenTX
#
BEGIN {
err = 0;
len = split(names, a_names, " ");
alen = split(addrs, a_addrs, " ");
slen = split(sizes, a_sizes, " ");
if (!len || len != alen || len != slen) {
print "Error: No segment data provided or array sizes mismatch, exiting.";
exit err = 1;
}
flash_name = "Flash";
for (i in a_names) {
n = a_names[i];
a[i] = n; d[n]["addr"] = a_addrs[i]; d[n]["size"] = a_sizes[i]; d[n]["sum"] = 0;
if (tolower(n) ~ /flash/)
flash_name = n;
}
flmax = d[flash_name]["addr"];
fmtstr = "%-20s %7d 0x%08x %s\n";
printf("\n---- Size report");
if (length(elf)) printf(" for %s", elf);
if (length(mcu)) printf(" (MCU: %s)", mcu);
printf(" ----\n\n");
printf("Section Details:\n");
printf("%-20s %7s %10s %s\n", "section", "size(B)", "addr", "loc");
}
# Process each line of 'size' output listing the program's sections,
# skip line if sections size or address are zero.
NR > 2 && $2 != 0 && $3 != 0 {
if ($1 == ".data") {
# .data section is always in Flash but 'size' reports it only in RAM (sometimes twice)
d[flash_name]["sum"] += $2;
printf(fmtstr, $1 " (added)", $2, flmax, flash_name);
flmax += $3;
if (skip_data) { next; }
}
# Walk over each specified memory segment looking for a match
# note: (this assumes segments were passed in ascending memory order)
PROCINFO["sorted_in"] = "@ind_num_desc"
addr = d[a[len]]["addr"];
for (i in a) {
n = a[i];
if ($3 >= addr) {
# check for overflow into contigious region
t = d[n]["sum"] + $2 - (d[n]["size"] * 1024);
if (t > 0 && i < len && d[a[i+1]]["addr"] = d[n]["addr"] + d[n]["size"] + 1) {
d[n]["sum"] += $2 - t;
d[a[i+1]]["sum"] += t;
seg = n "+" a[i+1];
}
else {
d[n]["sum"] += $2;
seg = n;
}
printf(fmtstr, $1, $2, $3, seg);
# track maximum flash address used
if (n == flash_name)
flmax += $2;
break;
}
else if (i > 1)
addr = d[a[i-1]]["addr"];
}
}
END {
if (err) exit err;
fmtstr = "%7s: %8.2f %6.2f%% %6d\t%7.2f\n";
printf("\nTotals %8s usage of ttl\tKB free\n", "KB");
PROCINFO["sorted_in"] = "@ind_num_asc"
for (i in a) {
n = a[i];
if (d[n]["size"] > 0)
printf(fmtstr, n, d[n]["sum"]/1024, d[n]["sum"]/(d[n]["size"]*1024)*100, d[n]["size"], d[n]["size"] - d[n]["sum"]/1024 );
}
printf("\n");
}

175
radio/util/elf-size-report.sh Executable file
View file

@ -0,0 +1,175 @@
#!/bin/bash
#
# This is a wrapper for the elf-size-report.awk script which prints a detailed report
# of memory segment allocations and usage in a given ELF file, based on gcc 'size' output.
# This script sets up memory segment information needed by the awk script.
# If more than one .elf file is given, then a comparison (delta memory use) report is
# also performed using elf-size-compare.awk.
# Currently supports some STMicro & Atmel ARM MCUs. May not work with all placement strategies.
#
# Usage:
# [VAR=value] ./elf-memory-report.sh [options] [file.elf] [file2.elf] [...]
#
# Where VAR is any of the CAPITALIZED variables below. More than one can be specified,
# and any VAR can also be set in the environment.
# SIZE : gcc binutils 'size' command to use, default is "arm-none-eabi-size".
# MCU :
# Specifies MCU model on which to base default segment location/size parameters. Also see "--mcu=" option.
# MEM_START_<segment> & MEM_SIZE_<segment> : (read code below for defaults)
# Allows specifying additional/custom segment information, eg. MEM_SIZE_FLASH=768
#
# Options can be one or more of the following:
# --mcu=<MCU>
# Set MCU type. Same as setting the MCU env. variable, and overrides it.
# --skip-data
# Some linker scripts duplicate .data in the output (eg: .data and .data_run).
# Set this option to skip .data from being counted in RAM a 2nd time
# (it is always shown as being in Flash).
# --compare-only
# When specifying multiple elf files, only show the final comparison report.
# --no-compare
# Opposite and exclusive of previous option, that is, do NOT show comparison report (only size reports).
#
# If an elf file is not specified on the command line, this script will prompt for one.
#
# Examples:
# MCU="STM32F439xI" MEM_SIZE_SDRAM2=8192 ./elf-memory-report.sh path/to/firmware.elf
# ./elf-memory-report.sh --mcu ATSAM3S4C --compare-only firmware_new.elf firmware_old.elf
# set -k && ./elf-memory-report.sh MCU=STM32F427VG --skip-data firmware.elf
# (the -k switch allows variable assignment anywhere on the command line)
# c:\cygwin\bin\bash -kc './elf-memory-report.sh --mcu ATSAM3S8C "c:\windows\path\with spaces\firmware.elf"'
#
# License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html
# Copyright (c)2016 Maxim Paperno
# Copyright (c)2017 OpenTX
#
# -- gcc binutils 'size' command to use
: ${SIZE:="arm-none-eabi-size"}
# -- MCU type, if defined will set certain memory defaults
# e.g. STM32F205xE or ATSAM3S4C
: ${MCU:="unknown"}
# -- process options
compare=2
skip_data=0
for i in "$@" ; do
case $i in
--mcu=*) MCU="${i#*=}"; shift;;
--skip-data) skip_data=1; shift;;
--compare-only) compare=1; shift;;
--no-compare) compare=0; shift;;
esac
done
# -- defaults which may change based on MCU
default_flash_addr=0x08000000
default_flash_sz=1024 # KB
default_ccm_sz=0
default_ram1_sz=128
default_ram2_sz=0
default_ram3_sz=0
# -- Set defaults based on MCU type
if [[ $MCU != "unknown" ]] ; then
mcu_brand=${MCU:0:2} # ST or AT
if [[ $mcu_brand == "ST" && ${#MCU} -ge 7 ]] ; then
# e.g.: STM32F427VG
stm_series=${MCU:6:1} # 4
stm_ser_ex=${MCU:7:1} # 2
stm_flash=${MCU:10:1} # G
default_ram1_sz=112
default_ram2_sz=16
case $stm_flash in
"I") default_flash_sz=2048;;
"G") default_flash_sz=1024;;
"E") default_flash_sz=512;;
"C") default_flash_sz=256;;
esac
if (( $stm_series == 4 )) ; then
default_ccm_sz=64
if (( $stm_ser_ex >= 2 )) ; then
default_ram3_sz=64
fi
fi
elif [[ $mcu_brand == "AT" && ${#MCU} -ge 9 ]] ; then
# e.g.: ATSAM3S4C
atm_series=${MCU:5:4} # 3S4C
default_flash_addr=0x00400000
case $atm_series in
"3S8C") default_flash_sz=512; default_ram1_sz=64;;
"3S4C") default_flash_sz=256; default_ram1_sz=48;;
"3S2C") default_flash_sz=128; default_ram1_sz=32;;
esac
else
echo "MCU type unrecognized, exiting."
exit 1
fi
fi
# -- target memory locations in hex
: ${MEM_START_FLASH:=$default_flash_addr}
: ${MEM_START_CCRAM:=0x10000000}
: ${MEM_START_SRAM1:=0x20000000}
: ${MEM_START_SRAM2:=0x2001c000}
: ${MEM_START_SRAM3:=0x20020000}
: ${MEM_START_PSRAM1:=0x60000000}
: ${MEM_START_SDRAM1:=0xC0000000}
: ${MEM_START_SDRAM2:=0xD0000000}
# -- target memory sizes in KB
: ${MEM_SIZE_FLASH:=$default_flash_sz}
: ${MEM_SIZE_CCRAM:=$default_ccm_sz}
: ${MEM_SIZE_SRAM1:=$default_ram1_sz}
: ${MEM_SIZE_SRAM2:=$default_ram2_sz}
: ${MEM_SIZE_SRAM3:=$default_ram3_sz}
: ${MEM_SIZE_PSRAM1:=0}
: ${MEM_SIZE_SDRAM1:=0}
: ${MEM_SIZE_SDRAM2:=0}
# -- prompt for elf file if not on command line
if [[ -z "$@" ]] ; then
read -p "Elf file(s): " ELF_FILES
else
ELF_FILES=$@
fi
# -- Set arrays for awk script. The segments should be in increasing address order.
names=("Flash" "CCRAM" "SRAM1" "SRAM2" "SRAM3" "PSRAM1" "SDRAM1" "SDRAM2")
addrs=(${MEM_START_FLASH} ${MEM_START_CCRAM} ${MEM_START_SRAM1} ${MEM_START_SRAM2} ${MEM_START_SRAM3} \
${MEM_START_PSRAM1} ${MEM_START_SDRAM1} ${MEM_START_SDRAM2})
sizes=(${MEM_SIZE_FLASH} ${MEM_SIZE_CCRAM} ${MEM_SIZE_SRAM1} ${MEM_SIZE_SRAM2} ${MEM_SIZE_SRAM3} \
${MEM_SIZE_PSRAM1} ${MEM_SIZE_SDRAM1} ${MEM_SIZE_SDRAM2})
base_dir="$(dirname "$BASH_SOURCE")"
base_dir="${base_dir%%[[:space:]]}" # sometimes we get trailing \n
# -- run the ARM size command for each elf file and send output to awk script
all_output=""
file_cnt=0
for elf in "$@"; do
if [[ ! -f "$elf" ]] ; then
echo "ELF file \"$elf\" not found."
continue
fi
#${SIZE} -A -x ${elf}
escelf="${elf//\\//}"
output=`${SIZE} -A -x ${elf} | "${base_dir}/elf-size-report.awk" \
-v mcu="${MCU}" \
-v elf="${escelf}" \
-v skip_data=${skip_data} \
-v names="${names[*]}" \
-v addrs="${addrs[*]}" \
-v sizes="${sizes[*]}"`
if (( compare != 1 )) ; then
echo "$output"
echo
fi
file_cnt+=1
all_output+="${output}\n"
done
# -- if more than one elf file was given, also run a comparison report
if (( file_cnt > 1 && compare )) ; then
echo "$all_output" | "${base_dir}/elf-size-compare.awk"
fi

View file

@ -5,7 +5,9 @@ set -e
set -x set -x
# Allow variable core usage, default uses two cores, to set 8 cores for example : commit-tests.sh -j8 # Allow variable core usage, default uses two cores, to set 8 cores for example : commit-tests.sh -j8
# Default build treats warnings as errors, set -Wno-error to override, e.g.: commit-tests.sh -Wno-error
CORES=2 CORES=2
WERROR=1
for i in "$@" for i in "$@"
do do
case $i in case $i in
@ -17,6 +19,10 @@ case $i in
CORES="${i#*j}" CORES="${i#*j}"
shift shift
;; ;;
-Wno-error)
WERROR=0
shift
;;
esac esac
done done
@ -27,7 +33,9 @@ else
fi fi
SRCDIR=$(dirname "$SCRIPT")/.. SRCDIR=$(dirname "$SCRIPT")/..
COMMON_OPTIONS="-DCMAKE_BUILD_TYPE=Debug -DCMAKE_PREFIX_PATH=/opt/qt55 -DTRACE_SIMPGMSPACE=NO -DWARNINGS_AS_ERRORS=YES -DVERBOSE_CMAKELISTS=YES -DCMAKE_RULE_MESSAGES=OFF -Wno-dev" COMMON_OPTIONS="-DCMAKE_BUILD_TYPE=Debug -DCMAKE_PREFIX_PATH=/opt/qt55 -DTRACE_SIMPGMSPACE=NO -DVERBOSE_CMAKELISTS=YES -DCMAKE_RULE_MESSAGES=OFF -Wno-dev"
if (( $WERROR )); then COMMON_OPTIONS+=" -DWARNINGS_AS_ERRORS=YES"; fi
FIRMARE_TARGET="firmware-size"
mkdir build || true mkdir build || true
cd build cd build
@ -35,94 +43,94 @@ cd build
# OpenTX on 9X stock with FrSky telemetry # OpenTX on 9X stock with FrSky telemetry
rm -rf * rm -rf *
cmake ${COMMON_OPTIONS} -DPCB=9X -DHELI=YES -DTEMPLATES=YES -DTELEMETRY=FRSKY ${SRCDIR} cmake ${COMMON_OPTIONS} -DPCB=9X -DHELI=YES -DTEMPLATES=YES -DTELEMETRY=FRSKY ${SRCDIR}
make -j${CORES} firmware make -j${CORES} ${FIRMARE_TARGET}
make -j${CORES} simu make -j${CORES} simu
make -j${CORES} gtests ; ./gtests --gtest_shuffle --gtest_repeat=5 --gtest_break_on_failure make -j${CORES} gtests ; ./gtests --gtest_shuffle --gtest_repeat=5 --gtest_break_on_failure
# OpenTX on 9X stock with Ardupilot telemetry # OpenTX on 9X stock with Ardupilot telemetry
rm -rf * rm -rf *
cmake ${COMMON_OPTIONS} -DPCB=9X -DHELI=YES -DTEMPLATES=YES -DTELEMETRY=ARDUPILOT ${SRCDIR} cmake ${COMMON_OPTIONS} -DPCB=9X -DHELI=YES -DTEMPLATES=YES -DTELEMETRY=ARDUPILOT ${SRCDIR}
make -j${CORES} firmware make -j${CORES} ${FIRMARE_TARGET}
# OpenTX on 9X stock with JETI telemetry # OpenTX on 9X stock with JETI telemetry
rm -rf * rm -rf *
cmake ${COMMON_OPTIONS} -DPCB=9X -DHELI=YES -DTEMPLATES=YES -DTELEMETRY=JETI ${SRCDIR} cmake ${COMMON_OPTIONS} -DPCB=9X -DHELI=YES -DTEMPLATES=YES -DTELEMETRY=JETI ${SRCDIR}
make -j${CORES} firmware make -j${CORES} ${FIRMARE_TARGET}
# OpenTX on Mega2560 # OpenTX on Mega2560
rm -rf * rm -rf *
cmake ${COMMON_OPTIONS} -DPCB=MEGA2560 -DTEMPLATES=YES -DHELI=YES ${SRCDIR} cmake ${COMMON_OPTIONS} -DPCB=MEGA2560 -DTEMPLATES=YES -DHELI=YES ${SRCDIR}
make -j${CORES} firmware make -j${CORES} ${FIRMARE_TARGET}
make -j${CORES} simu make -j${CORES} simu
make -j${CORES} gtests ; ./gtests --gtest_shuffle --gtest_repeat=5 --gtest_break_on_failure make -j${CORES} gtests ; ./gtests --gtest_shuffle --gtest_repeat=5 --gtest_break_on_failure
# OpenTX on Mega2560 with Mavlink telemetry # OpenTX on Mega2560 with Mavlink telemetry
rm -rf * rm -rf *
cmake ${COMMON_OPTIONS} -DPCB=MEGA2560 -DTELEMETRY=MAVLINK -DHELI=YES -DTEMPLATES=YES -DAUDIO=YES -DVOICE=YES ${SRCDIR} cmake ${COMMON_OPTIONS} -DPCB=MEGA2560 -DTELEMETRY=MAVLINK -DHELI=YES -DTEMPLATES=YES -DAUDIO=YES -DVOICE=YES ${SRCDIR}
make -j${CORES} firmware make -j${CORES} ${FIRMARE_TARGET}
make -j${CORES} simu make -j${CORES} simu
make -j${CORES} gtests ; ./gtests --gtest_shuffle --gtest_repeat=5 --gtest_break_on_failure make -j${CORES} gtests ; ./gtests --gtest_shuffle --gtest_repeat=5 --gtest_break_on_failure
# OpenTX on gruvin9x board # OpenTX on gruvin9x board
rm -rf * rm -rf *
cmake ${COMMON_OPTIONS} -DPCB=GRUVIN9X -DHELI=YES -DTEMPLATES=YES -DAUDIO=YES -DVOICE=YES ${SRCDIR} cmake ${COMMON_OPTIONS} -DPCB=GRUVIN9X -DHELI=YES -DTEMPLATES=YES -DAUDIO=YES -DVOICE=YES ${SRCDIR}
make -j${CORES} firmware make -j${CORES} ${FIRMARE_TARGET}
make -j${CORES} simu make -j${CORES} simu
make -j${CORES} gtests ; ./gtests --gtest_shuffle --gtest_repeat=5 --gtest_break_on_failure make -j${CORES} gtests ; ./gtests --gtest_shuffle --gtest_repeat=5 --gtest_break_on_failure
# OpenTX on Sky9x # OpenTX on Sky9x
rm -rf * rm -rf *
cmake ${COMMON_OPTIONS} -DPCB=SKY9X -DHELI=YES ${SRCDIR} cmake ${COMMON_OPTIONS} -DPCB=SKY9X -DHELI=YES ${SRCDIR}
make -j${CORES} firmware make -j${CORES} ${FIRMARE_TARGET}
make -j${CORES} simu make -j${CORES} simu
make -j${CORES} gtests ; ./gtests --gtest_shuffle --gtest_repeat=5 --gtest_break_on_failure make -j${CORES} gtests ; ./gtests --gtest_shuffle --gtest_repeat=5 --gtest_break_on_failure
# OpenTX on AR9X # OpenTX on AR9X
rm -rf * rm -rf *
cmake ${COMMON_OPTIONS} -DPCB=AR9X -DHELI=YES ${SRCDIR} cmake ${COMMON_OPTIONS} -DPCB=AR9X -DHELI=YES ${SRCDIR}
make -j${CORES} firmware make -j${CORES} ${FIRMARE_TARGET}
make -j${CORES} simu make -j${CORES} simu
make -j${CORES} gtests ; ./gtests --gtest_shuffle --gtest_repeat=5 --gtest_break_on_failure make -j${CORES} gtests ; ./gtests --gtest_shuffle --gtest_repeat=5 --gtest_break_on_failure
# OpenTX on X7 # OpenTX on X7
rm -rf * rm -rf *
cmake ${COMMON_OPTIONS} -DPCB=X7 -DHELI=YES ${SRCDIR} cmake ${COMMON_OPTIONS} -DPCB=X7 -DHELI=YES ${SRCDIR}
make -j${CORES} firmware make -j${CORES} ${FIRMARE_TARGET}
make -j${CORES} simu make -j${CORES} simu
make -j${CORES} gtests ; ./gtests --gtest_shuffle --gtest_repeat=5 --gtest_break_on_failure make -j${CORES} gtests ; ./gtests --gtest_shuffle --gtest_repeat=5 --gtest_break_on_failure
# OpenTX on X9D # OpenTX on X9D
rm -rf * rm -rf *
cmake ${COMMON_OPTIONS} -DPCB=X9D -DHELI=YES -DLUA=YES -DGVARS=YES ${SRCDIR} cmake ${COMMON_OPTIONS} -DPCB=X9D -DHELI=YES -DLUA=YES -DGVARS=YES ${SRCDIR}
make -j${CORES} firmware make -j${CORES} ${FIRMARE_TARGET}
make -j${CORES} simu make -j${CORES} simu
make -j${CORES} gtests ; ./gtests --gtest_shuffle --gtest_repeat=5 --gtest_break_on_failure make -j${CORES} gtests ; ./gtests --gtest_shuffle --gtest_repeat=5 --gtest_break_on_failure
# OpenTX on X9D+ # OpenTX on X9D+
rm -rf * rm -rf *
cmake ${COMMON_OPTIONS} -DPCB=X9D+ -DHELI=YES -DLUA=YES -DGVARS=YES ${SRCDIR} cmake ${COMMON_OPTIONS} -DPCB=X9D+ -DHELI=YES -DLUA=YES -DGVARS=YES ${SRCDIR}
make -j${CORES} firmware make -j${CORES} ${FIRMARE_TARGET}
make -j${CORES} simu make -j${CORES} simu
make -j${CORES} gtests ; ./gtests --gtest_shuffle --gtest_repeat=5 --gtest_break_on_failure make -j${CORES} gtests ; ./gtests --gtest_shuffle --gtest_repeat=5 --gtest_break_on_failure
# OpenTX on Taranis X9E # OpenTX on Taranis X9E
rm -rf * rm -rf *
cmake ${COMMON_OPTIONS} -DPCB=X9E -DHELI=YES -DLUA=YES -DGVARS=YES -DPPM_UNIT=PERCENT_PREC1 ${SRCDIR} cmake ${COMMON_OPTIONS} -DPCB=X9E -DHELI=YES -DLUA=YES -DGVARS=YES -DPPM_UNIT=PERCENT_PREC1 ${SRCDIR}
make -j${CORES} firmware make -j${CORES} ${FIRMARE_TARGET}
make -j${CORES} simu make -j${CORES} simu
make -j${CORES} gtests ; ./gtests --gtest_shuffle --gtest_repeat=5 --gtest_break_on_failure make -j${CORES} gtests ; ./gtests --gtest_shuffle --gtest_repeat=5 --gtest_break_on_failure
# OpenTX on Horus beta boards # OpenTX on Horus beta boards
rm -rf * rm -rf *
cmake ${COMMON_OPTIONS} -DPCB=HORUS -DPCBREV=10 -DHELI=YES -DLUA=YES -DGVARS=YES ${SRCDIR} cmake ${COMMON_OPTIONS} -DPCB=HORUS -DPCBREV=10 -DHELI=YES -DLUA=YES -DGVARS=YES ${SRCDIR}
make -j${CORES} firmware make -j${CORES} ${FIRMARE_TARGET}
make -j${CORES} simu make -j${CORES} simu
make -j${CORES} gtests ; ./gtests --gtest_shuffle --gtest_repeat=5 --gtest_break_on_failure make -j${CORES} gtests ; ./gtests --gtest_shuffle --gtest_repeat=5 --gtest_break_on_failure
# OpenTX on Horus # OpenTX on Horus
rm -rf * rm -rf *
cmake ${COMMON_OPTIONS} -DPCB=HORUS -DHELI=YES -DLUA=YES -DGVARS=YES ${SRCDIR} cmake ${COMMON_OPTIONS} -DPCB=HORUS -DHELI=YES -DLUA=YES -DGVARS=YES ${SRCDIR}
make -j${CORES} firmware make -j${CORES} ${FIRMARE_TARGET}
make -j${CORES} simu make -j${CORES} simu
make -j${CORES} gtests ; ./gtests --gtest_shuffle --gtest_repeat=5 --gtest_break_on_failure make -j${CORES} gtests ; ./gtests --gtest_shuffle --gtest_repeat=5 --gtest_break_on_failure