Skip to content

VCell solver release: NFsim_x64 archives, image + SIF, v0.2.0 - #1

Merged
jcschaff merged 8 commits into
mainfrom
release/executables-and-image
Sep 30, 2026
Merged

jcschaff merged 8 commits into
mainfrom
release/executables-and-image

Conversation

@jcschaff

@jcschaff jcschaff commented Sep 30, 2026 •

Copy link
Copy Markdown
Member

Implements PR A4 of VCell's solver-repo plan (docs/plan-solver-repos.md on VCell master): this repo now meets the solver-release contract (§1) next to its existing Python wheels. Details in the new SOLVER-RELEASE.md.

What changes

  • NFsim_x64 target — NFsim with VCell's main (VCell/src/VCellNFSim.cpp, already in the repo but not built): [[[progress]]] markers on stdout, and with -DOPTION_VCELL_MESSAGING=ON status messages to VCell's broker for a trailing -tid <n> (broker read from the input's <jms> element), as the legacy vcell-solvers build did. Vendors VCellMessaging (from vcell-fvsolver) and vcommons (from vcell-solvers). The plain NFsim target and the Python binding are unchanged.
  • Release workflow (.github/workflows/release.yml), on PRs / main / v* tags:
    • linux64.tgz, linux64arm.tgz: built on manylinux_2_28 in Docker, messaging ON, with a minimal HTTP-only libcurl linked statically. The build fails if anything beyond glibc/libstdc++/libgcc_s gets linked.
    • mac64.tgz: universal arm64+x86_64, ad-hoc signed, only /usr/lib dependencies.
    • win64.zip: MinGW-w64 gcc, fully static, with only Windows system DLLs (the legacy build was MinGW too; MSVC left NFsimMain unresolved at link time).
    • Each archive holds NFsim_x64[.exe], LICENSE, LICENSE-GPL-3.0.txt and VERSION.
    • Image ghcr.io/virtualcell/vcell-nfsim (amd64+arm64, debian:bookworm-slim runtime) and SIF vcell-nfsim_singularity (amd64), tagged :X.Y.Z on tags and :latest + :sha-* on main.
    • On a tag, the GitHub release gets the archives, the wheels + sdist (publish-python-package.yml is now also workflow_call; its manual dispatch still works) and SHA256SUMS.
  • Standard entrypoint /usr/local/bin/vcell-solver-entrypoint: help → exit 0, NFsim_x64 … → exec, anything else → exit 2. It writes nothing and runs as any uid.
  • Messaging fix: SimulationMessaging's messaging constructor left bStopRequested uninitialized. A garbage true made the solver exit without waiting for the messaging thread, so JOB_COMPLETED was sometimes never sent. CI caught it, and the fix is in VCell/messaging. The same code is in vcell-fvsolver's and vcell-solvers' VCellMessaging.
  • Version 0.2.0.

Checks

  • Smoke test tests/container/smoke.sh: the committed reference model through Docker (uid 12345, bind mount) and through the SIF under apptainer run --containall (non-root). Argv matches SlurmProxy's (/simdata, -tid 0), and the input's broker is pointed at a local fake broker. Outputs must be byte-identical to tests/smoke/*.expected, and JOB_STARTING + JOB_COMPLETED must reach the broker.
  • Equivalence tests/equivalence/compare_legacy.sh: 5 seeds through the legacy vcell-solvers v0.0.44-dev4 NFsim_x64 and the new one, compared byte for byte. In CI it is byte-identical on linux64, on both mac64 slices (arm64 native, x86_64 under Rosetta), and on win64 against the legacy v0.0.40 NFsim_x64.exe that VCell's Windows desktop ships.

Decisions

  • Messaging is ON for the Linux archives and the image (one binary for desktop and HPC; without -tid it behaves like the desktop binary). mac and Windows stay messaging OFF, like the legacy desktop binaries.
  • libcurl is linked statically as an HTTP-only build, so there is nothing to bundle. The broker URL is plain http://host:port.
  • NFsim's GPL-3.0 text ships as LICENSE-GPL-3.0.txt next to the repo's MIT LICENSE.
  • The archive VERSION comes from the tag / pyproject.toml. The repo's top-level VERSION file belongs to BioNetGen, so it is left alone.

🤖 Generated with Claude Code

jcschaff and others added 8 commits September 30, 2026 11:29
…saging

NFsim_x64 is NFsim with VCell's main (VCell/src/VCellNFSim.cpp, previously unbuilt here):
[[[progress]]] markers on stdout and, with -DOPTION_VCELL_MESSAGING=ON, status messages to
VCell's broker for a trailing -tid <n>, as the legacy vcell-solvers build did. Vendors the
VCellMessaging library (from vcell-fvsolver) and the vcommons helpers it needs (from
vcell-solvers). The plain NFsim target and the Python binding are unchanged; NFsim_x64 is
skipped under scikit-build.

Also: honour a caller-set CMAKE_OSX_ARCHITECTURES (universal builds) and pass -m64 only on
x86_64 (aarch64 gcc rejects it).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…d equivalence tests

- packaging/build-linux.sh: NFsim_x64 on manylinux_2_28, messaging ON, minimal HTTP-only
  libcurl linked statically; fails if anything beyond glibc/libstdc++/libgcc_s is linked.
- docker/Dockerfile: build stage = the archive's contents, an "archive" stage exporting
  linux64.tgz / linux64arm.tgz, and a debian:bookworm-slim runtime with them on PATH.
- docker/entrypoint.sh: /usr/local/bin/vcell-solver-entrypoint (help -> 0, NFsim_x64 -> exec,
  else -> 2); writes nothing, any uid, read-only SIF.
- tests/container/smoke.sh + fake_broker.py: the reference model through an image as
  SlurmProxy runs it (/simdata, -tid 0), byte-exact against tests/smoke/*.expected, and the
  status messages must reach the (fake) broker.
- tests/equivalence/compare_legacy.sh: five seeds through the legacy vcell-solvers
  v0.0.44-dev4 NFsim_x64 and the new one, byte-for-byte.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…th wheels; v0.2.0

release.yml builds linux64/linux64arm (Docker, manylinux_2_28), mac64 (universal, ad-hoc
signed) and win64 (MSVC, static runtime) archives, smoke-tests the image (Docker as a
non-root uid, and the SIF under apptainer --containall, both with -tid), compares with the
legacy binary, publishes ghcr.io/virtualcell/vcell-nfsim (multi-arch) and
vcell-nfsim_singularity (amd64 SIF) on main and tags, and on a vX.Y.Z tag creates the
release with the archives, the wheels + sdist (publish-python-package.yml, now also
workflow_call) and SHA256SUMS. SOLVER-RELEASE.md documents the contract; version 0.2.0.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…tool's per-arch headers)

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…2.28 check (NFsim -help exits 255)

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…p ships

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
It was left uninitialized in the SimulationMessaging(broker, ...) constructor, so a garbage
non-zero value made nfsimExit skip waitUntilFinished(): the process could exit before the
messaging thread posted JOB_COMPLETED (seen in CI: JOB_STARTING reached the broker, the
completion never did). Also return from lockMessaging() on POSIX. The same code is in
vcell-fvsolver's and vcell-solvers' VCellMessaging.

The smoke test takes BROKER_HOST (default 127.0.0.1) for runs where the solver sees the host
under another name (host.docker.internal on Docker Desktop).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…SIGPIPE under pipefail)

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@jcschaff
jcschaff merged commit 098fa51 into main Sep 30, 2026
18 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant