Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
128 changes: 128 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,128 @@
name: CI

on:
push:
pull_request:
workflow_dispatch:
workflow_call:

jobs:
Build:
name: Build
runs-on: ubuntu-latest
env:
cross_dir: /opt/x-tools
strategy:
matrix:
include:
- name: arm64
triplet: aarch64-unknown-linux-musl
sha256: 28a1d26f14f8ddc3aed31f20705fe696777400eb5952d90470a7e6e2dd1175bb
- name: arm32
triplet: arm-unknown-linux-musleabi
sha256: 95ce1aaf65f87ccdf714591c1bc7700f894ede1c6d3521bcedeff3acde9732ba
- name: arm32hf
triplet: arm-unknown-linux-musleabihf
sha256: 2073af4caa8dd1898e16c87e02f8fb9c50c475b10a2d5306416e0c7891e201c6
- name: arm32v7
triplet: armv7-unknown-linux-musleabi
sha256: 2ff70f31b1e3b3708b1a7c48d846a5781917d85b49b90a3b75344e7bed2656e5
- name: arm32v7hf
triplet: armv7-unknown-linux-musleabihf
sha256: 741e421ac82d71797e3fce607b52ad31208c1de0f4b340b6fde3fb15adf53c61
- name: i586
triplet: i586-unknown-linux-musl
sha256: 6ed6b195c44ff91e4636680aaf860eb80b8a2a02b782e24b622c6c4c99726736
- name: i686
triplet: i686-unknown-linux-musl
sha256: 2595d247618bec5908c3e24516780e3343a0297b3b7e6dc70711ba75a62fc112
- name: loong64
triplet: loongarch64-unknown-linux-musl
sha256: 4d9cba898688732e0f01dc2b6281ac7d75f98d4e30e5ff8e0125dd9c139c2172
- name: m68k
triplet: m68k-unknown-linux-musl
sha256: 1a1965de969fac64fee85e0f2dabb59063a60cf6584f0cd521987c0d18480df5
- name: microblazeel
triplet: microblazeel-xilinx-linux-musl
sha256: 2ceb60b2e97cdd0c7cbd05d367d08deb24b54d34ef6030c70e3e2a1c57645476
- name: microblaze
triplet: microblaze-xilinx-linux-musl
sha256: 28a98391df1d4f095118226a2948c960c87f67f5e5e95b102277064813730e60
- name: mips64el
triplet: mips64el-unknown-linux-musl
sha256: e96ceb131679bc2bbbda8deb66373ced8d41f740cecb2b29ae2dfac5539967f8
- name: mips64
triplet: mips64-unknown-linux-musl
sha256: 2094bcee79a7538df552612be3b2280edb3ec731ffa29ae45c0df59a69c4dde4
- name: mips32el
triplet: mipsel-unknown-linux-musl
sha256: 55a8af3c96fb38a32e44733472d5cc80ad1c32fcf81b1c2bc134dc7beecd5f00
- name: mips32elsf
triplet: mipsel-unknown-linux-muslsf
sha256: 37a36a23b2f81eb3d2a83e0243c3734f1806b9531ed2cec7aa3a577645dea6d4
- name: mips32
triplet: mips-unknown-linux-musl
sha256: ecbf4616b8c71df1013f4148fe7969331f7e4a89bee2841c7c5c79e3cc094504
- name: mips32sf
triplet: mips-unknown-linux-muslsf
sha256: 3b37de77311f90b1d34091b6087b370d71e03c15b5e02ae0727a981e8df19b62
- name: or1k
triplet: or1k-unknown-linux-musl
sha256: 016bd3ba6ffa4b359808a6c76ca1932d974ba73ef070b6190c7291470ca2d441
- name: powerpc64
triplet: powerpc64-unknown-linux-musl
sha256: f0bfa604b5dd9072f2668bbd0df3c02f640d1249ada99bf8d5da5238654b993e
- name: powerpc64le
triplet: powerpc64le-unknown-linux-musl
sha256: d7dc51ee9379aa06c99f0ed3a20598bf94eb27b859ed1ea67ac4915d49d83fb3
- name: powerpc
triplet: powerpc-unknown-linux-musl
sha256: 3dceab6807ae8cbcc0b42e162f2da96172f1e524cf7ef706fe47f1238d4f6443
- name: powerpcle
triplet: powerpcle-unknown-linux-musl
sha256: 64a26ecd0c32a49193118aa6863e4c10a76649b7e265184552454caaaf03ae1a
- name: riscv32
triplet: riscv32-unknown-linux-musl
sha256: 178d6c1f540301a01053e5bbe37a8b6d16dd4cf6691eed672a215401c05adc71
- name: riscv64
triplet: riscv64-unknown-linux-musl
sha256: d95b6894aa55c53800ec37ba6932e540bc2e90ae0c02fb99284aa59f7fc85fb5
- name: s390x
triplet: s390x-ibm-linux-musl
sha256: f7a6788f6b371847c61a8444dd4cbdd90ce98f2d0e0a32b9e118b8acd59a584a
- name: sh4
triplet: sh4-multilib-linux-musl
sha256: 902cd30fd8ebd974d740cad19997c1958ac78bfebd7cb149f76525db311ca0df
- name: x86_64
triplet: x86_64-unknown-linux-musl
sha256: 6534870abd7dc327fd2e14cc53972d0552b21f47db5769505534f788537e3544
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 1
- name: Set up toolchain for ${{ matrix.name }}
run: |
CROSS_TOOLCHAIN_URL="https://github.com/cross-tools/musl-cross/releases/download/20250929/${{ matrix.triplet }}.tar.xz"

