cibuildmp 0.4.0__tar.gz → 0.4.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (233) hide show
  1. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/.github/dependabot.yml +30 -4
  2. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/.github/workflows/publish-docker-images.yml +39 -0
  3. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/.github/workflows/publish.yml +17 -5
  4. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/.github/workflows/test-all-platforms.yml +20 -5
  5. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/.github/workflows/test-platforms.yml +12 -0
  6. cibuildmp-0.4.2/.github/workflows/test-upstream-natmod.yml +131 -0
  7. cibuildmp-0.4.2/.github/workflows/test-upstream-usermodule.yml +241 -0
  8. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/CHANGELOG.md +109 -1
  9. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/CLAUDE.md +27 -0
  10. cibuildmp-0.4.2/CONTRIBUTING.md +87 -0
  11. {cibuildmp-0.4.0/src/cibuildmp.egg-info → cibuildmp-0.4.2}/PKG-INFO +59 -35
  12. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/README.md +58 -34
  13. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/docker/manylinux_2_28_aarch64.Dockerfile +1 -1
  14. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/docker/manylinux_2_28_i686.Dockerfile +1 -1
  15. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/docker/manylinux_2_28_ppc64le.Dockerfile +1 -1
  16. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/docker/manylinux_2_28_s390x.Dockerfile +1 -1
  17. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/docker/manylinux_2_28_x86_64.Dockerfile +1 -1
  18. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/docker/pypa-tracker.Dockerfile +9 -9
  19. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/docker/windows.Dockerfile +2 -0
  20. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/docs/0000-TRACKER.md +74 -46
  21. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/docs/ACTIONS.md +2 -2
  22. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/docs/records/0022-zephyr-third-selector-axis.md +10 -3
  23. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/docs/records/0038-m5-adopt-in-three-repos.md +32 -5
  24. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/docs/records/0046-pin-staleness-checker.md +26 -1
  25. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/docs/records/0054-usermod-example-from-upstream-usercmodule.md +67 -11
  26. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/docs/records/0055-natmod-example-from-upstream-natmod.md +59 -4
  27. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/docs/records/0059-ghcr-untagged-cleanup-deletes-referenced-manifests.md +25 -0
  28. cibuildmp-0.4.2/docs/records/0068-docker-dependabot-grouping-and-mipsel-ubuntu-26-04.md +181 -0
  29. cibuildmp-0.4.2/docs/records/0069-upstream-usercmodule-narrow-ci-slice.md +278 -0
  30. cibuildmp-0.4.2/docs/records/0070-unix-collected-binary-missing-repaired-lib-sidecar.md +77 -0
  31. cibuildmp-0.4.2/docs/records/0071-micropython-placeholder-in-user-c-modules.md +85 -0
  32. cibuildmp-0.4.2/docs/records/0072-natmod-micropython-placeholder-and-upstream-natmod-ci.md +180 -0
  33. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/docs/reference/design.md +57 -55
  34. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/docs/reference/open-questions.md +2 -2
  35. cibuildmp-0.4.2/docs/reference/vendored-images.md +175 -0
  36. cibuildmp-0.4.2/examples/natmod/cibuildmp.toml +62 -0
  37. cibuildmp-0.4.2/examples/usercmodule/cibuildmp.toml +60 -0
  38. cibuildmp-0.4.2/examples/usercmodule/micropython.cmake +36 -0
  39. cibuildmp-0.4.2/examples/usercmodule/smoke_test.py +40 -0
  40. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/src/cibuildmp/platforms/natmod/__init__.py +18 -1
  41. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/src/cibuildmp/platforms/natmod/build.py +19 -6
  42. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/src/cibuildmp/platforms/usermod/orchestrate.py +38 -1
  43. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/src/cibuildmp/resources/pinned_docker_images.toml +24 -24
  44. cibuildmp-0.4.2/src/cibuildmp/resources/pinned_pypa_images.toml +81 -0
  45. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/src/cibuildmp/sources.py +12 -0
  46. {cibuildmp-0.4.0 → cibuildmp-0.4.2/src/cibuildmp.egg-info}/PKG-INFO +59 -35
  47. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/src/cibuildmp.egg-info/SOURCES.txt +13 -0
  48. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/src/cibuildmp.egg-info/scm_file_list.json +13 -0
  49. cibuildmp-0.4.2/src/cibuildmp.egg-info/scm_version.json +8 -0
  50. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/tests/test_build.py +27 -0
  51. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/tests/test_cli.py +29 -0
  52. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/tests/test_usermod_orchestrate.py +106 -0
  53. cibuildmp-0.4.0/src/cibuildmp/resources/pinned_pypa_images.toml +0 -81
  54. cibuildmp-0.4.0/src/cibuildmp.egg-info/scm_version.json +0 -8
  55. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/.dockerignore +0 -0
  56. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/.github/actions/build-natmod/action.yml +0 -0
  57. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/.github/actions/build-usermod-armv7m/action.yml +0 -0
  58. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/.github/actions/build-usermod-esp32/action.yml +0 -0
  59. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/.github/actions/build-usermod-rp2040/action.yml +0 -0
  60. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/.github/actions/build-usermod-unix/action.yml +0 -0
  61. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/.github/actions/build-usermod-webassembly/action.yml +0 -0
  62. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/.github/actions/build-usermod-windows/action.yml +0 -0
  63. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/.github/actions/clone-micropython/action.yml +0 -0
  64. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/.github/actions/fetch-micropython/action.yml +0 -0
  65. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/.github/workflows/build-examples.yml +0 -0
  66. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/.github/workflows/tests.yml +0 -0
  67. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/.github/workflows/verify-docker-images.yml +0 -0
  68. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/.gitignore +0 -0
  69. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/LICENSE +0 -0
  70. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/action.yml +0 -0
  71. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/bin/ghcr_prune_scan.py +0 -0
  72. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/bin/plan_test_matrix.py +0 -0
  73. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/bin/publish_images.py +0 -0
  74. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/bin/refresh_natmod_archs.py +0 -0
  75. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/bin/refresh_usermod_boards.py +0 -0
  76. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/bin/render_test_summary.py +0 -0
  77. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/bin/update_docker.py +0 -0
  78. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/cibuildmp.toml +0 -0
  79. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/docker/arm_embedded.Dockerfile +0 -0
  80. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/docker/esp_idf_base.Dockerfile +0 -0
  81. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/docker/manylinux_2_39_mipsel.Dockerfile +0 -0
  82. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/docker/natmod_host.Dockerfile +0 -0
  83. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/docker/ppc64le_linux.Dockerfile +0 -0
  84. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/docker/riscv_embedded.Dockerfile +0 -0
  85. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/docker/webassembly.Dockerfile +0 -0
  86. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/docker/xtensa_esp.Dockerfile +0 -0
  87. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/docker/xtensa_lx106.Dockerfile +0 -0
  88. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/docs/BACKLOG.md +0 -0
  89. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/docs/records/0001-natmod-first.md +0 -0
  90. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/docs/records/0002-delegate-compile-own-environment.md +0 -0
  91. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/docs/records/0003-toolchain-resolution-per-target.md +0 -0
  92. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/docs/records/0004-config-file-location.md +0 -0
  93. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/docs/records/0005-one-identifier-namespace.md +0 -0
  94. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/docs/records/0006-no-test-runners-phase1.md +0 -0
  95. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/docs/records/0007-usermod-vendors-mpbuild-board-db.md +0 -0
  96. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/docs/records/0008-tool-distribution-deferred.md +0 -0
  97. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/docs/records/0009-one-job-loop-fanout-opt-in.md +0 -0
  98. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/docs/records/0010-pinned-data-in-resources.md +0 -0
  99. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/docs/records/0011-one-repo-absorbs-micropython-native-ci.md +0 -0
  100. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/docs/records/0012-pyelftools-ar-own-deps.md +0 -0
  101. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/docs/records/0013-micropython-list-dedup-by-abi.md +0 -0
  102. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/docs/records/0014-mip-package-per-identifier.md +0 -0
  103. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/docs/records/0015-rv32imc-arch-flags-identifier.md +0 -0
  104. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/docs/records/0016-usermod-user-c-modules-dir-vs-cmake.md +0 -0
  105. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/docs/records/0017-usermod-frozen-manifest-merge.md +0 -0
  106. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/docs/records/0018-windows-provisioning-fourth-story.md +0 -0
  107. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/docs/records/0019-esp-idf-provisioning-heaviest.md +0 -0
  108. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/docs/records/0020-usermod-runner-selection-structural.md +0 -0
  109. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/docs/records/0021-usermod-execution-central-value.md +0 -0
  110. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/docs/records/0023-usermod-identifier-scheme-config-output.md +0 -0
  111. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/docs/records/0024-unix-armhf-mipsel-cross-compiles.md +0 -0
  112. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/docs/records/0025-dockerfiles-bake-unix-cross-toolchains.md +0 -0
  113. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/docs/records/0026-one-docker-image-per-port.md +0 -0
  114. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/docs/records/0027-orchestrate-output-dir-and-exec-bit-fixes.md +0 -0
  115. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/docs/records/0028-container-per-port-migration-plan.md +0 -0
  116. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/docs/records/0029-github-actions-job-summary.md +0 -0
  117. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/docs/records/0030-container-approach-natmod-and-docker-vs-qemu.md +0 -0
  118. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/docs/records/0031-unix-musllinux-libc-axis.md +0 -0
  119. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/docs/records/0032-unix-docker-default-and-webassembly-wiring.md +0 -0
  120. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/docs/records/0033-cibuildmp-never-builds-docker-image-itself.md +0 -0
  121. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/docs/records/0034-m0-skeleton.md +0 -0
  122. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/docs/records/0035-m1-micropython-mpy-cross-provisioning.md +0 -0
  123. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/docs/records/0036-m2-toolchain-resolver.md +0 -0
  124. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/docs/records/0037-m3-the-build-itself.md +0 -0
  125. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/docs/records/0039-usermod-composite-actions-status.md +0 -0
  126. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/docs/records/0040-usermod-tests-deferred.md +0 -0
  127. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/docs/records/0041-docs-restructure.md +0 -0
  128. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/docs/records/0042-windows-docker-wiring-and-resolver-removal.md +0 -0
  129. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/docs/records/0043-unix-adopts-cibuildwheel-native-image-model.md +0 -0
  130. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/docs/records/0044-unix-native-images-landed.md +0 -0
  131. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/docs/records/0045-only-is-a-filter-not-a-forced-identifier.md +0 -0
  132. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/docs/records/0047-run-output-parity-with-cibuildwheel.md +0 -0
  133. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/docs/records/0048-build-skip-live-in-opposite-tables.md +0 -0
  134. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/docs/records/0049-no-matrix-generation-archs-vocabulary.md +0 -0
  135. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/docs/records/0050-natmod-is-docker-only.md +0 -0
  136. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/docs/records/0051-usermod-identifiers-have-no-version-axis.md +0 -0
  137. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/docs/records/0052-config-is-a-tree-not-a-selector-matrix.md +0 -0
  138. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/docs/records/0053-usermod-ports-without-a-build-driver.md +0 -0
  139. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/docs/records/0056-usermod-with-no-user-c-module.md +0 -0
  140. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/docs/records/0057-multiple-modules-per-build.md +0 -0
  141. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/docs/records/0058-image-groups-are-toolchains-not-ports.md +0 -0
  142. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/docs/records/0060-rp2-build-driver.md +0 -0
  143. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/docs/records/0061-usermod-build-drivers-split-per-port.md +0 -0
  144. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/docs/records/0062-test-platforms-per-port-orchestrator.md +0 -0
  145. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/docs/records/0063-keep-going-and-json-build-report.md +0 -0
  146. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/docs/records/0065-bucketed-test-matrix-planning.md +0 -0
  147. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/docs/records/0066-extra-cmake-args.md +0 -0
  148. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/docs/records/0067-user-c-modules-flat-shape-autodetect.md +0 -0
  149. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/examples/template/cibuildmp.toml +0 -0
  150. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/examples/template/micropython.cmake +0 -0
  151. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/examples/template/natmod/Makefile +0 -0
  152. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/examples/template/natmod/template.c +0 -0
  153. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/examples/template/src/facade.py +0 -0
  154. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/examples/template/src/template_core.c +0 -0
  155. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/examples/template/src/template_core.h +0 -0
  156. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/examples/template/usermod/manifest.py +0 -0
  157. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/examples/template/usermod/micropython.mk +0 -0
  158. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/examples/template/usermod/template_usermod.c +0 -0
  159. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/examples/wasm2mpy/Makefile +0 -0
  160. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/examples/wasm2mpy/NOTICE +0 -0
  161. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/examples/wasm2mpy/cibuildmp.toml +0 -0
  162. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/examples/wasm2mpy/runtime/esp8266-rom.S +0 -0
  163. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/examples/wasm2mpy/runtime/libc.c +0 -0
  164. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/examples/wasm2mpy/runtime/runtime.c +0 -0
  165. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/examples/wasm2mpy/runtime/wasm-rt-impl-tableops.inc +0 -0
  166. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/examples/wasm2mpy/runtime/wasm-rt-impl.c +0 -0
  167. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/examples/wasm2mpy/runtime/wasm-rt-impl.h +0 -0
  168. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/examples/wasm2mpy/runtime/wasm-rt-mem-impl-helper.inc +0 -0
  169. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/examples/wasm2mpy/runtime/wasm-rt-mem-impl.c +0 -0
  170. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/examples/wasm2mpy/runtime/wasm-rt.h +0 -0
  171. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/examples/wasm2mpy/test/zig.wasm +0 -0
  172. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/pyproject.toml +0 -0
  173. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/setup.cfg +0 -0
  174. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/src/cibuildmp/__init__.py +0 -0
  175. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/src/cibuildmp/__main__.py +0 -0
  176. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/src/cibuildmp/cli.py +0 -0
  177. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/src/cibuildmp/dockerrun.py +0 -0
  178. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/src/cibuildmp/options.py +0 -0
  179. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/src/cibuildmp/platforms/__init__.py +0 -0
  180. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/src/cibuildmp/platforms/natmod/options.py +0 -0
  181. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/src/cibuildmp/platforms/natmod/targets.py +0 -0
  182. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/src/cibuildmp/platforms/usermod/__init__.py +0 -0
  183. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/src/cibuildmp/platforms/usermod/boards.py +0 -0
  184. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/src/cibuildmp/platforms/usermod/build_common.py +0 -0
  185. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/src/cibuildmp/platforms/usermod/build_esp32.py +0 -0
  186. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/src/cibuildmp/platforms/usermod/build_qemu.py +0 -0
  187. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/src/cibuildmp/platforms/usermod/build_rp2.py +0 -0
  188. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/src/cibuildmp/platforms/usermod/build_unix.py +0 -0
  189. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/src/cibuildmp/platforms/usermod/build_webassembly.py +0 -0
  190. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/src/cibuildmp/platforms/usermod/build_windows.py +0 -0
  191. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/src/cibuildmp/platforms/usermod/espidf.py +0 -0
  192. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/src/cibuildmp/platforms/usermod/manifests.py +0 -0
  193. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/src/cibuildmp/platforms/usermod/options.py +0 -0
  194. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/src/cibuildmp/platforms/usermod/portinfo.py +0 -0
  195. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/src/cibuildmp/platforms/usermod/targets.py +0 -0
  196. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/src/cibuildmp/report.py +0 -0
  197. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/src/cibuildmp/resources/build-platforms.toml +0 -0
  198. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/src/cibuildmp/resources/natmod.toml +0 -0
  199. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/src/cibuildmp/resources/usermod.toml +0 -0
  200. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/src/cibuildmp/resources.py +0 -0
  201. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/src/cibuildmp/selector.py +0 -0
  202. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/src/cibuildmp/stepsummary.py +0 -0
  203. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/src/cibuildmp.egg-info/dependency_links.txt +0 -0
  204. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/src/cibuildmp.egg-info/entry_points.txt +0 -0
  205. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/src/cibuildmp.egg-info/requires.txt +0 -0
  206. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/src/cibuildmp.egg-info/top_level.txt +0 -0
  207. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/tests/conftest.py +0 -0
  208. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/tests/test_boards.py +0 -0
  209. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/tests/test_cli_multi_family.py +0 -0
  210. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/tests/test_espidf.py +0 -0
  211. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/tests/test_manifests.py +0 -0
  212. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/tests/test_options.py +0 -0
  213. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/tests/test_options_cascade.py +0 -0
  214. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/tests/test_overrides.py +0 -0
  215. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/tests/test_plan_test_matrix.py +0 -0
  216. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/tests/test_portinfo.py +0 -0
  217. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/tests/test_render_test_summary.py +0 -0
  218. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/tests/test_report.py +0 -0
  219. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/tests/test_selector.py +0 -0
  220. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/tests/test_sources.py +0 -0
  221. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/tests/test_stepsummary.py +0 -0
  222. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/tests/test_targets.py +0 -0
  223. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/tests/test_usermod_build_common.py +0 -0
  224. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/tests/test_usermod_build_esp32.py +0 -0
  225. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/tests/test_usermod_build_qemu.py +0 -0
  226. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/tests/test_usermod_build_rp2.py +0 -0
  227. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/tests/test_usermod_build_unix.py +0 -0
  228. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/tests/test_usermod_build_webassembly.py +0 -0
  229. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/tests/test_usermod_build_windows.py +0 -0
  230. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/tests/test_usermod_dockerrun.py +0 -0
  231. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/tests/test_usermod_options.py +0 -0
  232. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/tests/test_usermod_targets.py +0 -0
  233. {cibuildmp-0.4.0 → cibuildmp-0.4.2}/uv.lock +0 -0
