micropython: add micropython component
This commit is contained in:
107
components/language/micropython/tools/autobuild/autobuild.sh
Normal file
107
components/language/micropython/tools/autobuild/autobuild.sh
Normal file
@@ -0,0 +1,107 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# Build firmware for ports.
|
||||
#
|
||||
# Requirements:
|
||||
# - All toolchains must be in path (arm-none-eabi-gcc, xtensa-lx106-elf)
|
||||
# - IDF_PATH_V42 must be set
|
||||
# - IDF_PATH_V44 must be set
|
||||
# - MICROPY_AUTOBUILD_MICROPYTHON_REPO must be set to location of micropython repository
|
||||
# - MICROPY_AUTOBUILD_MAKE must be set to the make command to use, eg "make -j2"
|
||||
#
|
||||
# Optional settings:
|
||||
# - MICROPY_AUTOBUILD_REMOTE_MACHINE can be set to a remote ssh machine to copy files to
|
||||
# - MICROPY_AUTOBUILD_REMOTE_DIR can be set to destination directory on remote machine
|
||||
|
||||
if [ ! -d "$IDF_PATH_V42" ]; then
|
||||
echo "must set IDF_PATH_V42"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ ! -d "$IDF_PATH_V44" ]; then
|
||||
echo "must set IDF_PATH_V44"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ ! -d "$MICROPY_AUTOBUILD_MICROPYTHON_REPO" ]; then
|
||||
echo "must set MICROPY_AUTOBUILD_MICROPYTHON_REPO"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ -z "$MICROPY_AUTOBUILD_MAKE" ]; then
|
||||
echo "must set MICROPY_AUTOBUILD_MAKE"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
########################################
|
||||
# Initialisation
|
||||
|
||||
# get directory of this script for access to other build scripts
|
||||
AUTODIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
|
||||
|
||||
# source additional functions
|
||||
source ${AUTODIR}/build-boards.sh
|
||||
|
||||
# make local directory to put firmware
|
||||
LOCAL_FIRMWARE=/tmp/autobuild-firmware-$$
|
||||
mkdir -p ${LOCAL_FIRMWARE}
|
||||
|
||||
# get latest MicroPython
|
||||
git -C ${MICROPY_AUTOBUILD_MICROPYTHON_REPO} pull
|
||||
git -C ${MICROPY_AUTOBUILD_MICROPYTHON_REPO} submodule update --init
|
||||
git -C ${MICROPY_AUTOBUILD_MICROPYTHON_REPO}/lib/pico-sdk submodule update --init
|
||||
|
||||
########################################
|
||||
# Build all firmware
|
||||
|
||||
pushd ${MICROPY_AUTOBUILD_MICROPYTHON_REPO}
|
||||
|
||||
# build cross compiler
|
||||
make -C mpy-cross
|
||||
|
||||
# make the firmware tag
|
||||
FW_DATE=$(date '+%Y%m%d')
|
||||
FW_GIT="$(git describe --dirty || echo unknown)"
|
||||
FW_TAG="-$FW_DATE-unstable-$FW_GIT"
|
||||
|
||||
# build new firmware
|
||||
cd ports/cc3200
|
||||
${AUTODIR}/build-cc3200-latest.sh ${FW_TAG} ${LOCAL_FIRMWARE}
|
||||
cd ../esp8266
|
||||
${AUTODIR}/build-esp8266-latest.sh ${FW_TAG} ${LOCAL_FIRMWARE}
|
||||
cd ../esp32
|
||||
(source ${IDF_PATH_V42}/export.sh && build_esp32_boards ${FW_TAG} ${LOCAL_FIRMWARE})
|
||||
(source ${IDF_PATH_V44}/export.sh && build_esp32_boards ${FW_TAG} ${LOCAL_FIRMWARE})
|
||||
cd ../mimxrt
|
||||
build_mimxrt_boards ${FW_TAG} ${LOCAL_FIRMWARE}
|
||||
cd ../renesas-ra
|
||||
build_renesas_ra_boards ${FW_TAG} ${LOCAL_FIRMWARE}
|
||||
cd ../rp2
|
||||
build_rp2_boards ${FW_TAG} ${LOCAL_FIRMWARE}
|
||||
cd ../samd
|
||||
build_samd_boards ${FW_TAG} ${LOCAL_FIRMWARE}
|
||||
cd ../stm32
|
||||
build_stm32_boards ${FW_TAG} ${LOCAL_FIRMWARE}
|
||||
${AUTODIR}/build-stm32-extra.sh ${FW_TAG} ${LOCAL_FIRMWARE}
|
||||
|
||||
popd
|
||||
|
||||
########################################
|
||||
# Copy firmware to remote machine
|
||||
|
||||
if [ -z "$MICROPY_AUTOBUILD_REMOTE_MACHINE" -o -z "$MICROPY_AUTOBUILD_REMOTE_DIR" ]; then
|
||||
echo "No remote given, leaving firmware in ${LOCAL_FIRMWARE}"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# copy new firmware to remote machine
|
||||
scp ${LOCAL_FIRMWARE}/* ${MICROPY_AUTOBUILD_REMOTE_MACHINE}:${MICROPY_AUTOBUILD_REMOTE_DIR}/
|
||||
|
||||
# remove old firmware
|
||||
${AUTODIR}/remove_old_firmware.py ${MICROPY_AUTOBUILD_REMOTE_MACHINE} ${MICROPY_AUTOBUILD_REMOTE_DIR}
|
||||
|
||||
########################################
|
||||
# Clean up
|
||||
|
||||
/bin/rm -v ${LOCAL_FIRMWARE}/*
|
||||
/bin/rmdir ${LOCAL_FIRMWARE}
|
120
components/language/micropython/tools/autobuild/build-boards.sh
Normal file
120
components/language/micropython/tools/autobuild/build-boards.sh
Normal file
@@ -0,0 +1,120 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# The functions in this file can be run independently to build boards.
|
||||
# For example:
|
||||
#
|
||||
# $ source build-boards.sh
|
||||
# $ MICROPY_AUTOBUILD_MAKE=make build_rp2_boards -latest /tmp
|
||||
|
||||
function build_board {
|
||||
# check/get parameters
|
||||
if [ $# -lt 4 ]; then
|
||||
echo "usage: $0 <board-json-file> <fw-tag> <dest-dir> <exts...>"
|
||||
return 1
|
||||
fi
|
||||
|
||||
board_json=$1
|
||||
fw_tag=$2
|
||||
dest_dir=$3
|
||||
shift
|
||||
shift
|
||||
shift
|
||||
|
||||
board=$(echo $board_json | awk -F '/' '{ print $2 }')
|
||||
descr=$(cat $board_json | python3 -c "import json,sys; print(json.load(sys.stdin).get('id', '$board'))")
|
||||
build_dir=/tmp/micropython-build-$board
|
||||
|
||||
echo "building $descr $board"
|
||||
$MICROPY_AUTOBUILD_MAKE BOARD=$board BUILD=$build_dir && (
|
||||
for ext in $@; do
|
||||
dest=$dest_dir/$descr$fw_tag.$ext
|
||||
if [ -r $build_dir/firmware.$ext ]; then
|
||||
mv $build_dir/firmware.$ext $dest
|
||||
elif [ -r $build_dir/micropython.$ext ]; then
|
||||
# esp32 has micropython.elf, etc
|
||||
mv $build_dir/micropython.$ext $dest
|
||||
fi
|
||||
done
|
||||
)
|
||||
rm -rf $build_dir
|
||||
}
|
||||
|
||||
function build_boards {
|
||||
# check/get parameters
|
||||
if [ $# -lt 4 ]; then
|
||||
echo "usage: $0 <check-file> <fw-tag> <dest-dir> <exts...>"
|
||||
return 1
|
||||
fi
|
||||
|
||||
check_file=$1
|
||||
shift
|
||||
|
||||
# check we are in the correct directory
|
||||
if [ ! -r $check_file ]; then
|
||||
echo "must be in directory containing $check_file"
|
||||
return 1
|
||||
fi
|
||||
|
||||
# build all boards that have a board.json file
|
||||
for board_json in $(find boards/ -name board.json | sort); do
|
||||
build_board $board_json $@
|
||||
done
|
||||
}
|
||||
|
||||
function build_esp32_boards {
|
||||
# check/get parameters
|
||||
if [ $# != 2 ]; then
|
||||
echo "usage: $0 <fw-tag> <dest-dir>"
|
||||
return 1
|
||||
fi
|
||||
|
||||
fw_tag=$1
|
||||
dest_dir=$2
|
||||
|
||||
# check we are in the correct directory
|
||||
if [ ! -r modesp32.c ]; then
|
||||
echo "must be in esp32 directory"
|
||||
return 1
|
||||
fi
|
||||
|
||||
# build the boards, based on the IDF version
|
||||
for board_json in $(find boards/ -name board.json | sort); do
|
||||
mcu=$(cat $board_json | python3 -c "import json,sys; print(json.load(sys.stdin).get('mcu', 'unknown'))")
|
||||
if idf.py --version | grep -q v4.2; then
|
||||
if [ $mcu = esp32 ]; then
|
||||
# build standard esp32-based boards with IDF v4.2
|
||||
if echo $board_json | grep -q GENERIC; then
|
||||
# traditionally, GENERIC and GENERIC_SPIRAM boards used manifest_release.py
|
||||
MICROPY_AUTOBUILD_MAKE="$MICROPY_AUTOBUILD_MAKE FROZEN_MANIFEST=$(pwd)/boards/manifest_release.py" build_board $board_json $fw_tag $dest_dir bin elf map
|
||||
else
|
||||
build_board $board_json $fw_tag $dest_dir bin elf map
|
||||
fi
|
||||
fi
|
||||
else
|
||||
if [ $mcu != esp32 ]; then
|
||||
# build esp32-s2/s3/c3 based boards with IDF v4.4+
|
||||
build_board $board_json $fw_tag $dest_dir bin elf map uf2
|
||||
fi
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
function build_mimxrt_boards {
|
||||
build_boards modmimxrt.c $1 $2 bin hex
|
||||
}
|
||||
|
||||
function build_renesas_ra_boards {
|
||||
build_boards ra_it.c $1 $2 hex
|
||||
}
|
||||
|
||||
function build_rp2_boards {
|
||||
build_boards modrp2.c $1 $2 uf2
|
||||
}
|
||||
|
||||
function build_samd_boards {
|
||||
build_boards samd_soc.c $1 $2 uf2
|
||||
}
|
||||
|
||||
function build_stm32_boards {
|
||||
build_boards modpyb.c $1 $2 dfu hex
|
||||
}
|
@@ -0,0 +1,32 @@
|
||||
#!/bin/bash
|
||||
|
||||
# function for building firmware
|
||||
function do_build() {
|
||||
descr=$1
|
||||
board=$2
|
||||
shift
|
||||
shift
|
||||
echo "building $descr $board"
|
||||
build_dir=/tmp/cc3200-build-$board
|
||||
$MICROPY_AUTOBUILD_MAKE $@ BTARGET=application BOARD=$board BUILD=$build_dir || exit 1
|
||||
zip $dest_dir/$descr$fw_tag.zip $build_dir/mcuimg.bin
|
||||
rm -rf $build_dir
|
||||
}
|
||||
|
||||
# check/get parameters
|
||||
if [ $# != 2 ]; then
|
||||
echo "usage: $0 <fw-tag> <dest-dir>"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
fw_tag=$1
|
||||
dest_dir=$2
|
||||
|
||||
# check we are in the correct directory
|
||||
if [ ! -r application.mk ]; then
|
||||
echo "must be in cc3200 directory"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# build the versions
|
||||
do_build wipy WIPY
|
@@ -0,0 +1,58 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import glob
|
||||
import json
|
||||
import os
|
||||
import sys
|
||||
|
||||
|
||||
def main(repo_path, output_path):
|
||||
boards_index = []
|
||||
board_ids = set()
|
||||
|
||||
for board_json in glob.glob(os.path.join(repo_path, "ports/*/boards/*/board.json")):
|
||||
# Relative path to the board directory (e.g. "ports/stm32/boards/PYBV11").
|
||||
board_dir = os.path.dirname(board_json)
|
||||
# Relative path to the port (e.g. "ports/stm32")
|
||||
port_dir = os.path.dirname(os.path.dirname(board_dir))
|
||||
|
||||
with open(board_json, "r") as f:
|
||||
blob = json.load(f)
|
||||
|
||||
# Use "id" if specified, otherwise default to board dir (e.g. "PYBV11").
|
||||
# We allow boards to override ID for the historical build names.
|
||||
blob["id"] = blob.get("id", os.path.basename(board_dir))
|
||||
|
||||
# Check for duplicate board IDs.
|
||||
if blob["id"] in board_ids:
|
||||
print("Duplicate board ID: '{}'".format(blob["id"]), file=sys.stderr)
|
||||
board_ids.add(blob["id"])
|
||||
|
||||
# Add in default fields.
|
||||
blob["port"] = os.path.basename(port_dir)
|
||||
blob["build"] = os.path.basename(board_dir)
|
||||
boards_index.append(blob)
|
||||
|
||||
# Create the board markdown, which is the concatenation of the
|
||||
# default "board.md" file (if exists), as well as any flashing
|
||||
# instructions.
|
||||
board_markdown = os.path.join(board_dir, "board.md")
|
||||
with open(os.path.join(output_path, blob["id"] + ".md"), "w") as f:
|
||||
if os.path.exists(board_markdown):
|
||||
with open(board_markdown, "r") as fin:
|
||||
f.write(fin.read())
|
||||
|
||||
if blob["deploy"]:
|
||||
f.write("\n\n## Installation instructions\n")
|
||||
for deploy in blob["deploy"]:
|
||||
with open(os.path.join(board_dir, deploy), "r") as fin:
|
||||
f.write(fin.read())
|
||||
|
||||
# Write the full index for the website to load.
|
||||
with open(os.path.join(output_path, "index.json"), "w") as f:
|
||||
json.dump(boards_index, f, indent=4, sort_keys=True)
|
||||
f.write("\n")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main(sys.argv[1], sys.argv[2])
|
@@ -0,0 +1,61 @@
|
||||
#!/bin/bash
|
||||
|
||||
PYTHON3=python3
|
||||
yaota8266=$HOME/yaota8266
|
||||
|
||||
# for debugging
|
||||
#exec &> /tmp/esp-log-$$.txt
|
||||
|
||||
# function for building firmware
|
||||
function do_build() {
|
||||
descr=$1
|
||||
board=$2
|
||||
shift
|
||||
shift
|
||||
echo "building $descr $board"
|
||||
build_dir=/tmp/esp8266-build-$board
|
||||
$MICROPY_AUTOBUILD_MAKE $@ BOARD=$board BUILD=$build_dir || exit 1
|
||||
mv $build_dir/firmware-combined.bin $dest_dir/$descr$fw_tag.bin
|
||||
mv $build_dir/firmware.elf $dest_dir/$descr$fw_tag.elf
|
||||
mv $build_dir/firmware.map $dest_dir/$descr$fw_tag.map
|
||||
rm -rf $build_dir
|
||||
}
|
||||
|
||||
function do_build_ota() {
|
||||
descr=$1
|
||||
board=$2
|
||||
shift
|
||||
shift
|
||||
echo "building $descr $board"
|
||||
build_dir=/tmp/esp8266-build-$board
|
||||
$MICROPY_AUTOBUILD_MAKE $@ BOARD=$board BUILD=$build_dir || exit 1
|
||||
cat $yaota8266/yaota8266.bin $build_dir/firmware-ota.bin > $dest_dir/$descr$fw_tag.bin
|
||||
pushd $yaota8266/ota-client
|
||||
$PYTHON3 ota_client.py sign $build_dir/firmware-ota.bin
|
||||
popd
|
||||
mv $build_dir/firmware-ota.bin.ota $dest_dir/$descr$fw_tag.ota
|
||||
mv $build_dir/firmware.elf $dest_dir/$descr$fw_tag.elf
|
||||
mv $build_dir/firmware.map $dest_dir/$descr$fw_tag.map
|
||||
rm -rf $build_dir
|
||||
}
|
||||
|
||||
# check/get parameters
|
||||
if [ $# != 2 ]; then
|
||||
echo "usage: $0 <fw-tag> <dest-dir>"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
fw_tag=$1
|
||||
dest_dir=$2
|
||||
|
||||
# check we are in the correct directory
|
||||
if [ ! -r boards/esp8266_common.ld ]; then
|
||||
echo "must be in esp8266 directory"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# build the versions
|
||||
do_build esp8266 GENERIC
|
||||
do_build esp8266-512k GENERIC_512K
|
||||
do_build esp8266-1m GENERIC_1M
|
||||
do_build_ota esp8266-ota GENERIC_1M ota
|
@@ -0,0 +1,47 @@
|
||||
#!/bin/bash
|
||||
# Build additional variants of pyboard firmware (base variants are built by build-boards.sh).
|
||||
|
||||
# function for building firmware
|
||||
function do_build() {
|
||||
descr=$1
|
||||
board=$2
|
||||
shift
|
||||
shift
|
||||
echo "building $descr $board"
|
||||
build_dir=/tmp/stm-build-$board
|
||||
$MICROPY_AUTOBUILD_MAKE $@ BOARD=$board BUILD=$build_dir || exit 1
|
||||
mv $build_dir/firmware.dfu $dest_dir/$descr$fw_tag.dfu
|
||||
mv $build_dir/firmware.hex $dest_dir/$descr$fw_tag.hex
|
||||
rm -rf $build_dir
|
||||
}
|
||||
|
||||
# check/get parameters
|
||||
if [ $# != 2 ]; then
|
||||
echo "usage: $0 <fw-tag> <dest-dir>"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
fw_tag=$1
|
||||
dest_dir=$2
|
||||
|
||||
# check we are in the correct directory
|
||||
if [ ! -r modpyb.c ]; then
|
||||
echo "must be in stm directory"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# build the versions
|
||||
do_build pybv3 PYBV3
|
||||
do_build pybv3-network PYBV3 MICROPY_PY_NETWORK_WIZNET5K=5200 MICROPY_PY_CC3K=1
|
||||
do_build pybv10-dp PYBV10 MICROPY_FLOAT_IMPL=double
|
||||
do_build pybv10-thread PYBV10 CFLAGS_EXTRA='-DMICROPY_PY_THREAD=1'
|
||||
do_build pybv10-dp-thread PYBV10 MICROPY_FLOAT_IMPL=double CFLAGS_EXTRA='-DMICROPY_PY_THREAD=1'
|
||||
do_build pybv10-network PYBV10 MICROPY_PY_NETWORK_WIZNET5K=5200 MICROPY_PY_CC3K=1
|
||||
do_build pybv11-dp PYBV11 MICROPY_FLOAT_IMPL=double
|
||||
do_build pybv11-thread PYBV11 CFLAGS_EXTRA='-DMICROPY_PY_THREAD=1'
|
||||
do_build pybv11-dp-thread PYBV11 MICROPY_FLOAT_IMPL=double CFLAGS_EXTRA='-DMICROPY_PY_THREAD=1'
|
||||
do_build pybv11-network PYBV11 MICROPY_PY_NETWORK_WIZNET5K=5200 MICROPY_PY_CC3K=1
|
||||
do_build pyblitev10-dp PYBLITEV10 MICROPY_FLOAT_IMPL=double
|
||||
do_build pyblitev10-thread PYBLITEV10 CFLAGS_EXTRA='-DMICROPY_PY_THREAD=1'
|
||||
do_build pyblitev10-dp-thread PYBLITEV10 MICROPY_FLOAT_IMPL=double CFLAGS_EXTRA='-DMICROPY_PY_THREAD=1'
|
||||
do_build pyblitev10-network PYBLITEV10 MICROPY_PY_NETWORK_WIZNET5K=5200 MICROPY_PY_CC3K=1
|
@@ -0,0 +1,72 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import re, subprocess, sys
|
||||
|
||||
|
||||
DEBUG = False
|
||||
DRY_RUN = False
|
||||
NUM_KEEP_PER_BOARD = 4
|
||||
|
||||
|
||||
def main():
|
||||
ssh_machine = sys.argv[1]
|
||||
ssh_firmware_dir = sys.argv[2]
|
||||
|
||||
# SSH to get list of existing files.
|
||||
p = subprocess.run(
|
||||
["ssh", ssh_machine, "find", ssh_firmware_dir, "-name", "\\*-unstable-v\\*"],
|
||||
capture_output=True,
|
||||
)
|
||||
if p.returncode != 0:
|
||||
print(p.stderr)
|
||||
return
|
||||
all_files = p.stdout.split(b"\n")
|
||||
|
||||
# Parse all files to organise into boards/date/version.
|
||||
boards = {}
|
||||
for file in all_files:
|
||||
m = re.match(
|
||||
rb"([a-z/.]+)/([A-Za-z0-9_-]+)-(20[0-9]{6})-unstable-(v[0-9.-]+-g[0-9a-f]+).",
|
||||
file,
|
||||
)
|
||||
if not m:
|
||||
continue
|
||||
dir, board, date, version = m.groups()
|
||||
if board not in boards:
|
||||
boards[board] = {}
|
||||
if (date, version) not in boards[board]:
|
||||
boards[board][(date, version)] = []
|
||||
boards[board][(date, version)].append(file)
|
||||
|
||||
# Collect files to remove based on date and version.
|
||||
remove = []
|
||||
for board in boards.values():
|
||||
filelist = [(date, version, files) for (date, version), files in board.items()]
|
||||
filelist.sort(reverse=True)
|
||||
keep = []
|
||||
for date, version, files in filelist:
|
||||
if keep and version == keep[-1]:
|
||||
remove.extend(files)
|
||||
elif len(keep) >= NUM_KEEP_PER_BOARD:
|
||||
remove.extend(files)
|
||||
else:
|
||||
keep.append(version)
|
||||
|
||||
if DEBUG:
|
||||
all_files.sort(reverse=True)
|
||||
for file in all_files:
|
||||
print(file, file in remove)
|
||||
print(len(remove), "/", len(all_files))
|
||||
|
||||
# Do removal of files.
|
||||
for file in remove:
|
||||
file = str(file, "ascii")
|
||||
print("remove:", file)
|
||||
if not DRY_RUN:
|
||||
p = subprocess.run(["ssh", ssh_machine, "/bin/rm", file], capture_output=True)
|
||||
if p.returncode != 0:
|
||||
print(p.stderr)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
Reference in New Issue
Block a user