sudo mkdir -m 777 -p "${{ env.cross_dir }}"
cd "${{ env.cross_dir }}"
curl -Lfo "${{ matrix.triplet }}.tar.xz" "$CROSS_TOOLCHAIN_URL"
echo "${{ matrix.sha256 }} *${{ matrix.triplet }}.tar.xz" | sha256sum -c
tar xJf "${{ matrix.triplet }}.tar.xz"

- name: Build for ${{ matrix.name }}
run: |
CROSS_COMPILE="${{ env.cross_dir }}/${{ matrix.triplet }}/bin/${{ matrix.triplet }}-"

cd micropython
make -j$(nproc) compress STATIC=1 CROSS_COMPILE="$CROSS_COMPILE"
mkdir -p 'build/dist/natter'
cp -a build/compressed build/natter build/dist/natter

- name: Upload ${{ matrix.name }}
uses: actions/upload-artifact@v4
with:
name: natter-linux-${{ matrix.name }}
path: micropython/build/dist/natter
if-no-files-found: error
55 changes: 55 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
name: Release
run-name: Release ${{ github.event.inputs.version }}

on:
workflow_dispatch:
inputs:
version:
description: Version Number
type: string
required: true

jobs:
Build:
uses: ./.github/workflows/ci.yml

Release:
permissions:
contents: write
runs-on: ubuntu-latest
needs: Build
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 1
- name: Check version string
run: |
VERSION=$(python3 natter.py --version | cut -d' ' -f2)
test "$VERSION" = '${{ github.event.inputs.version }}' || {
echo "Version string mismatch: $VERSION != ${{ github.event.inputs.version }}" >&2
exit 1
}
- name: Download Artifact
uses: actions/download-artifact@v4
with:
path: ${{ github.workspace }}/artifacts
- name: Reorganize files
run: |
mkdir release
cd artifacts
chmod a+x */natter* */compressed/natter*
for triplet in *; do
tar czvf "../release/$triplet.tar.gz" "$triplet"
done
- name: Make a tag
run: |
git config user.name 'GitHub Actions'
git config user.email '41898282+github-actions[bot]@users.noreply.github.com'
git tag -a '${{ github.event.inputs.version }}' -m '${{ github.event.inputs.version }}'
git push origin '${{ github.event.inputs.version }}'
- name: Make a release
env:
GITHUB_TOKEN: ${{ github.token }}
run: |
gh release create --title 'v${{ github.event.inputs.version }}' --generate-notes --verify-tag '${{ github.event.inputs.version }}' natter.py release/*.tar.gz
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
/.vscode
/micropython/build
__pycache__
119 changes: 119 additions & 0 deletions micropython/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
include deps.mk

PROG := natter
BUILD_DIR := $(CURDIR)/build
PATCH_DIR := $(CURDIR)/patch
COMP_DIR := $(BUILD_DIR)/compressed
MP_TAR := $(BUILD_DIR)/$(MICROPYTHON_TARNAME)
MP_SRC := $(BUILD_DIR)/$(MICROPYTHON_DIRNAME)
MP_PACTHED := $(MP_SRC)/.patched
LXP_TAR := $(BUILD_DIR)/$(LXPACK_TARNAME)
LXP_SRC := $(BUILD_DIR)/$(LXPACK_DIRNAME)
PROG_BIN := $(BUILD_DIR)/$(PROG)
COMP_BIN := $(COMP_DIR)/$(PROG)

MP_MAKE_EXTRA := \
MICROPY_STANDALONE=1 \
MICROPY_PY_BTREE=0 \
MICROPY_PY_FFI=0 \
MICROPY_PY_SSL=0 \
MICROPY_PY_TERMIOS=0 \
MICROPY_SSL_MBEDTLS=0 \
MICROPY_USE_READLINE=0 \
MICROPY_VFS_FAT=0 \
MICROPY_VFS_LFS1=0 \
MICROPY_VFS_LFS2=0 \
MICROPY_GIT_TAG='v$(MICROPYTHON_VERSION)-natter' \
MICROPY_GIT_HASH='<no hash>' \
SOURCE_DATE_EPOCH=0 \
HELP_BUILD_ERROR=

ifdef CROSS_COMPILE
MP_MAKE_EXTRA := $(MP_MAKE_EXTRA) CROSS_COMPILE='$(CROSS_COMPILE)'
endif
ifdef DEBUG
MP_MAKE_EXTRA := $(MP_MAKE_EXTRA) DEBUG='$(DEBUG)'
endif
ifdef V
MP_MAKE_EXTRA := $(MP_MAKE_EXTRA) V='$(V)'
endif

MP_CFLAGS_EXTRA := \
-frandom-seed=natter \
-Wdate-time \
-Wno-error=clobbered \
-DMICROPY_PY_SYS_TRACEBACKLIMIT=1 \
-DMICROPY_PY_RE_MATCH_GROUPS=1 \
-DMICROPY_PY_RE_MATCH_SPAN_START_END=1 \
-DMICROPY_NLR_SETJMP=1

ifeq ($(findstring m68k,$(shell $(CROSS_COMPILE)gcc -dumpmachine)),m68k)
MP_CFLAGS_EXTRA := $(MP_CFLAGS_EXTRA) -malign-int
endif

ifeq ($(STATIC),1)
MP_LDFLAGS_EXTRA := -static
endif

all: $(PROG_BIN)

download: $(MP_TAR) $(LXP_TAR)

compress: $(COMP_BIN)

clean:
$(RM) -r '$(MP_SRC)' '$(LXP_SRC)' '$(COMP_DIR)' '$(PROG_BIN)'

distclean:
$(RM) -r '$(BUILD_DIR)'

$(MP_TAR):
mkdir -p '$(BUILD_DIR)'
curl -Lfo '$@' '$(MICROPYTHON_SRCURL)'
echo '$(MICROPYTHON_SHA256) *$@' | sha256sum -c -

$(LXP_TAR):
mkdir -p '$(BUILD_DIR)'
curl -Lfo '$@' '$(LXPACK_SRCURL)'
echo '$(LXPACK_SHA256) *$@' | sha256sum -c -

untar: $(MP_TAR) $(LXP_TAR)
rm -rf '$(MP_SRC)' '$(LXP_SRC)'
cd '$(BUILD_DIR)' && tar xJf '$(MP_TAR)'
cd '$(BUILD_DIR)' && tar xJf '$(LXP_TAR)'

$(MP_PACTHED): $(wildcard $(PATCH_DIR)/*.patch)
test -d '$(MP_SRC)' || $(MAKE) untar
find '$(MP_SRC)' -type f -name '*.orig' -exec sh -c 'mv "$$1" "$${1%.orig}"' _ {} \;
for p in '$(PATCH_DIR)'/*.patch; do \
cd '$(MP_SRC)' && patch -bp1 < "$$p"; \
done
touch '$@'

patch: $(MP_PACTHED)

mpy_cross: $(MP_PACTHED)
$(MAKE) -C '$(MP_SRC)/mpy-cross' \
PROG=mpy-cross \
CROSS_COMPILE= \
CFLAGS_EXTRA= \
LDFLAGS_EXTRA=

$(PROG_BIN): mpy_cross
$(MAKE) -C '$(MP_SRC)/ports/unix' install \
VARIANT=standard \
BINDIR='$(BUILD_DIR)' \
PROG='$(PROG)' \
FROZEN_MANIFEST='$(CURDIR)/pymodule/_manifest.py' \
USER_C_MODULES='$(CURDIR)/cmodule' \
CFLAGS_EXTRA='$(MP_CFLAGS_EXTRA)' \
LDFLAGS_EXTRA='$(MP_LDFLAGS_EXTRA)' \
$(MP_MAKE_EXTRA)

$(COMP_BIN): $(PROG_BIN)
test -d '$(LXP_SRC)' || $(MAKE) untar
$(MAKE) -C '$(LXP_SRC)' install \
BINDIR='$(COMP_DIR)' \
PAYLOAD='$(PROG_BIN)'

.PHONY: all download untar patch mpy_cross compress clean
3 changes: 3 additions & 0 deletions micropython/cmodule/_posix/micropython.mk
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
UNIXAPI_MOD_DIR := $(USERMOD_DIR)
SRC_USERMOD += $(UNIXAPI_MOD_DIR)/mod_posix.c
CFLAGS_USERMOD += -I$(UNIXAPI_MOD_DIR)
Loading