@@ -42,11 +42,37 @@ updates:
42
42
  # 0033), since a new base can mean a new libc floor, not just routine
43
43
  # hygiene.
44
44
  #
45
- # `ubuntu:24.04` is out of scope on purpose: every Dockerfile that uses
46
- # it names a floating tag, not a digest, and Dependabot's docker
47
- # ecosystem has nothing to compare a floating tag against. Digest-pinning
48
- # cibuildmp's own base images is a separate decision, not yet made.
45
+ # `ubuntu:24.04` was assumed out of scope here -- a floating tag, and
46
+ # Dependabot's docker ecosystem "has nothing to compare a floating tag
47
+ # against" was this comment's own reasoning until 2026-08-29. Wrong:
48
+ # Dependabot proposed `ubuntu:24.04` -> `26.04` in its very first grouped
49
+ # bump (PR #16), and CI caught the reason this needed a human first --
50
+ # `manylinux_2_39_mipsel.Dockerfile`'s apt-based mipsel cross-toolchain
51
+ # doesn't exist on 26.04's archive at all (Debian dropped the mipsel
52
+ # port in Trixie). See docs/records/0068 for the full incident.
49
53
  - package-ecosystem: "docker"
50
54
  directory: "/docker"
51
55
  schedule:
52
56
  interval: "weekly"
