Merged
Conversation
Inko is a language for building concurrent software with confidence,
compiled to machine code via LLVM 18. The recipe builds the compiler
with the conda-forge Rust toolchain, links against conda-forge's
llvmdev, and installs the standard library and static runtime to
$PREFIX/lib/inko/{std,runtime}.
Includes a patch to compiler/src/config.rs that resolves INKO_STD and
INKO_RT at runtime via env var override / current_exe()-relative
discovery / baked fallback, matching how rustc, zig, clang, ruby (with
LOAD_RELATIVE) and python locate their own bundled files. Without this
the absolute install paths baked by env\!() get corrupted by binary
prefix relocation, leaving trailing NUL bytes that break syscalls and
clobbering adjacent string literals via linker suffix-merging.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Contributor
|
Hi! This is the friendly automated conda-forge-linting service. I just wanted to let you know that I linted all conda-recipes in your PR ( |
Local osx-arm64 builds passed because Apple's ld64 implicitly searches /usr/lib, where macOS ships libxml2 and zlib system libraries. Linux rust-lld only searches -L paths, so it can't find the unversioned linker symlinks and fails with: rust-lld: error: unable to find library -lz rust-lld: error: unable to find library -lxml2 `libzlib` is runtime-only on conda-forge; `zlib` is the package that provides the `libz.so` symlink and headers for linking. And libxml2 was split in 2.15: the new `libxml2` is a metapackage of tools plus `libxml2-16` runtime with no `libxml2.so` symlink. Pin to `<2.15` to pick up the last combined release until llvm-sys stops forwarding `-lxml2` or a conda-forge devel split appears. Tested locally on osx-arm64: build and rattler-build test both pass. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The top-level libxml2 package is just tools + libxml2-16 post-2.15; depending on libxml2-16 directly skips the tools we don't need. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Move build logic from build.sh into the recipe via interpreter: nu. No behaviour change — same cargo auditable build, same install layout — but the recipe is now self-contained and cross-platform friendly via $nu.os-info.name. - Fix Linux link failure by creating a libxml2.so/libxml2.dylib shim in a temp directory pointing at libxml2.16.dylib / libxml2.so.16 and adding it to RUSTFLAGS. llvm-sys forwards `-lxml2` to the final link because llvmdev was built with XML remark support, but libxml2-16 on conda-forge ships only the versioned runtime with no unversioned linker symlink. - Add libxml2-16 to requirements.run. It does not set a run_exports, so without an explicit entry the test env does not get the runtime dylib and `inko --help` aborts with "Library not loaded: libxml2.16.dylib". - Add nushell to requirements.build (needed by interpreter: nu). - Delete build.sh; everything lives inline in recipe.yaml now. Tested locally on osx-arm64: rattler-build build + test both pass. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
wolfv
reviewed
Apr 14, 2026
libxml2-devel is the conda-forge split that actually ships the unversioned libxml2.so / libxml2.dylib symlink plus headers, with libxml2-16 (the versioned runtime) as a hard dep. Adding it to host lets `-lxml2` resolve against $PREFIX/lib directly and drops the custom shim-symlink + RUSTFLAGS manipulation from the build script. libxml2-devel has no run_exports either, so keep libxml2-16 in run explicitly so the runtime dylib lands in the test env. Tested locally on osx-arm64: build + test both pass. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
libxml2-devel sets a run_exports that pulls in libxml2-16 >=2.15.2 automatically — the entry I added earlier on the assumption that neither package had run_exports was wrong (pixi search said "run exports not available in repodata", which turns out to mean "can't be surfaced by pixi search", not "does not exist"). Verified locally: build and tests pass with just libxml2-devel in host and nothing explicit in run — rattler-build's finalized run deps show libxml2-16 >=2.15.2 getting pulled in from the libxml2-devel run_exports. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
inkwell's version-specific feature flags (llvm18-0 here) generate bindings against a single LLVM major version that aren't forward- compatible. Document the lockstep dependency so the next maintainer doesn't wonder. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Contributor
Author
|
@conda-forge/help-rust, ready for review! |
pavelzw
approved these changes
Apr 20, 2026
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.
Adds a recipe for inko, a language for building concurrent software with confidence. Inko compiles to machine code via LLVM 18 and ships a standard library and a static runtime.
Patch:
0001-locate-std-and-runtime-relative-to-executable.patchInko's
Config::new()upstream bakes the absolute install paths of the standard library and runtime into the compiler binary viaenv!("INKO_STD")/env!("INKO_RT"). That breaks under rattlers binary prefix relocation: rattler'scopy_and_replace_cstring_placeholderrewrites the C-string region in place, the tail content shifts left, and the trailing NUL padding both clobbers adjacent linker-merged short string literals (e.g. `pub const DEP: &str = "dep"` ends up reading three NULs) and leavesINKO_RTitself with embedded NULs that fail any subsequentCString::new.The patch adds a small
locate_sibling()helper tocompiler/src/config.rsthat resolves both paths at runtime with the following precedence:$INKO_STD/$INKO_RTenvironment variables (explicit override)<exe_dir>/../lib/inko/{std,runtime}if it exists, derived fromstd::env::current_exe()env!()value, as a last resort forcargo runfrom a source checkoutTest plan
pixi run lint—recipes/inko is in fine formosx-arm64build viapixi run build-osx osx_arm64inko check hello.inko(the test that originally surfaced the prefix-relocation bug)placehold_placeholdoccurrences, 0/lib/inko/runtimebaked literals, 2/nonexistent/inkofallback literalsChecklist
LICENSE+THIRDPARTY.ymlfromcargo-bundle-licenses)THIRDPARTY.yml)libinko.a) — this is a language runtime that the inko compiler links into every program it produces, so the static-only distribution is intentional and not subject to CFEP-18's "use shared libs where possible" guidanceurl) is used