Bump ODEInterface compat to 0.5.1 to fix Julia 1.12+ solver loading#109
Merged
ChrisRackauckas merged 5 commits intoJun 27, 2026
Conversation
ODEInterface 0.5.0 (the only registered 0.5.x) fails to load its solver libraries on Julia 1.12 and 1.13. `loadODESolvers()` does `@eval ODEInterface begin using ODEInterface_jll end` and then, within the same call frame, accesses the `ODEInterface_jll` global via `getproperty`. Under Julia 1.12's stricter binding-partition / world-age semantics the binding created by the `using` is only visible in a newer world age, so the in-frame access raises `UndefVarError(:ODEInterface_jll)`. All solvers then report a load error and `getAllMethodPtrs` throws `SolverODEnotLoaded`, erroring Core/algorithm_tests.jl on the `julia 1` and `julia pre` CI jobs (lts/1.10 was unaffected and stayed green). The upstream fix (luchr/ODEInterface.jl PR SciML#36, tagged v0.5.1) switches to `import ODEInterface_jll` and `@eval getproperty(...)`, but v0.5.1 is not yet registered in General, so it cannot be selected by compat. ODEInterface 0.4.8 uses the older local gfortran build path, which loads correctly on Julia 1.12/1.13, so cap to it as the last working registered version. Verified locally: GROUP=Core `Pkg.test` passes on both Julia 1.12.6 and 1.10.11 (all Core test files green, exit 0). When ODEInterface 0.5.1 is registered, this cap can be relaxed back to allow 0.5.1+. Co-Authored-By: Chris Rackauckas <accounts@chrisrackauckas.com> Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Capping ODEInterface to 0.4.8 (to dodge the 0.5.0 Julia-1.12 _jll load bug) reintroduces 0.4.8's gfortran source build in deps/build.jl. On runners without gfortran the build errors with "Currently only gfortran is supported", which broke the QA (julia lts) job. Pass apt-packages: "gfortran" to the grouped-tests workflow so every test job has gfortran before building/testing. Verified locally on Julia 1.10: ODEInterface resolves to 0.4.8, the gfortran-built solvers load, a dopri5() solve returns Success, and the QA suite passes (Aqua 7 pass + pre-existing broken, JET pre-existing broken). Co-Authored-By: Chris Rackauckas <accounts@chrisrackauckas.com> Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The Downgrade job also builds ODEInterface 0.4.8 from source (gfortran), which intermittently fails on runners lacking gfortran. Pass apt-packages: "gfortran" to downgrade.yml for the same reason as the main Tests workflow. Co-Authored-By: Chris Rackauckas <accounts@chrisrackauckas.com> Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
ODEInterface 0.5.1 is now registered in General (JuliaRegistries/General#159294), carrying the upstream fix (luchr/ODEInterface.jl#36) for the Julia 1.12+ binding-partition issue that made loadODESolvers() raise UndefVarError(:ODEInterface_jll). Cap ODEInterface to 0.5.1 rather than 0.5 so the resolver cannot select the still-broken 0.5.0. Since 0.5.x loads the solvers via ODEInterface_jll instead of compiling from source, the gfortran apt-package workaround added for the 0.4.8 cap is no longer needed and is removed from the Tests and Downgrade workflows. Bump the package to 5.0.1. Verified locally on Julia 1.12.4: resolver selects ODEInterface v0.5.1, all solvers load with no errors, Core/algorithm_tests.jl runs to completion, and the full Core test group passes. Co-Authored-By: Chris Rackauckas <accounts@chrisrackauckas.com> Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01AJWwVTJoJLeknNgo5GTQ2K
Contributor
Author
|
Pushed Verified locally on Julia 1.12.4: resolver selects |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Problem
The
tests / Core (julia 1)andtests / Core (julia pre)jobs fail on master with:in
ODEInterface/DLSolvers.jl(getAllMethodPtrs->loadODESolvers), which errorsCore/algorithm_tests.jlat the firstsolve(prob, dopri5(), ...). TheCore (julia lts)/ 1.10 job is unaffected and stays green.Root cause
ODEInterface 0.5.0 has a Julia 1.12+ incompatibility.
loadODESolvers()runs@eval ODEInterface begin using ODEInterface_jll endand then, in the same call frame, accesses theODEInterface_jllglobal viagetproperty. Under Julia 1.12's stricter binding-partition / world-age semantics, the binding created byusingis only visible in a newer world age, so the in-frame access raisesUndefVarError(:ODEInterface_jll). Every solver then records a load error andgetAllMethodPtrsthrowsSolverODEnotLoaded. Julia 1.10 had more permissive binding visibility, so it stayed green.Fix
The upstream fix (luchr/ODEInterface.jl#36) switches to
import ODEInterface_jll+@eval getproperty(...)and resolves it. It is now released asODEInterface v0.5.1and registered in General (JuliaRegistries/General#159294, merged), so it is selectable via compat.This PR sets
ODEInterface = "0.5.1". The cap is deliberately0.5.1, not0.5, because the still-registered0.5.0carries the bug — a bare"0.5"would let the resolver pick the broken version.Because 0.5.x loads the solvers through
ODEInterface_jllrather than compiling the Fortran solvers from source, theapt-packages: "gfortran"workaround previously added (for the 0.4.8 source build) is no longer needed and is removed from both theTestsandDowngradeworkflows.Package version bumped to
5.0.1.Verification (local, Julia 1.12.4)
Project.tomlselectsODEInterface v0.5.1(pulling inODEInterface_jll), confirming0.5.0is excluded.loadODESolvers()loads all solvers with no errors — the originalUndefVarError(:ODEInterface_jll)is gone.solve(prob, dopri5())returnsretcode: Successwith the correct numerical result.GROUP=Coretest group passes:Core/algorithm_tests.jlruns to completion (no error), and callbacks/explicit_imports/initialization/jac/mass_matrix/mtk_initialization/saving all pass.Please ignore until reviewed by @ChrisRackauckas