57
+ # Six of the Dockerfiles under here pin a real digest (five
58
+ # `manylinux_2_28_*` arches + `pypa-tracker`), each under a differently
59
+ # named `quay.io/pypa/...` image -- to Dependabot that's six distinct
60
+ # dependencies, so without a group a single upstream pypa bump opened
61
+ # six separate PRs instead of landing as one. Same fix as the
62
+ # github-actions entry above: one group, one PR per scan regardless of
63
+ # how many of the pinned images moved.
64
+ #
65
+ # `ubuntu` is deliberately excluded from that group (record 0068): a
66
+ # base-OS major-version bump is not routine hygiene the way a same-name
67
+ # pypa digest republish is, and grouping the two together is exactly
68
+ # what let a real break (see above) ride in on the back of nine safe
69
+ # bumps in one PR with no way to accept one without the other. Excluded
70
+ # from the group, not ignored outright -- `ubuntu` still gets its own
71
+ # PR (one, since every Dockerfile referencing it collapses onto the one
72
+ # dependency name already), just never sharing one with pypa's own.
73
+ groups:
74
+ docker-images:
75
+ patterns:
76
+ - "*"
77
+ exclude-patterns:
78
+ - "ubuntu"
@@ -143,6 +143,45 @@ jobs:
143
143
  username: ${{ github.actor }}
