chore: use Ninja for Win cpn and improve Python support (#6455)

This commit is contained in:
Raphael Coeffic
2025-07-27 11:50:22 +10:00
committed by GitHub
parent 23e3730289
commit 89f5d006c9
7 changed files with 312 additions and 126 deletions
+269 -64
View File
@@ -1,39 +1,28 @@
#!/bin/bash
# Stops on first error, echo on
set -e
set -x
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
. "$SCRIPT_DIR/build-common.sh"
if [ "$(uname)" = "Darwin" ]; then
num_cpus=$(sysctl -n hw.ncpu)
: "${JOBS:=$num_cpus}"
else
JOBS=3
fi
while [ $# -gt 0 ]
do
case "$1" in
--jobs=*)
JOBS="${1#*=}";;
-j*)
JOBS="${1#*j}";;
-*)
echo >&2 "usage: $0 [-j<jobs>|--jobs=<jobs>] SRCDIR OUTDIR"
exit 1;;
*)
break;; # terminate while loop
esac
shift
done
SRCDIR=$1
OUTDIR=$2
COMMON_OPTIONS="-DGVARS=YES -DHELI=YES -DLUA=YES -Wno-dev -DCMAKE_BUILD_TYPE=Release"
if [[ -z ${SRCDIR} ]]; then
SRCDIR="$(pwd)"
fi
if [[ -z ${OUTDIR} ]]; then
OUTDIR="$(pwd)/output"
fi
QUIET_FLAGS=""
if [[ "$CMAKE_GENERATOR" == "Ninja" ]]; then
QUIET_FLAGS="-- --quiet"
else
# Assume Makefile generator for non-Ninja builds
COMMON_OPTIONS="-DCMAKE_RULE_MESSAGES=OFF"
fi
COMMON_OPTIONS="${COMMON_OPTIONS} -DCMAKE_BUILD_TYPE=Release -DCMAKE_MESSAGE_LOG_LEVEL=WARNING -Wno-dev -DGVARS=YES -DHELI=YES -DLUA=YES"
if [ "$(uname)" = "Darwin" ]; then
COMMON_OPTIONS="${COMMON_OPTIONS} -DCMAKE_OSX_DEPLOYMENT_TARGET='10.15'"
elif [ "$(uname)" != "Linux" ]; then # Assume Windows and MSYS2
@@ -62,46 +51,262 @@ if [[ -z ${EDGETX_VERSION_SUFFIX} ]]; then
fi
fi
rm -rf build
mkdir build
cd build
if [ "$(uname)" = "Linux" ] && [ -n "$GITHUB_ACTIONS" ]; then
MAX_JOBS=3
fi
declare -a simulator_plugins=(x9lite x9lites
x7 x7access
t8 t12 t12max tx12 tx12mk2
zorro commando8 boxer pocket mt12 gx12
tlite tpro tprov2 tpros bumblebee lr3pro t14
x9d x9dp x9dp2019 x9e
xlite xlites
nv14 el18 pl18 pl18ev pl18u st16
x10 x10express x12s
t15 t16 t18 t20 t20v2 tx16s f16 v14 v16)
rm -rf build && mkdir build && cd build
for plugin in "${simulator_plugins[@]}"
do
BUILD_OPTIONS="${COMMON_OPTIONS} "
echo "Building ${plugin}"
# Function to output error logs (works in both GitHub Actions and terminal)
output_error_log() {
local log_file="$1"
local context="$2"
if ! get_target_build_options "$plugin"; then
echo "Error: Failed to find a match for target '$plugin'"
exit 1
if [[ -f "$log_file" ]]; then
echo "------------------------------------------"
echo " Full error output from $log_file:"
echo "------------------------------------------"
cat "$log_file"
else
echo "⚠️ Warning: Log file $log_file not found for $context"
fi
}
# Function to show last N lines of a log file for warnings
show_log_summary() {
local log_file="$1"
local lines="${2:-50}"
local context="$3"
if [[ -f "$log_file" ]]; then
echo "------------------------------------------"
echo "Last $lines lines from $log_file:"
echo "------------------------------------------"
tail -n "$lines" "$log_file"
fi
}
run_pipeline() {
local pipeline_type="$1"
local log_file="${2:-/dev/null}"
local context="$3"
local show_details="${4:-false}"
local cmake_opts="--parallel ${MAX_JOBS} ${QUIET_FLAGS}"
case "$pipeline_type" in
"plugin")
clean_build
if ! execute_with_output "⚙️ Configuring" "cmake ${BUILD_OPTIONS} ${SRCDIR}" "$log_file" "$show_details"; then
output_error_log "$log_file" "$context (Configuration)"
return 1
fi
if ! execute_with_output "🔧 Native config" "cmake --build . --target native-configure ${cmake_opts}" "$log_file" "$show_details"; then
output_error_log "$log_file" "$context (Native Configure)"
return 1
fi
if ! execute_with_output "📦 Building lib" "cmake --build native --target libsimulator ${cmake_opts}" "$log_file" "$show_details"; then
output_error_log "$log_file" "$context (Library Build)"
return 1
fi
;;
"final")
if ! execute_with_output "🔧 Final config" "cmake --build . --target native-configure ${cmake_opts}" "$log_file" "$show_details"; then
output_error_log "$log_file" "Final Configuration"
return 1
fi
if ! execute_with_output "📦 Building companion" "cmake --build native --target companion ${cmake_opts}" "$log_file" "$show_details"; then
output_error_log "$log_file" "$context (Companion Build)"
return 1
fi
if ! execute_with_output "📦 Packaging" "cmake --build native --target ${PACKAGE_TARGET}" "$log_file" "true"; then
output_error_log "$log_file" "Final Packaging"
return 1
fi
;;
esac
return 0
}
execute_with_output() {
local description="$1"
local command="$2"
local log_file="$3"
local show_output="${4:-false}"
if [[ "$show_output" == "true" && "$log_file" != "/dev/null" ]]; then
echo " $description..."
fi
eval "$command" >> "$log_file" 2>&1
}
clean_build() {
rm -f CMakeCache.txt native/CMakeCache.txt
}
get_platform_config() {
local platform=$(uname)
case "$platform" in
"Darwin")
PACKAGE_TARGET="package"
PACKAGE_FILES="*.dmg"
PACKAGE_NAME="macOS DMG"
PACKAGE_EMOJI="🍎"
;;
"Linux")
PACKAGE_TARGET="package"
PACKAGE_FILES="*.AppImage"
PACKAGE_NAME="Linux AppImage"
PACKAGE_EMOJI="🐧"
;;
*)
PACKAGE_TARGET="installer"
PACKAGE_FILES="companion/*.exe"
PACKAGE_NAME="Windows installer"
PACKAGE_EMOJI="🪟"
;;
esac
}
# Enhanced plugin builder with better error handling
build_plugin() {
local plugin="$1"
local log_file="build_${plugin}.log"
local verbose="${2:-false}"
BUILD_OPTIONS="${COMMON_OPTIONS} "
if ! get_target_build_options "$plugin" >> "$log_file" 2>&1; then
if [[ -n "$GITHUB_ACTIONS" ]]; then
echo "::error::Failed to get build options for $plugin"
fi
output_error_log "$log_file" "$plugin (Build Options)"
return 1
fi
# Only show detailed output in GitHub Actions or if verbose is requested
local show_details="false"
if [[ -n "$GITHUB_ACTIONS" || "$verbose" == "true" ]]; then
show_details="true"
fi
if ! run_pipeline "plugin" "$log_file" "$plugin" "$show_details"; then
return 1
fi
# Check for warnings and show summary if found
if grep -q -i "warning" "$log_file"; then
echo " ⚠️ $plugin completed with warnings"
if [[ "$show_details" == "true" ]]; then
show_log_summary "$log_file" 50 "$plugin (Warnings)"
fi
return 0
fi
rm -f CMakeCache.txt native/CMakeCache.txt
cmake ${BUILD_OPTIONS} "${SRCDIR}"
cmake --build . --target native-configure
cmake --build native -j"${JOBS}" --target libsimulator
done
echo " ✅ $plugin completed successfully"
return 0
}
cmake --build . --target native-configure
if [ "$(uname)" = "Darwin" ]; then
cmake --build native -j"${JOBS}" --target package
cp native/*.dmg "${OUTDIR}"
elif [ "$(uname)" = "Linux" ]; then
cmake --build native -j"${JOBS}" --target package
cp native/*.AppImage "${OUTDIR}"
else
cmake --build native --target installer
cp native/companion/*.exe "${OUTDIR}"
declare -a simulator_plugins=(
x9lite x9lites x9d x9dp x9dp2019 x9e
x7 x7access
t8 t12 t12max tx12 tx12mk2 t15 t16 t18 t20 t20v2
xlite xlites
x10 x10express x12s
zorro tx16s
commando8 boxer pocket mt12 gx12
tlite tpro tprov2 tpros bumblebee lr3pro t14
nv14 el18 pl18 pl18ev pl18u st16
f16 v14 v16
)
get_platform_config
TOTAL=${#simulator_plugins[@]}
FAILED_PLUGINS=()
echo "🔨 Building $TOTAL Plugins for $PACKAGE_NAME"
for i in "${!simulator_plugins[@]}"; do
plugin="${simulator_plugins[$i]}"
current=$((i + 1))
percent=$((current * 100 / TOTAL))
# For terminal output, put each plugin on its own line for cleaner display
if [[ -n "$GITHUB_ACTIONS" ]]; then
printf "::group::%s %-12s [%2d/%2d] %3d%%\n" "$PACKAGE_EMOJI" "$plugin" "$current" "$TOTAL" "$percent"
else
echo "🔨 [$current/$TOTAL] ($percent%) Building $plugin..."
fi
error_status=0
if ! build_plugin "$plugin"; then
FAILED_PLUGINS+=("$plugin")
error_status=1
fi
if [[ -n "$GITHUB_ACTIONS" ]]; then
echo "::endgroup::"
fi
if [ $error_status -ne 0 ]; then
# TODO: if not '--build-all' used
exit 1
fi
done
# Show summary of any failures (if using continue-on-error approach)
if [ ${#FAILED_PLUGINS[@]} -gt 0 ]; then
if [[ -n "$GITHUB_ACTIONS" ]]; then
echo "::group::❌ Build Failures Summary"
else
echo "❌ Build Failures Summary"
echo "=========================================="
fi
echo "The following plugins failed to build:"
for failed_plugin in "${FAILED_PLUGINS[@]}"; do
echo " ❌ $failed_plugin"
done
if [[ -n "$GITHUB_ACTIONS" ]]; then
echo "::endgroup::"
else
echo "=========================================="
fi
exit 1
fi
if [[ -n "$GITHUB_ACTIONS" ]]; then
echo "::group::📦 Final $PACKAGE_NAME Package"
else
echo "📦 Final $PACKAGE_NAME Package"
echo "=========================================="
fi
error_status=0
if run_pipeline "final" "final.log" "companion" "true"; then
if cp native/$PACKAGE_FILES "${OUTDIR}" 2>/dev/null; then
echo " ✅ All builds completed successfully!"
echo " 📁 Package saved to: ${OUTDIR}"
else
echo " ❌ Failed to copy package files to output directory"
echo " 📁 Directory Contents:"
echo " ----------------------"
echo "Contents of native/ directory:"
ls -la native/ || echo "native/ directory not found"
echo "Looking for files matching: $PACKAGE_FILES"
find native/ -name "$PACKAGE_FILES" 2>/dev/null || echo "No matching files found"
error_status=1
fi
else
echo " ❌ Final packaging failed"
error_status=1
fi
if [[ -n "$GITHUB_ACTIONS" ]]; then
echo "::endgroup::"
fi
exit $error_status
+2 -21
View File
@@ -7,17 +7,6 @@ set -x
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
. "$SCRIPT_DIR/build-common.sh"
# Allow variable core usage
# default uses all cpu cores
#
if [ -f /usr/bin/nproc ]; then
num_cpus=$(nproc)
elif [ -f /usr/sbin/sysctl ]; then
num_cpus=$(sysctl -n hw.logicalcpu)
else
num_cpus=2
fi
: "${CORES:=$num_cpus}"
# If no build target, exit
#: "${FLAVOR:=ALL}"
@@ -25,14 +14,6 @@ fi
for i in "$@"
do
case $i in
--jobs=*)
CORES="${i#*=}"
shift
;;
-j*)
CORES="${i#*j}"
shift
;;
-Wno-error)
WERROR=0
shift
@@ -100,8 +81,8 @@ do
fi
cmake ${BUILD_OPTIONS} "${SRCDIR}"
cmake --build . --target arm-none-eabi-configure
cmake --build arm-none-eabi -j"${CORES}" --target ${FIRMARE_TARGET}
cmake --build . --target arm-none-eabi-configure --parallel
cmake --build arm-none-eabi --target ${FIRMARE_TARGET} --parallel
rm -f CMakeCache.txt arm-none-eabi/CMakeCache.txt