From 936651c30c5a8ecb1773ad5c6a0345060b99dca8 Mon Sep 17 00:00:00 2001 From: GenericJam Date: Fri, 23 Oct 2026 23:19:24 -0600 Subject: [PATCH 1/3] Require mob ~> 0.9.26: mob 0.9.25's Android NIF doesn't compile on Zig 0.17.0 --- CHANGELOG.md | 5 ++++- mix.exs | 12 +++++++----- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 803e1b3..0b465a8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -26,7 +26,10 @@ ### Upgrading -- **Zig 0.17.0.** In each app, set `zig 0.17.0` in `.tool-versions` +- **Zig 0.17.0, with mob 0.9.26.** mob_dev now requires `mob ~> 0.9.26`: + mob 0.9.25's Android NIF calls `std.fmt.bufPrintZ`, which Zig 0.17.0 + removed, so run `mix deps.update mob mob_dev` (both move). In each app, + set `zig 0.17.0` in `.tool-versions` (`mise use zig@0.17.0` installs it and edits the file; `mise install zig@0.17.0` alone leaves the app on the nightly, and the native build rejects it). Existing iOS apps must port the Swift glob in diff --git a/mix.exs b/mix.exs index 97aa4b3..6ec7a38 100644 --- a/mix.exs +++ b/mix.exs @@ -74,11 +74,13 @@ defmodule MobDev.MixProject do # Before this, mob_dev had its own copy of the normalization logic, # kept in sync with mob core's copy only by convention — see MOB_FONTS.md. # - # >= 0.9.25 because the OTP runtime this mob_dev downloads (d199a49a, - # erts-17.1.1) only boots on a mob that finds its ERTS dir at runtime; - # older mob hard-codes erts-17.0 on Android and the iOS simulator - # (MOB-493). Hex resolution then keeps an app's mob and mob_dev in step. - {:mob, "~> 0.9.25", runtime: false}, + # >= 0.9.26: this mob_dev requires Zig 0.17.0, and mob's Android NIF + # only compiles under it from 0.9.26 (0.9.25 calls std.fmt.bufPrintZ, + # which 0.17.0 removed). 0.9.25 was the floor for the OTP runtime this + # mob_dev downloads (d199a49a, erts-17.1.1): older mob hard-codes + # erts-17.0 on Android and the iOS simulator (MOB-493). Hex resolution + # then keeps an app's mob and mob_dev in step. + {:mob, "~> 0.9.26", runtime: false}, {:eqrcode, "~> 0.2"}, {:jason, "~> 1.4"}, {:mix_audit, "~> 2.1", runtime: false}, From 90d71bfe42007c5b6fb957982a08eb4b32007ace Mon Sep 17 00:00:00 2001 From: GenericJam Date: Fri, 23 Oct 2026 23:28:06 -0600 Subject: [PATCH 2/3] Release-gate nits: Changed lists the mob floor; b.build_root wording; guides name Zig 0.17.0 --- CHANGELOG.md | 6 ++++-- guides/nifs.md | 2 +- lib/mix/tasks/mob.add_nif.ex | 2 +- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0b465a8..518356b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,13 +6,15 @@ is the stable with the macOS 26 SDK fix the nightly was taken for. `mix mob.doctor` / `mix mob.deploy --native` still require an exact `zig version` match. Companion to mob and mob_new. +- **Requires mob `~> 0.9.26`.** mob 0.9.25's Android NIF doesn't compile on + Zig 0.17.0 (it calls `std.fmt.bufPrintZ`, which 0.17.0 removed). ### Fixed - **`mix mob.doctor` checks the iOS Swift glob for Zig 0.17.0.** It fails `ios/build.zig` / `ios/build_device.zig` that still use `b.build_root`, - which 0.17.0 removed (configure panics with `no field named - 'build_root'`). It warns when the glob opens `mob/ios` without + which 0.17.0 removed (configure fails with `error: no field named + 'build_root' in struct 'Build'`). It warns when the glob opens `mob/ios` without `b.dependOnDirectoryContents`: 0.17.0 caches the configure phase, so a Swift file mob adds is missed until the zig cache is cleared. Comments and strings are ignored. The fix names mob_new's template block. diff --git a/guides/nifs.md b/guides/nifs.md index e18c541..a303be2 100644 --- a/guides/nifs.md +++ b/guides/nifs.md @@ -422,7 +422,7 @@ PR #579. The `mob.add_nif --type zigler` scaffold also runs `mix zig.get` afterward so Zigler's `executable_path` lookup finds the cached Zig 0.16.0 before falling through to `PATH` (which on most mob -developer machines points at Zig 0.17-dev — wrong stdlib for the +developer machines points at the pinned app toolchain, Zig 0.17.0 — wrong stdlib for the port). ### What stays standard diff --git a/lib/mix/tasks/mob.add_nif.ex b/lib/mix/tasks/mob.add_nif.ex index fe54631..9c37756 100644 --- a/lib/mix/tasks/mob.add_nif.ex +++ b/lib/mix/tasks/mob.add_nif.ex @@ -398,7 +398,7 @@ defmodule Mix.Tasks.Mob.AddNif do # # `mix zig.get` is still queued so Zigler's executable_path lookup # finds the cached Zig before falling through to PATH (which on - # mob developer machines points at 0.17-dev, the wrong stdlib for + # mob developer machines points at the pinned app toolchain, Zig 0.17.0, the wrong stdlib for # the port — needs 0.16.0 specifically). igniter |> Igniter.Project.Deps.add_dep( From 06300a8d8f45baa5276f58f7d3cb442e32d1135c Mon Sep 17 00:00:00 2001 From: GenericJam Date: Sat, 24 Oct 2026 00:35:13 -0600 Subject: [PATCH 3/3] Release 0.7.31: mob 0.9.26 in mix.lock; plug_crypto 2.2.1 (EEF-CVE-2026-105963, dev lock only) --- CHANGELOG.md | 2 ++ mix.exs | 2 +- mix.lock | 4 ++-- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 518356b..5f6b9bc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,7 @@ ## [Unreleased] +## [0.7.31] - 2026-10-24 + ### Changed - **Zig pin is 0.17.0.** Replaces `0.17.0-dev.269+ebff43698` now that 0.17.0 diff --git a/mix.exs b/mix.exs index 6ec7a38..2ebd7a5 100644 --- a/mix.exs +++ b/mix.exs @@ -4,7 +4,7 @@ defmodule MobDev.MixProject do def project do [ app: :mob_dev, - version: "0.7.30", + version: "0.7.31", elixir: "~> 1.19", description: "Development tooling for the Mob mobile framework", source_url: "https://github.com/genericjam/mob_dev", diff --git a/mix.lock b/mix.lock index 5055a9f..89be40a 100644 --- a/mix.lock +++ b/mix.lock @@ -29,7 +29,7 @@ "mint": {:hex, :mint, "1.11.0", "a713551624815c0435237b93d90ea8b9b14254690c66f732d0ef8930f76ff1d9", [:mix], [{:castore, "~> 0.1.0 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}, {:hpax, "~> 1.1", [hex: :hpax, repo: "hexpm", optional: false]}], "hexpm", "c6279ba2d6aa3a383a1d4cfbe7b59f42e6efd400f58d8e2acfeac48a438693ab"}, "mix_audit": {:hex, :mix_audit, "2.1.5", "c0f77cee6b4ef9d97e37772359a187a166c7a1e0e08b50edf5bf6959dfe5a016", [:make, :mix], [{:jason, "~> 1.4", [hex: :jason, repo: "hexpm", optional: false]}, {:yaml_elixir, "~> 2.11", [hex: :yaml_elixir, repo: "hexpm", optional: false]}], "hexpm", "87f9298e21da32f697af535475860dc1d3617a010e0b418d2ec6142bc8b42d69"}, "mix_unused": {:hex, :mix_unused, "0.4.1", "9f8d759a300a79d2077d6baf617f3a5af6935d50b0f113c09295b265afc3e411", [:mix], [{:libgraph, ">= 0.0.0", [hex: :libgraph, repo: "hexpm", optional: false]}], "hexpm", "fa21f688a88e0710e3d96ac1c8e5a6181aea8a75c8a4214f0edcfeb069b831a3"}, - "mob": {:hex, :mob, "0.9.25", "45106ca9c7ab752a8a0311281b80ebd2feab80d7b0630861007959e2217ab252", [:mix], [{:nimble_parsec, "~> 1.0", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "9d8e6e6b49b28312172794b5dcf1d39585124c70756b807f3cbbce7176023bd4"}, + "mob": {:hex, :mob, "0.9.26", "a67c24d5de9be40deb435ecec96dae8e3832ac070e1b00cec14b7dc47142b7a0", [:mix], [{:nimble_parsec, "~> 1.0", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "1918257d624becf6b9660357be75dcbf5676471d71672a210373dbb9c51b8931"}, "mox": {:hex, :mox, "1.2.0", "a2cd96b4b80a3883e3100a221e8adc1b98e4c3a332a8fc434c39526babafd5b3", [:mix], [{:nimble_ownership, "~> 1.0", [hex: :nimble_ownership, repo: "hexpm", optional: false]}], "hexpm", "c7b92b3cc69ee24a7eeeaf944cd7be22013c52fcb580c1f33f50845ec821089a"}, "nimble_options": {:hex, :nimble_options, "1.1.1", "e3a492d54d85fc3fd7c5baf411d9d2852922f66e69476317787a7b2bb000a61b", [:mix], [], "hexpm", "821b2470ca9442c4b6984882fe9bb0389371b8ddec4d45a9504f00a66f650b44"}, "nimble_ownership": {:hex, :nimble_ownership, "1.0.2", "fa8a6f2d8c592ad4d79b2ca617473c6aefd5869abfa02563a77682038bf916cf", [:mix], [], "hexpm", "098af64e1f6f8609c6672127cfe9e9590a5d3fcdd82bc17a377b8692fd81a879"}, @@ -42,7 +42,7 @@ "phoenix_pubsub": {:hex, :phoenix_pubsub, "2.2.0", "ff3a5616e1bed6804de7773b92cbccfc0b0f473faf1f63d7daf1206c7aeaaa6f", [:mix], [], "hexpm", "adc313a5bf7136039f63cfd9668fde73bba0765e0614cba80c06ac9460ff3e96"}, "phoenix_template": {:hex, :phoenix_template, "1.0.4", "e2092c132f3b5e5b2d49c96695342eb36d0ed514c5b252a77048d5969330d639", [:mix], [{:phoenix_html, "~> 2.14.2 or ~> 3.0 or ~> 4.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}], "hexpm", "2c0c81f0e5c6753faf5cca2f229c9709919aba34fab866d3bc05060c9c444206"}, "plug": {:hex, :plug, "1.20.3", "56c480c633ec2ce10140e236e15233bf576e1d323887d7c96711bd02ab5160db", [:mix], [{:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_crypto, "~> 1.1.1 or ~> 1.2 or ~> 2.0", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.3 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "be266aee1b8536ef6409d58cf39a3121319f0ec47cfa1b24024485aa0e76ad76"}, - "plug_crypto": {:hex, :plug_crypto, "2.2.0", "144014737daaf485407f5ed77daeaad74d651b216a28c87543f8cc7043f8efc8", [:mix], [], "hexpm", "83a95744ab1c75876542b6fab135fcc176280e0f301a111c1f757fddcec95d2c"}, + "plug_crypto": {:hex, :plug_crypto, "2.2.1", "bd1d0358a2e2f5ffb818217e64c394f9d24ed191d862b7fa1bcce264ace2b8ea", [:mix], [], "hexpm", "4417ccbd8f85e627321cd07d2ab9c4b621f1fd883b9905af241f9b4b780b94b6"}, "reach": {:hex, :reach, "2.7.1", "5f9df784c4919b1e48e4e7aa5d777ee6566f219983fc295f275c79619eff419d", [:mix], [{:boxart, "~> 0.3.3", [hex: :boxart, repo: "hexpm", optional: true]}, {:ex_ast, "~> 0.12.0", [hex: :ex_ast, repo: "hexpm", optional: false]}, {:ex_dna, "~> 1.5", [hex: :ex_dna, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:libgraph, "~> 0.16.0", [hex: :libgraph, repo: "hexpm", optional: false]}, {:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: true]}, {:makeup_elixir, "~> 1.0", [hex: :makeup_elixir, repo: "hexpm", optional: true]}, {:makeup_js, "~> 0.1", [hex: :makeup_js, repo: "hexpm", optional: true]}, {:quickbeam, "~> 0.10", [hex: :quickbeam, repo: "hexpm", optional: true]}], "hexpm", "c7d64e6c703885b067faa276d265bd6516aa877abeafb1189ff53d2463d7bec9"}, "req": {:hex, :req, "0.7.5", "0c3293cbf7717aba20b1b1b3ea13fe8d3fdf6f1557490f390c3f1ef6dd9db955", [:mix], [{:brotli, "~> 0.3.1", [hex: :brotli, repo: "hexpm", optional: true]}, {:finch, "~> 0.21", [hex: :finch, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}, {:mime, "~> 2.0.6 or ~> 2.1", [hex: :mime, repo: "hexpm", optional: false]}, {:nimble_csv, "~> 1.0", [hex: :nimble_csv, repo: "hexpm", optional: true]}, {:plug, "~> 1.0", [hex: :plug, repo: "hexpm", optional: true]}], "hexpm", "576853c4bf403faa3c1fa5d093e0759227083b78f8a6864c67d62c0a9c45514d"}, "rewrite": {:hex, :rewrite, "1.3.0", "67448ba7975690b35ba7e7f35717efcce317dbd5963cb0577aa7325c1923121a", [:mix], [{:glob_ex, "~> 0.1", [hex: :glob_ex, repo: "hexpm", optional: false]}, {:sourceror, "~> 1.0", [hex: :sourceror, repo: "hexpm", optional: false]}, {:text_diff, "~> 0.1", [hex: :text_diff, repo: "hexpm", optional: false]}], "hexpm", "d111ac7ff3a58a802ef4f193bbd1831e00a9c57b33276e5068e8390a212714a5"},