144
144
  password: ${{ github.token }}
145
145
 
146
+ # [0059]'s own incident, made preventable rather than just documented:
147
+ # the build-push step below always pushes `:latest`, so the instant it
148
+ # lands, whatever `:latest` pointed to before becomes untagged -- an
149
+ # OCI index with no tag of its own is exactly what GHCR's "delete
150
+ # untagged versions" cleanup cannot tell apart from real garbage, and
151
+ # that cleanup already deleted seven of fifteen published images once
152
+ # (record 0059), the pin itself never touched. Retagging the digest
153
+ # `resources/pinned_docker_images.toml` still names -- the one a real
154
+ # build still depends on until a maintainer's own PR repoints it --
155
+ # under a name derived from that same digest closes the window: it
156
+ # keeps its own tag no matter where `:latest` moves next, so a cleanup
157
+ # run in between publishing and repinning has nothing untagged to find.
158
+ # No-op (imagetools create is idempotent) if this tag already exists,
159
+ # and non-fatal if there is nothing pinned yet for a brand-new group.
160
+ - name: Preserve the digest :latest is about to leave behind
161
+ if: >-
162
+ github.event.inputs.only == ''
163
+ || contains(
164
+ format(',{0},', github.event.inputs.only),
165
+ format(',{0},', matrix.image)
166
+ )
167
+ run: |
168
+ set -euo pipefail
169
+ CURRENT=$(python3 -c "
170
+ import tomllib
171
+ with open('src/cibuildmp/resources/pinned_docker_images.toml', 'rb') as f:
172
+ data = tomllib.load(f)
173
+ print(data.get('image_group', {}).get('${{ matrix.image }}', ''))
174
+ ")
175
+ if [[ "$CURRENT" != ghcr.io/* ]]; then
176
+ echo "No existing ghcr.io pin for ${{ matrix.image }} yet -- nothing to preserve."
177
+ exit 0
178
+ fi
179
+ DIGEST="${CURRENT#*@sha256:}"
180
+ docker buildx imagetools create \
181
+ --tag "ghcr.io/${{ github.repository_owner }}/${{ matrix.image }}:pre-${DIGEST:0:12}" \
182
+ "$CURRENT" \
183
+ || echo "::warning::could not preserve the previous digest for ${{ matrix.image }} -- it may already be gone"
184
+
146
185
  - name: Build and push docker/${{ matrix.image }}.Dockerfile
147
186
  id: push
148
187
  # The `only` input, on each step rather than on the job.
@@ -23,11 +23,14 @@ on:
23
23
  type: string
24
24
  default: ""
25
25
 
26
- # pull_request here is deliberately build-only: none of the deploy job's environment/if:
27
- # conditions match a pull_request event, so no publish permissions are ever granted or used.
28
- # It exists so a packaging change (a missing resources/*.toml in the wheel, a metadata error
29
- # twine rejects) surfaces on the PR instead of at release time, when the version number is
30
- # already spent — PyPI will not let the same version be uploaded twice, even after a delete.
26
+ # pull_request here is deliberately build-only: the `build` job (lint, type check, test,
27
+ # `uv build`, `twine check`) still runs, so a packaging change (a missing resources/*.toml in
28
+ # the wheel, a metadata error twine rejects) surfaces on the PR instead of at release time, when
29
+ # the version number is already spent — PyPI will not let the same version be uploaded twice,
30
+ # even after a delete. `deploy` itself does not run at all on pull_request (see its own `if:`) --
31
+ # every one of its steps was already gated behind `push`/`workflow_dispatch`, so it never granted
32
+ # or used publish permissions here, only paid for a checkout that could flake and had nothing to
33
+ # show for succeeding either way.
31
34
  run-name: >
32
35
  Build & Publish → ${{ github.event_name == 'push' && 'PyPI' ||
33
36
  github.event_name == 'workflow_dispatch' && inputs.testpypi && 'TestPyPI' ||
@@ -119,6 +122,15 @@ jobs:
119
122
 
120
123
  deploy:
121
124
  needs: [build]
125
+ # Every real step below is already gated to `push` (real PyPI) or an
126
+ # opt-in `workflow_dispatch` (TestPyPI) -- on a `pull_request` event
127
+ # every one of them was already a no-op (see the comment on the
128
+ # workflow's own `pull_request` trigger above), so the job itself
129
+ # skipped doing anything real while still paying for a checkout that
130
+ # could flake and turn an unrelated PR red for a job that accomplished
131
+ # nothing on it either way. Confirmed live: exactly that happened on
132
+ # this repo's own PR #17.
133
+ if: github.event_name != 'pull_request'
122
134
  runs-on: ubuntu-latest
123
135
  outputs:
124
136
  tag: ${{ steps.meta.outputs.tag }}
@@ -23,11 +23,16 @@ name: Test platforms
23
23
  # first place -- not upload order, not sorted (docs/records/0065).
24
24
 
25
25
  on:
26
- pull_request:
27
- paths-ignore:
28
- - "**.md"
29
- - "docs/**"
30
- - "LICENSE"
26
+ # No `pull_request` any more: the full real matrix (200+ identifiers,
27
+ # bucketed across up to 20 concurrent jobs) takes far too long to run on
28
+ # every PR for how rarely its answer actually changes -- `push`/`pull_request`
29
+ # CI already runs `tests.yml`'s own unit suite and `build-examples.yml`'s
30
+ # narrower matrix on every change; this file is for the full sweep,
31
+ # wanted only occasionally, not gating every PR's own turnaround time.
32
+ # Weekly by default -- change the cron below, or just run
33
+ # `workflow_dispatch` by hand whenever a real answer is wanted sooner.
34
+ schedule:
35
+ - cron: "0 3 * * 0"
31
36
  workflow_dispatch:
32
37
  inputs:
33
38
  build:
@@ -50,6 +55,12 @@ concurrency:
50
55
 
51
56
  jobs:
52
57
  plan:
58
+ # No `if: github.actor != 'dependabot[bot]'` guard here any more --
59
+ # record 0068 added it specifically for the `pull_request` trigger a
60
+ # Dependabot docker/dependabot.yml PR would otherwise fire this on;
61
+ # dropping that trigger entirely (this file's own header comment) makes
62
+ # the guard moot, not just redundant, since `schedule`/`workflow_dispatch`
63
+ # never runs as that actor in the first place.
53
64
  runs-on: ubuntu-latest
54
65
  outputs:
55
66
  identifiers: ${{ steps.plan.outputs.identifiers }}
@@ -115,6 +126,10 @@ jobs:
115
126
  # passed back through `build`'s own outputs.
116
127
  aggregate-results:
117
128
  needs: [plan, build]
129
+ # `always()`: render a summary even if a bucket in `build` failed --
130
+ # `test-platforms.yml`'s own `--keep-going` (record 0063) means a real
131
+ # failure there still uploads a report, and this is what turns every
132
+ # bucket's own report into the one table worth looking at.
118
133
  if: always()
119
134
  runs-on: ubuntu-latest
120
135
  steps:
@@ -86,6 +86,18 @@ jobs:
86
86
  # Job-level, not set on the `uses: ./` step itself -- a composite
87
87
  # action's own inner steps are only guaranteed to see `env:` declared
88
88
  # at job/workflow level, not on the specific step that calls `uses:`.
89
+ #
90
+ # Every value below is a plain literal or references only `inputs.*`/
91
+ # `env.*` -- deliberately. `.github/workflows/test-upstream-usermodule.yml`
92
+ # (docs/records/0069) tried putting a `${{ runner.temp }}`- and then a
93
+ # `${{ github.workspace }}`-based expression in a job-level `env:` value
94
+ # here and got a genuine "invalid workflow file" both times (zero jobs
95
+ # ever created) -- confirmed live, twice, but *which* part of that shape
96
+ # GitHub's schema actually rejects was not pinned down with real
97
+ # confidence (0069's own addendum has the detail and the open question).
98
+ # Until that is resolved elsewhere, treat a runner-scoped context
99
+ # (`runner.*`, and possibly `github.workspace`) in a job-level `env:`
100
+ # value as unproven here, not safe to copy.
89
101
  env:
90
102
  CIBMP_VERSION: 0.0.0-ci
91
103
  # A real env var, not routed through the `skip:` input/`action.yml`'s
@@ -0,0 +1,131 @@
1
+ name: Test upstream natmod
2
+
3
+ # Builds every one of MicroPython's own eleven `examples/natmod/*` modules
4
+ # through cibuildmp's real natmod path -- docs/records/0055 scoped why this
5
+ # fixture matters (it tests upstream's own natmod contract, not the one this
6
+ # project wrote for itself in `examples/template/natmod`) and found that
7
+ # contract does not fit unmodified; docs/records/0072 is the mechanism
8
+ # actually landed here and explains every choice below in full.
9
+ #
10
+ # build-features0: one job, deliberately building *two* arches for the same
11
+ # tag in a single invocation, not two separate single-arch jobs: [0055]'s own
12
+ # guard survey is entirely about what happens when cibuildmp builds several
13
+ # targets back to back in one checkout (a stale artifact, or an unscoped
14
+ # `build/`, silently carrying the *previous* target's binary into the next
15
+ # one's output) -- a job that only ever builds one target at a time would
16
+ # never actually exercise that risk. `verify_output()` (build.py, already
17
+ # part of every real build) is the check that would catch it: a wrong arch
18
+ # code in the .mpy header fails the build outright rather than shipping
19
+ # silently wrong -- but `examples/natmod/cibuildmp.toml`'s own
20
+ # `pre-build-command` (record 0072) removes the possibility structurally,
21
+ # for this same reason armv7emsp is a second *real* cross-compiled arch here
22
+ # and not just a second easy one: it shares this checkout and this same
23
+ # invocation with x64, the one thing a single-arch job can never test.
24
+ #
25
+ # build-upstream-natmod: the other ten modules, one `x64` build each (no
26
+ # arch-collision risk to re-prove per module -- that mechanism is
27
+ # `examples/natmod/cibuildmp.toml`'s own, verified once above, not a
28
+ # property of any one module's Makefile). `CIBMP_MODULE_DIR` overrides that
29
+ # file's own `features0` default per matrix entry -- `{micropython}` resolves
30
+ # the same way regardless of which layer supplied `module-dir` (record 0072).
31
+ # `btree` needs no `micropython-submodules` entry for its own
32
+ # `lib/berkeley-db-1.xx`: `sources.fetch_micropython()` prefers the release
33
+ # tarball, which already vendors every `lib/` submodule -- confirmed 2026-08-31
34
+ # against a real, tarball-fetched v1.29.0 checkout, on the bare host (no
35
+ # Docker in that session), building and `verify_output()`-checking all eleven
36
+ # modules for `x64` -- not assumed from [0055]'s own original, narrower
37
+ # "needs a submodule" citation (see docs/records/0072's own addendum).
38
+ #
39
+ # `examples/natmod/cibuildmp.toml` carries the whole mechanism otherwise --
40
+ # `make-target = "all"` (upstream's examples define no `dist` target at all)
41
+ # and its own `pre-build-command` clearing every `.mpy` plus the whole build
42
+ # tree before *every single* build. No job here sets either directly -- a
43
+ # bare `cibuildmp examples/natmod --build <identifier>` run, CI or local,
44
+ # resolves identically to what a job here does (module-dir aside, for the
45
+ # ten `CIBMP_MODULE_DIR`-overridden ones).
46
+ #
47
+ # No `docker/setup-qemu-action` needed anywhere here, unlike
48
+ # test-upstream-usermodule.yml's rp2/esp32/qemu legs: `dockerrun.platform_for()`
49
+ # resolves every non-`unix` port -- natmod included -- to a flat
50
+ # `linux/amd64`, confirmed directly against that function's own source, so
51
+ # every natmod image already runs native on a `ubuntu-latest` runner
52
+ # regardless of which arch's toolchain it carries.
53
+ #
54
+ # push: (no branches: filter), same reasoning build-examples.yml's own header
55
+ # already documents -- this needs to run on every push to a dev branch too.
56
+
57
+ on:
58
+ push:
59
+ pull_request:
60
+ paths-ignore:
61
+ - "**.md"
62
+ - "docs/**"
63
+ - "LICENSE"
64
+ workflow_dispatch:
65
+
66
+ concurrency:
67
+ group: test-upstream-natmod-${{ github.workflow }}-${{ github.ref }}
68
+ cancel-in-progress: true
69
+
70
+ env:
71
+ # Single source of truth for this job -- bump here, not by hand in the
72
+ # `build` line below, when this fixture moves to a newer tag. `mpy6.3`
73
+ # is that tag's own natmod ABI (`identifier_format = "mpy{mpy}-{tag}-
74
+ # {arch}"`, resources/build-platforms.toml), not an independent value --
75
+ # a tag bump that also changes ABI needs this updated too.
76
+ CIBMP_UPSTREAM_ABI_TAG: mpy6.3-v1.29.0
77
+
78
+ jobs:
79
+ # x64: a plain native arch, no cross-compiler at all (`images.x64 =
80
+ # "natmod_host"`) -- the cheapest possible leg.
81
+ #
82
+ # armv7emsp: a real cross-compiled arch (`arm-none-eabi-`, `images.
83
+ # armv7emsp = "arm_embedded"`) sharing this same checkout and this same
84
+ # `cibuildmp` invocation with x64 above -- the leg that actually exercises
85
+ # [0055]'s own finding, not just a second easy arch for breadth's sake.
86
+ build-features0:
87
+ runs-on: ubuntu-latest
88
+ env:
89
+ CIBMP_VERSION: 0.0.0-ci
90
+ steps:
91
+ - uses: actions/checkout@v7
92
+
93
+ - name: Build upstream examples/natmod/features0 (x64 + armv7emsp)
94
+ uses: ./
95
+ with:
96
+ package-dir: examples/natmod
97
+ build: "${{ env.CIBMP_UPSTREAM_ABI_TAG }}-x64 ${{ env.CIBMP_UPSTREAM_ABI_TAG }}-armv7emsp"
98
+
99
+ - name: List built artifacts
100
+ run: ls -laR examples/natmod/mpyhouse
101
+
102
+ build-upstream-natmod:
103
+ strategy:
104
+ fail-fast: false
105
+ matrix:
106
+ module:
107
+ - features1
108
+ - features2
109
+ - features3
110
+ - features4
111
+ - heapq
112
+ - random
113
+ - re
114
+ - deflate
115
+ - framebuf
116
+ - btree
117
+ runs-on: ubuntu-latest
118
+ env:
119
+ CIBMP_VERSION: 0.0.0-ci
120
+ CIBMP_MODULE_DIR: "{micropython}/examples/natmod/${{ matrix.module }}"
121
+ steps:
122
+ - uses: actions/checkout@v7
123
+
124
+ - name: Build upstream examples/natmod/${{ matrix.module }} (x64)
125
+ uses: ./
126
+ with:
127
+ package-dir: examples/natmod
128
+ build: "${{ env.CIBMP_UPSTREAM_ABI_TAG }}-x64"
129
+
130
+ - name: List built artifacts
131
+ run: ls -laR examples/natmod/mpyhouse
@@ -0,0 +1,241 @@
1
+ name: Test upstream usercmodule
2
+
3
+ # Builds MicroPython's own `examples/usercmodule/` (cexample, cppexample,
4
+ # subpackage) through cibuildmp's real usermod path -- docs/records/0054
5
+ # scoped why this fixture matters (it tests upstream's own module contract,
6
+ # not one this project wrote for itself); docs/records/0069 is the mechanism
7
+ # actually landed here and explains every choice below in full.
8
+ #
9
+ # Six jobs, one per port cibuildmp drives a usermod build for -- widened
10
+ # from the original narrow unix+rp2 slice ([0054]'s own "one Make port and
11
+ # one CMake port is enough to answer the three questions above") once that
12
+ # slice came back green, per [0054]'s own "widen only if it finds
13
+ # something." Still nowhere near build-examples.yml's much broader
14
+ # examples/template matrix: one representative identifier per port, not
15
+ # each port's own full arch/board matrix.
16
+ #
17
+ # No job here sets `CIBMP_USER_C_MODULES`/`CIBMP_EXTRA_MAKE_ARGS`/
18
+ # `CIBMP_EXTRA_CMAKE_ARGS`, and none of them ever resolves the pinned
19
+ # checkout itself. Both used to be true: every job called
20
+ # `sources.fetch_micropython()` directly, in its own pre-fetch step, then
21
+ # exported the real checkout path by hand -- necessary back when this
22
+ # project had no way to name "a path inside whatever checkout cibuildmp
23
+ # itself is about to fetch" from outside cibuildmp, and no way to say "this
24
+ # one identifier needs this one extra flag" from inside a config file
25
+ # meant to be shared by all six. `examples/usercmodule/cibuildmp.toml` now
26
+ # carries all of it -- no `user-c-modules =` at all any more, for any
27
+ # port: the built-in "." default is already right on both sides once
28
+ # each side has its own real entry point (`micropython.cmake` for the two
29
+ # CMake ports, `{cexample,cppexample,subpackage}/micropython.mk` for the
30
+ # four Make ports -- see that toml's own header comment), plus
31
+ # `[override."*-wasm32"]`'s own `extra-make-args` -- so a bare
32
+ # `cibuildmp examples/usercmodule --build <identifier>` run, CI or local,
33
+ # resolves identically to what a job here does. `build` stays out of that
34
+ # file on purpose (see its own header comment): each job below still wants
35
+ # exactly one identifier per push, not this fixture's full six-port sweep,
36
+ # and that is the one thing a shared config file cannot express per-job.
37
+ #
38
+ # An even leaner shape was tried before any of this and reverted: pin
39
+ # `CIBMP_CACHE_PATH` to a fixed, known directory so the checkout's
40
+ # eventual path becomes computable without fetching it at all. That broke
41
+ # the workflow file outright, twice, for a GitHub Actions job-level-`env:`
42
+ # scoping rule this session could not conclusively pin down live -- see
43
+ # docs/records/0069 for the full account, kept for whoever revisits it
44
+ # rather than guessed away.
45
+ #
46
+ # push: (no branches: filter), same reasoning build-examples.yml's own header
47
+ # already documents -- this needs to run on every push to a dev branch too.
48
+
49
+ on:
50
+ push:
51
+ pull_request:
52
+ paths-ignore:
53
+ - "**.md"
54
+ - "docs/**"
55
+ - "LICENSE"
56
+ workflow_dispatch:
57
+
58
+ concurrency:
59
+ group: test-upstream-usermodule-${{ github.workflow }}-${{ github.ref }}
60
+ cancel-in-progress: true
61
+
62
+ env:
63
+ # Single source of truth for every job below -- bump here, not six
64
+ # times, when this fixture moves to a newer tag.
65
+ CIBMP_UPSTREAM_TAG: v1.29.0
66
+
67
+ jobs:
68
+ # ── unix: the Make side ─────────────────────────────────────────────
69
+ #
70
+ # py/py.mk's own `<USER_C_MODULES>/*/micropython.mk` glob finds
71
+ # `examples/usercmodule/{cexample,cppexample,subpackage}/micropython.mk`
72
+ # -- this fixture's own thin wrappers, each `include`ing upstream's real
73
+ # file via `$(TOP)` (see `cexample/micropython.mk`'s own header comment)
74
+ # -- with `user-c-modules` at its built-in "." default, no override
75
+ # needed. Never vendored (0054): the real content still comes from the
76
+ # pinned checkout, only three one-line `include` shims live in this repo.
77
+ build-unix:
78
+ runs-on: ubuntu-latest
79
+ env:
80
+ CIBMP_VERSION: 0.0.0-ci
81
+ steps:
82
+ - uses: actions/checkout@v7
83
+
84
+ - name: Build upstream examples/usercmodule (unix, native)
85
+ uses: ./
86
+ with:
87
+ package-dir: examples/usercmodule
88
+ build: ${{ env.CIBMP_UPSTREAM_TAG }}-manylinux_2_28_x86_64
89
+
90
+ - name: List built artifacts
91
+ run: ls -laR examples/usercmodule/mpyhouse
92
+
93
+ # A linked binary is not the same claim as one whose modules actually
94
+ # run -- unix is the one port here whose own output this runner can
95
+ # simply execute (a real manylinux_2_28 binary runs unmodified on a
96
+ # newer-glibc host, the whole point of the manylinux floor), unlike
97
+ # rp2's own firmware.uf2, which needs real hardware. See
98
+ # smoke_test.py's own header for what it actually exercises.
99
+ - name: "Smoke test (unix): run the built binary against smoke_test.py"
100
+ run: |
101
+ set -euo pipefail
102
+ identifier="${CIBMP_UPSTREAM_TAG}-manylinux_2_28_x86_64"
103
+ bin="examples/usercmodule/mpyhouse/${identifier}/micropython-${identifier}"
104
+ "$bin" examples/usercmodule/smoke_test.py
105
+
106
+ # ── rp2: the CMake side ──────────────────────────────────────────────
107
+ #
108
+ # Chosen over esp32 purely on cost -- usermod/build_rp2.py's own docstring:
109
+ # the Pico SDK arrives as `lib/` submodules of the MicroPython checkout
110
+ # itself, no separate host-side toolchain resolver the way esp32's
111
+ # ESP-IDF needs. Nothing here is rp2-specific; widening to esp32/windows/
112
+ # webassembly/qemu is exactly [0054]'s own "widen only if it finds
113
+ # something" (docs/records/0069).
114
+ #
115
+ # This is also the leg that actually answers [0054]'s biggest open
116
+ # question for one real toolchain: whether cppexample's `-lstdc++` is
117
+ # satisfiable on a bare-metal cross target. Deliberately not skipped --
118
+ # a red leg here is a real finding to record, not a bug in this workflow.
119
+ #
120
+ # examples/usercmodule/micropython.cmake resolves the pinned checkout
121
+ # itself, via MICROPY_DIR -- a CMake variable every CMake port already
122
+ # sets before it ever include()s a user module (rp2/CMakeLists.txt's own
123
+ # `get_filename_component(MICROPY_DIR "../.." ABSOLUTE)`, well before its
124
+ # own `include(${MICROPY_DIR}/py/usermod.cmake)`) -- with `user-c-modules`
125
+ # at its built-in "." default, same as every other port here now.
126
+ build-rp2:
127
+ runs-on: ubuntu-latest
128
+ permissions:
129
+ contents: read
130
+ env:
131
+ CIBMP_VERSION: 0.0.0-ci
132
+ steps:
133
+ - uses: actions/checkout@v7
134
+ - uses: docker/setup-qemu-action@v4
135
+
136
+ - name: Build upstream examples/usercmodule (rp2)
137
+ uses: ./
138
+ with:
139
+ package-dir: examples/usercmodule
140
+ build: ${{ env.CIBMP_UPSTREAM_TAG }}-rp2-RPI_PICO
141
+
142
+ - name: List built artifacts
143
+ run: ls -laR examples/usercmodule/mpyhouse
144
+
145
+ # ── esp32: the second CMake port, and the second bare-metal toolchain ──
146
+ #
147
+ # [0054]'s own list of unanswered families after [0069]: esp32 is the
148
+ # ESP-IDF one -- a cmake-driven port like rp2, but a materially different
149
+ # toolchain (Xtensa/RISC-V via idf.py, not arm-none-eabi via the Pico
150
+ # SDK). Fully containerized since [0028] (no host-side ESP-IDF resolver
151
+ # left).
152
+ #
153
+ # Same MICROPY_DIR mechanism as build-rp2 above: MICROPY_DIR is set at
154
+ # the very top of ports/esp32/main/CMakeLists.txt
155
+ # (`if(NOT MICROPY_DIR) get_filename_component(...)`), well before it --
156
+ # via ports/esp32/CMakeLists.txt -- reaches `include(${MICROPY_DIR}/py/
157
+ # usermod.cmake)`.
158
+ build-esp32:
159
+ runs-on: ubuntu-latest
160
+ permissions:
161
+ contents: read
162
+ env:
163
+ CIBMP_VERSION: 0.0.0-ci
164
+ steps:
165
+ - uses: actions/checkout@v7
166
+ - uses: docker/setup-qemu-action@v4
167
+
168
+ - name: Build upstream examples/usercmodule (esp32)
169
+ uses: ./
170
+ with:
171
+ package-dir: examples/usercmodule
172
+ build: ${{ env.CIBMP_UPSTREAM_TAG }}-esp32-ESP32_GENERIC
173
+
174
+ - name: List built artifacts
175
+ run: ls -laR examples/usercmodule/mpyhouse
176
+
177
+ # ── windows, webassembly, qemu: the remaining three Make ports ──────────
178
+ #
179
+ # Same mechanism as build-unix above (the same three wrapper files,
180
+ # already discovered by py.mk's own glob), one representative identifier
181
+ # per port rather than each port's own full arch matrix -- [0054]'s own
182
+ # "widen only if it finds something", not a cost-blind repeat of
183
+ # build-examples.yml's broader coverage. No smoke test for any of the
184
+ # three: none of their outputs (a .exe, a .wasm, a qemu ELF) runs
185
+ # directly on this runner the way unix's manylinux binary does (record
186
+ # 0069's own reasoning for why rp2 has none either).
187
+ build-windows:
188
+ runs-on: ubuntu-latest
189
+ env:
190
+ CIBMP_VERSION: 0.0.0-ci
191
+ steps:
192
+ - uses: actions/checkout@v7
193
+
194
+ - name: Build upstream examples/usercmodule (windows)
195
+ uses: ./
196
+ with:
197
+ package-dir: examples/usercmodule
198
+ build: ${{ env.CIBMP_UPSTREAM_TAG }}-win_amd64
199
+
200
+ - name: List built artifacts
201
+ run: ls -laR examples/usercmodule/mpyhouse
202
+
203
+ # `examples/usercmodule/cibuildmp.toml`'s own `[override."*-wasm32"]`
204
+ # carries this identifier's own `extra-make-args` (CXX=em++ plus the
205
+ # CXXFLAGS_MOD fix for two real, separate upstream ports/webassembly/
206
+ # Makefile bugs -- see that file's own comment for both). Nothing
207
+ # webassembly-specific is set here any more.
208
+ build-webassembly:
209
+ runs-on: ubuntu-latest
210
+ env:
211
+ CIBMP_VERSION: 0.0.0-ci
212
+ steps:
213
+ - uses: actions/checkout@v7
214
+
215
+ - name: Build upstream examples/usercmodule (webassembly)
216
+ uses: ./
217
+ with:
218
+ package-dir: examples/usercmodule
219
+ build: ${{ env.CIBMP_UPSTREAM_TAG }}-wasm32
220
+
221
+ - name: List built artifacts
222
+ run: ls -laR examples/usercmodule/mpyhouse
223
+
224
+ build-qemu:
225
+ runs-on: ubuntu-latest
226
+ permissions:
227
+ contents: read
228
+ env:
229
+ CIBMP_VERSION: 0.0.0-ci
230
+ steps:
231
+ - uses: actions/checkout@v7
232
+ - uses: docker/setup-qemu-action@v4
233
+
234
+ - name: Build upstream examples/usercmodule (qemu)
235
+ uses: ./
236
+ with:
237
+ package-dir: examples/usercmodule
238
+ build: ${{ env.CIBMP_UPSTREAM_TAG }}-qemu-MPS2_AN385
239
+
240
+ - name: List built artifacts
241
+ run: ls -laR examples/usercmodule/mpyhouse