From 12baf1b03ccaae74c01aa6e0fff92cbddc932019 Mon Sep 17 00:00:00 2001 From: martinjrobins Date: Tue, 30 Jun 2026 16:03:27 +0000 Subject: [PATCH 1/9] chore: update deps --- .github/workflows/ci.yml | 1 + diffsl-backend/Cargo.toml | 6 +++- diffsl/Cargo.toml | 36 +++++++++++++---------- diffsl/src/execution/cranelift/codegen.rs | 10 +++---- diffsl/src/lib.rs | 4 +++ 5 files changed, 35 insertions(+), 22 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 608a1dce..8b38a3be 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -44,6 +44,7 @@ jobs: - ["19.1", "19-1", "191", "19"] - ["20.1", "20-1", "201", "20"] - ["21.1", "21-1", "211", "21"] + - ["22.1", "22-1", "221", "22"] toolchain: - stable os: diff --git a/diffsl-backend/Cargo.toml b/diffsl-backend/Cargo.toml index 2191a44e..24b3a1d2 100644 --- a/diffsl-backend/Cargo.toml +++ b/diffsl-backend/Cargo.toml @@ -12,7 +12,11 @@ llvm15-0 = ["diffsl/llvm15-0"] llvm16-0 = ["diffsl/llvm16-0"] llvm17-0 = ["diffsl/llvm17-0"] llvm18-1 = ["diffsl/llvm18-1"] +llvm19-1 = ["diffsl/llvm19-1"] +llvm20-1 = ["diffsl/llvm20-1"] +llvm21-1 = ["diffsl/llvm21-1"] +llvm22-1 = ["diffsl/llvm22-1"] [dependencies] -axum = "0.8.6" +axum = "0.8.9" diffsl = { path = "../diffsl", features = [] } diff --git a/diffsl/Cargo.toml b/diffsl/Cargo.toml index a80576de..7d95608b 100644 --- a/diffsl/Cargo.toml +++ b/diffsl/Cargo.toml @@ -19,6 +19,7 @@ llvm18-1 = ["inkwell-181", "llvm-sys-181", "llvm", "enzyme"] llvm19-1 = ["inkwell-191", "llvm-sys-191", "llvm", "enzyme"] llvm20-1 = ["inkwell-201", "llvm-sys-201", "llvm", "enzyme"] llvm21-1 = ["inkwell-211", "llvm-sys-211", "llvm", "enzyme"] +llvm22-1 = ["inkwell-221", "llvm-sys-221", "llvm", "enzyme"] enzyme = ["bindgen", "cmake"] llvm = [] external_f64 = ["external"] @@ -36,34 +37,37 @@ test_compile = [] rayon = ["dep:rayon"] [dependencies] -ndarray = { version = "=0.17" } +ndarray = { version = "0.17" } anyhow = "1.0" approx = "0.5" pest = "2.8" pest_derive = "2.8" -itertools = "0.14.0" +itertools = "0.15" uid = "0.1.8" -inkwell-150 = { package = "inkwell", version = "0.7.1", features = [ +inkwell-150 = { package = "inkwell", version = "0.9.0", features = [ "llvm15-0", ], optional = true } -inkwell-160 = { package = "inkwell", version = "0.7.1", features = [ +inkwell-160 = { package = "inkwell", version = "0.9.0", features = [ "llvm16-0", ], optional = true } -inkwell-170 = { package = "inkwell", version = "0.7.1", features = [ +inkwell-170 = { package = "inkwell", version = "0.9.0", features = [ "llvm17-0", ], optional = true } -inkwell-181 = { package = "inkwell", version = "0.7.1", features = [ +inkwell-181 = { package = "inkwell", version = "0.9.0", features = [ "llvm18-1", ], optional = true } -inkwell-191 = { package = "inkwell", version = "0.7.1", features = [ +inkwell-191 = { package = "inkwell", version = "0.9.0", features = [ "llvm19-1", ], optional = true } -inkwell-201 = { package = "inkwell", version = "0.7.1", features = [ +inkwell-201 = { package = "inkwell", version = "0.9.0", features = [ "llvm20-1", ], optional = true } -inkwell-211 = { package = "inkwell", version = "0.7.1", features = [ +inkwell-211 = { package = "inkwell", version = "0.9.0", features = [ "llvm21-1", ], optional = true } +inkwell-221 = { package = "inkwell", version = "0.9.0", features = [ + "llvm22-1", +], optional = true } llvm-sys-150 = { package = "llvm-sys", version = "150.2.1", optional = true } llvm-sys-160 = { package = "llvm-sys", version = "160.2.1", optional = true } llvm-sys-170 = { package = "llvm-sys", version = "170.4.0", optional = true } @@ -71,18 +75,18 @@ llvm-sys-181 = { package = "llvm-sys", version = "181.3.0", optional = true } llvm-sys-191 = { package = "llvm-sys", version = "191.1.0", optional = true } llvm-sys-201 = { package = "llvm-sys", version = "201.0.0", optional = true } llvm-sys-211 = { package = "llvm-sys", version = "211.0.0", optional = true } -inkwell_internals = { version = "0.11.0", optional = true } -cranelift = { version = "0.125", optional = true } -cranelift-module = { version = "0.125", optional = true } -cranelift-object = { version = "0.125", optional = true } -cranelift-jit = { version = "0.125", optional = true } -cranelift-native = { version = "0.125", optional = true } +llvm-sys-221 = { package = "llvm-sys", version = "221.0.0", optional = true } +cranelift = { version = "0.133", optional = true } +cranelift-module = { version = "0.133", optional = true } +cranelift-object = { version = "0.133", optional = true } +cranelift-jit = { version = "0.133", optional = true } +cranelift-native = { version = "0.133", optional = true } target-lexicon = "0.13" aliasable = "0.1.3" rayon = { version = "1.10.0", optional = true } lazy_static = "1.5.0" serde = "1.0" -object = "0.37" +object = "0.39" libc = "0.2" num-traits = "0.2" log = "0.4.29" diff --git a/diffsl/src/execution/cranelift/codegen.rs b/diffsl/src/execution/cranelift/codegen.rs index 887a1f44..b03ec541 100644 --- a/diffsl/src/execution/cranelift/codegen.rs +++ b/diffsl/src/execution/cranelift/codegen.rs @@ -104,7 +104,7 @@ impl CraneliftModule { let zero = builder.ins().iconst(self.int_type, 0); builder .ins() - .store(MemFlags::new(), zero, thread_counter, 0); + .store(MemFlagsData::new(), zero, thread_counter, 0); builder.ins().return_(&[]); builder.finalize(); @@ -157,7 +157,7 @@ impl CraneliftModule { let one = builder.ins().iconst(self.int_type, 1); builder.ins().atomic_rmw( self.int_type, - MemFlags::new(), + MemFlagsData::new(), AtomicRmwOp::Add, thread_counter, one, @@ -170,7 +170,7 @@ impl CraneliftModule { let current_value = builder .ins() - .atomic_load(self.int_type, MemFlags::new(), thread_counter); + .atomic_load(self.int_type, MemFlagsData::new(), thread_counter); let all_threads_done = builder.ins().icmp( IntCC::UnsignedGreaterThanOrEqual, @@ -1285,7 +1285,7 @@ struct CraneliftCodeGen<'a, M: Module> { module: MutexGuard<'a, M>, tensor_ptr: Option, variables: HashMap, - mem_flags: MemFlags, + mem_flags: MemFlagsData, functions: HashMap, layout: &'a DataLayout, indices: GlobalValue, @@ -2650,7 +2650,7 @@ impl<'ctx, M: Module> CraneliftCodeGen<'ctx, M> { indices, constants, variables: HashMap::new(), - mem_flags: MemFlags::new(), + mem_flags: MemFlagsData::new(), functions: HashMap::new(), layout: &module.layout, threaded: module.threaded, diff --git a/diffsl/src/lib.rs b/diffsl/src/lib.rs index ee133496..c25c48cc 100644 --- a/diffsl/src/lib.rs +++ b/diffsl/src/lib.rs @@ -39,6 +39,8 @@ extern crate inkwell_191 as inkwell; extern crate inkwell_201 as inkwell; #[cfg(feature = "inkwell-211")] extern crate inkwell_211 as inkwell; +#[cfg(feature = "inkwell-221")] +extern crate inkwell_221 as inkwell; #[cfg(feature = "inkwell-150")] extern crate llvm_sys_150 as llvm_sys; @@ -54,3 +56,5 @@ extern crate llvm_sys_191 as llvm_sys; extern crate llvm_sys_201 as llvm_sys; #[cfg(feature = "inkwell-211")] extern crate llvm_sys_211 as llvm_sys; +#[cfg(feature = "inkwell-221")] +extern crate llvm_sys_221 as llvm_sys; From 02abcffc06b5257fd5198ade753eea9e0ab672b0 Mon Sep 17 00:00:00 2001 From: martinjrobins Date: Tue, 30 Jun 2026 16:53:37 +0000 Subject: [PATCH 2/9] fix: instruction combine opt does not check fixed point (llvm 22) --- diffsl/src/execution/llvm/codegen.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/diffsl/src/execution/llvm/codegen.rs b/diffsl/src/execution/llvm/codegen.rs index 9f8e0ade..8d0e340c 100644 --- a/diffsl/src/execution/llvm/codegen.rs +++ b/diffsl/src/execution/llvm/codegen.rs @@ -191,7 +191,7 @@ impl LlvmModule { // .map_err(|e| anyhow!("Failed to print module to file: {:?}", e))?; //let passes = "default"; - let passes = "annotation2metadata,forceattrs,inferattrs,coro-early,function(lower-expect,simplifycfg,early-cse<>),openmp-opt,ipsccp,called-value-propagation,globalopt,function(mem2reg),function(instcombine,simplifycfg),require,function(invalidate),require,cgscc(devirt<4>(inline,inline,function-attrs,openmp-opt-cgscc,function(early-cse,speculative-execution,jump-threading,correlated-propagation,simplifycfg,instcombine,libcalls-shrinkwrap,tailcallelim,simplifycfg,reassociate,require,loop-mssa(loop-instsimplify,loop-simplifycfg,licm,loop-rotate,licm,simple-loop-unswitch),simplifycfg,instcombine,loop(loop-idiom,indvars,loop-deletion),vector-combine,mldst-motion,gvn<>,sccp,bdce,instcombine,jump-threading,correlated-propagation,adce,memcpyopt,dse,loop-mssa(licm),coro-elide,simplifycfg,instcombine),coro-split)),deadargelim,coro-cleanup,globalopt,globaldce,elim-avail-extern,rpo-function-attrs,recompute-globalsaa,function(float2int,lower-constant-intrinsics,loop(loop-rotate,loop-deletion),loop-distribute,inject-tli-mappings,loop-load-elim,instcombine,simplifycfg,vector-combine,instcombine,transform-warning,instcombine,require,loop-mssa(licm),alignment-from-assumptions,loop-sink,instsimplify,div-rem-pairs,tailcallelim,simplifycfg),globaldce,constmerge,cg-profile,rel-lookup-table-converter,function(annotation-remarks),verify"; + let passes = "annotation2metadata,forceattrs,inferattrs,coro-early,function(lower-expect,simplifycfg,early-cse<>),openmp-opt,ipsccp,called-value-propagation,globalopt,function(mem2reg),function(instcombine,simplifycfg),require,function(invalidate),require,cgscc(devirt<4>(inline,inline,function-attrs,openmp-opt-cgscc,function(early-cse,speculative-execution,jump-threading,correlated-propagation,simplifycfg,instcombine,libcalls-shrinkwrap,tailcallelim,simplifycfg,reassociate,require,loop-mssa(loop-instsimplify,loop-simplifycfg,licm,loop-rotate,licm,simple-loop-unswitch),simplifycfg,instcombine,loop(loop-idiom,indvars,loop-deletion),vector-combine,mldst-motion,gvn<>,sccp,bdce,instcombine,jump-threading,correlated-propagation,adce,memcpyopt,dse,loop-mssa(licm),coro-elide,simplifycfg,instcombine),coro-split)),deadargelim,coro-cleanup,globalopt,globaldce,elim-avail-extern,rpo-function-attrs,recompute-globalsaa,function(float2int,lower-constant-intrinsics,loop(loop-rotate,loop-deletion),loop-distribute,inject-tli-mappings,loop-load-elim,instcombine,simplifycfg,vector-combine,instcombine,transform-warning,instcombine,require,loop-mssa(licm),alignment-from-assumptions,loop-sink,instsimplify,div-rem-pairs,tailcallelim,simplifycfg),globaldce,constmerge,cg-profile,rel-lookup-table-converter,function(annotation-remarks),verify"; let (codegen, machine) = self.codegen_and_machine_mut(); codegen .module() From 4b34fe310cd5e83f534d591c5c1b2ac6e8418c39 Mon Sep 17 00:00:00 2001 From: martinjrobins Date: Tue, 30 Jun 2026 17:03:23 +0000 Subject: [PATCH 3/9] fix: prev fix only for llvm 22 --- diffsl/src/execution/llvm/codegen.rs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/diffsl/src/execution/llvm/codegen.rs b/diffsl/src/execution/llvm/codegen.rs index 8d0e340c..3de8029c 100644 --- a/diffsl/src/execution/llvm/codegen.rs +++ b/diffsl/src/execution/llvm/codegen.rs @@ -191,7 +191,12 @@ impl LlvmModule { // .map_err(|e| anyhow!("Failed to print module to file: {:?}", e))?; //let passes = "default"; - let passes = "annotation2metadata,forceattrs,inferattrs,coro-early,function(lower-expect,simplifycfg,early-cse<>),openmp-opt,ipsccp,called-value-propagation,globalopt,function(mem2reg),function(instcombine,simplifycfg),require,function(invalidate),require,cgscc(devirt<4>(inline,inline,function-attrs,openmp-opt-cgscc,function(early-cse,speculative-execution,jump-threading,correlated-propagation,simplifycfg,instcombine,libcalls-shrinkwrap,tailcallelim,simplifycfg,reassociate,require,loop-mssa(loop-instsimplify,loop-simplifycfg,licm,loop-rotate,licm,simple-loop-unswitch),simplifycfg,instcombine,loop(loop-idiom,indvars,loop-deletion),vector-combine,mldst-motion,gvn<>,sccp,bdce,instcombine,jump-threading,correlated-propagation,adce,memcpyopt,dse,loop-mssa(licm),coro-elide,simplifycfg,instcombine),coro-split)),deadargelim,coro-cleanup,globalopt,globaldce,elim-avail-extern,rpo-function-attrs,recompute-globalsaa,function(float2int,lower-constant-intrinsics,loop(loop-rotate,loop-deletion),loop-distribute,inject-tli-mappings,loop-load-elim,instcombine,simplifycfg,vector-combine,instcombine,transform-warning,instcombine,require,loop-mssa(licm),alignment-from-assumptions,loop-sink,instsimplify,div-rem-pairs,tailcallelim,simplifycfg),globaldce,constmerge,cg-profile,rel-lookup-table-converter,function(annotation-remarks),verify"; + let passes_base = "annotation2metadata,forceattrs,inferattrs,coro-early,function(lower-expect,simplifycfg,early-cse<>),openmp-opt,ipsccp,called-value-propagation,globalopt,function(mem2reg),function(instcombine,simplifycfg),require,function(invalidate),require,cgscc(devirt<4>(inline,inline,function-attrs,openmp-opt-cgscc,function(early-cse,speculative-execution,jump-threading,correlated-propagation,simplifycfg,instcombine,libcalls-shrinkwrap,tailcallelim,simplifycfg,reassociate,require,loop-mssa(loop-instsimplify,loop-simplifycfg,licm,loop-rotate,licm,simple-loop-unswitch),simplifycfg,instcombine,loop(loop-idiom,indvars,loop-deletion),vector-combine,mldst-motion,gvn<>,sccp,bdce,instcombine,jump-threading,correlated-propagation,adce,memcpyopt,dse,loop-mssa(licm),coro-elide,simplifycfg,instcombine),coro-split)),deadargelim,coro-cleanup,globalopt,globaldce,elim-avail-extern,rpo-function-attrs,recompute-globalsaa,function(float2int,lower-constant-intrinsics,loop(loop-rotate,loop-deletion),loop-distribute,inject-tli-mappings,loop-load-elim,instcombine,simplifycfg,vector-combine,instcombine,transform-warning,instcombine,require,loop-mssa(licm),alignment-from-assumptions,loop-sink,instsimplify,div-rem-pairs,tailcallelim,simplifycfg),globaldce,constmerge,cg-profile,rel-lookup-table-converter,function(annotation-remarks),verify"; + let passes = if cfg!(feature = "inkwell-221") { + passes_base.replace("instcombine", "instcombine") + } else { + passes_base.to_string() + }; let (codegen, machine) = self.codegen_and_machine_mut(); codegen .module() From 4d31a8925e9fd51fee1c3ef3f224ade3e8830961 Mon Sep 17 00:00:00 2001 From: martinjrobins Date: Tue, 30 Jun 2026 17:14:07 +0000 Subject: [PATCH 4/9] fix: compile error --- diffsl/src/execution/llvm/codegen.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/diffsl/src/execution/llvm/codegen.rs b/diffsl/src/execution/llvm/codegen.rs index 3de8029c..812869e6 100644 --- a/diffsl/src/execution/llvm/codegen.rs +++ b/diffsl/src/execution/llvm/codegen.rs @@ -200,7 +200,7 @@ impl LlvmModule { let (codegen, machine) = self.codegen_and_machine_mut(); codegen .module() - .run_passes(passes, machine, pass_options) + .run_passes(&passes, machine, pass_options) .map_err(|e| anyhow!("Failed to run passes: {:?}", e)) //let path = "jit_module_after_pre_autodiff_opt.ll"; From 2d2406d9af1adb3d089a7be62307789c79dda799 Mon Sep 17 00:00:00 2001 From: martinjrobins Date: Tue, 30 Jun 2026 18:22:00 +0000 Subject: [PATCH 5/9] fix: broaden libcurses.tbd sed pattern to match full SDK path on macOS --- .github/workflows/ci.yml | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8b38a3be..ad201280 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -178,6 +178,26 @@ jobs: sudo apt update wget http://security.ubuntu.com/ubuntu/pool/universe/n/ncurses/libtinfo5_6.3-2ubuntu0.1_amd64.deb sudo apt install ./libtinfo5_6.3-2ubuntu0.1_amd64.deb + - name: Workaround missing libcurses.tbd on macOS + if : matrix.os == 'macos-latest' && matrix.llvm != '' + run: | + SDK_PATH=$(xcrun --sdk macosx --show-sdk-path) + if [ ! -f "$SDK_PATH/usr/lib/libcurses.tbd" ] && [ -f "$SDK_PATH/usr/lib/libncurses.tbd" ]; then + # 1. Patch hardcoded libcurses.tbd paths in LLVM cmake config files + LLVM_PREFIX="${LLVM_PATH:-$GITHUB_WORKSPACE/llvm}" + LLVM_CMAKE_DIR="$LLVM_PREFIX/lib/cmake/llvm" + if [ -d "$LLVM_CMAKE_DIR" ]; then + grep -rl 'libcurses\.tbd' "$LLVM_CMAKE_DIR" 2>/dev/null | while IFS= read -r f; do + sed -i '' 's|libcurses\.tbd|libncurses.tbd|g' "$f" + done + fi + # 2. Provide a symlink via CMAKE_PREFIX_PATH so find_library(curses) + # can resolve to libncurses when the path is resolved dynamically + TMP_CURSES_DIR=$(mktemp -d) + mkdir -p "$TMP_CURSES_DIR/lib" + ln -s "$SDK_PATH/usr/lib/libncurses.tbd" "$TMP_CURSES_DIR/lib/libcurses.tbd" + echo "CMAKE_PREFIX_PATH=$TMP_CURSES_DIR" >> "$GITHUB_ENV" + fi - name: Setup tmate session uses: mxschmitt/action-tmate@v3 if: ${{ github.event_name == 'workflow_dispatch' && inputs.debug_enabled }} From 44c5e120bf37c344e731a75cb8e1ee6b6803f0a4 Mon Sep 17 00:00:00 2001 From: martinjrobins Date: Tue, 30 Jun 2026 18:29:57 +0000 Subject: [PATCH 6/9] fix: patch libcurses.tbd references in build.rs to handle macOS 26 SDK --- .github/workflows/ci.yml | 6 +++--- diffsl/build.rs | 24 ++++++++++++++++++++++++ 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ad201280..c8f98d3c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -183,7 +183,8 @@ jobs: run: | SDK_PATH=$(xcrun --sdk macosx --show-sdk-path) if [ ! -f "$SDK_PATH/usr/lib/libcurses.tbd" ] && [ -f "$SDK_PATH/usr/lib/libncurses.tbd" ]; then - # 1. Patch hardcoded libcurses.tbd paths in LLVM cmake config files + # Patch hardcoded libcurses.tbd paths in LLVM cmake config files + # (build.rs also does this, but patch here for extra safety) LLVM_PREFIX="${LLVM_PATH:-$GITHUB_WORKSPACE/llvm}" LLVM_CMAKE_DIR="$LLVM_PREFIX/lib/cmake/llvm" if [ -d "$LLVM_CMAKE_DIR" ]; then @@ -191,8 +192,7 @@ jobs: sed -i '' 's|libcurses\.tbd|libncurses.tbd|g' "$f" done fi - # 2. Provide a symlink via CMAKE_PREFIX_PATH so find_library(curses) - # can resolve to libncurses when the path is resolved dynamically + # Provide a symlink for cmake find_library(curses) fallback TMP_CURSES_DIR=$(mktemp -d) mkdir -p "$TMP_CURSES_DIR/lib" ln -s "$SDK_PATH/usr/lib/libncurses.tbd" "$TMP_CURSES_DIR/lib/libcurses.tbd" diff --git a/diffsl/build.rs b/diffsl/build.rs index cb83e04b..2cd0d259 100644 --- a/diffsl/build.rs +++ b/diffsl/build.rs @@ -6,8 +6,32 @@ mod enzyme { path::{Path, PathBuf}, }; + fn patch_libcurses(dir: &Path) { + if !dir.is_dir() { + return; + } + for entry in std::fs::read_dir(dir).into_iter().flatten().flatten() { + let path = entry.path(); + if path.is_dir() { + Self::patch_libcurses(&path); + } else if path.extension().is_some_and(|ext| ext == "cmake") { + if let Ok(content) = std::fs::read_to_string(&path) { + if content.contains("libcurses.tbd") { + let new_content = content.replace("libcurses.tbd", "libncurses.tbd"); + let _ = std::fs::write(&path, new_content); + } + } + } + } + } + fn compile_enzyme(llvm_lib_dir: String) -> (String, String) { let llvm_cmake_dir = format!("{llvm_lib_dir}/cmake/llvm"); + // macOS 26 SDK dropped libcurses.tbd; replace with libncurses in LLVM cmake exports + if cfg!(target_os = "macos") { + let cmake_root = Path::new(&llvm_lib_dir).join("cmake"); + Self::patch_libcurses(&cmake_root); + } let mut config = cmake::Config::new("Enzyme/enzyme"); config .define("ENZYME_STATIC_LIB", "ON") From 413b6dc0b46d3e40ad74d60ab1d4b216089cf319 Mon Sep 17 00:00:00 2001 From: martinjrobins Date: Tue, 30 Jun 2026 18:33:38 +0000 Subject: [PATCH 7/9] fix: install libcurses.tbd symlink in CI instead of patching cmake files --- .github/workflows/ci.yml | 22 ++++++++-------------- diffsl/build.rs | 24 ------------------------ 2 files changed, 8 insertions(+), 38 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c8f98d3c..767b6343 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -183,20 +183,14 @@ jobs: run: | SDK_PATH=$(xcrun --sdk macosx --show-sdk-path) if [ ! -f "$SDK_PATH/usr/lib/libcurses.tbd" ] && [ -f "$SDK_PATH/usr/lib/libncurses.tbd" ]; then - # Patch hardcoded libcurses.tbd paths in LLVM cmake config files - # (build.rs also does this, but patch here for extra safety) - LLVM_PREFIX="${LLVM_PATH:-$GITHUB_WORKSPACE/llvm}" - LLVM_CMAKE_DIR="$LLVM_PREFIX/lib/cmake/llvm" - if [ -d "$LLVM_CMAKE_DIR" ]; then - grep -rl 'libcurses\.tbd' "$LLVM_CMAKE_DIR" 2>/dev/null | while IFS= read -r f; do - sed -i '' 's|libcurses\.tbd|libncurses.tbd|g' "$f" - done - fi - # Provide a symlink for cmake find_library(curses) fallback - TMP_CURSES_DIR=$(mktemp -d) - mkdir -p "$TMP_CURSES_DIR/lib" - ln -s "$SDK_PATH/usr/lib/libncurses.tbd" "$TMP_CURSES_DIR/lib/libcurses.tbd" - echo "CMAKE_PREFIX_PATH=$TMP_CURSES_DIR" >> "$GITHUB_ENV" + # Create a libcurses.tbd -> libncurses.tbd symlink in a temp dir + # and add it to library/cmake search paths so both cmake and the + # linker can resolve the missing libcurses dependency. + CURSES_DIR=$(mktemp -d) + mkdir -p "$CURSES_DIR/usr/lib" + ln -s "$SDK_PATH/usr/lib/libncurses.tbd" "$CURSES_DIR/usr/lib/libcurses.tbd" + echo "CMAKE_PREFIX_PATH=$CURSES_DIR" >> "$GITHUB_ENV" + echo "LIBRARY_PATH=$CURSES_DIR/usr/lib:${LIBRARY_PATH:-}" >> "$GITHUB_ENV" fi - name: Setup tmate session uses: mxschmitt/action-tmate@v3 diff --git a/diffsl/build.rs b/diffsl/build.rs index 2cd0d259..cb83e04b 100644 --- a/diffsl/build.rs +++ b/diffsl/build.rs @@ -6,32 +6,8 @@ mod enzyme { path::{Path, PathBuf}, }; - fn patch_libcurses(dir: &Path) { - if !dir.is_dir() { - return; - } - for entry in std::fs::read_dir(dir).into_iter().flatten().flatten() { - let path = entry.path(); - if path.is_dir() { - Self::patch_libcurses(&path); - } else if path.extension().is_some_and(|ext| ext == "cmake") { - if let Ok(content) = std::fs::read_to_string(&path) { - if content.contains("libcurses.tbd") { - let new_content = content.replace("libcurses.tbd", "libncurses.tbd"); - let _ = std::fs::write(&path, new_content); - } - } - } - } - } - fn compile_enzyme(llvm_lib_dir: String) -> (String, String) { let llvm_cmake_dir = format!("{llvm_lib_dir}/cmake/llvm"); - // macOS 26 SDK dropped libcurses.tbd; replace with libncurses in LLVM cmake exports - if cfg!(target_os = "macos") { - let cmake_root = Path::new(&llvm_lib_dir).join("cmake"); - Self::patch_libcurses(&cmake_root); - } let mut config = cmake::Config::new("Enzyme/enzyme"); config .define("ENZYME_STATIC_LIB", "ON") From 77b9d480ed153edaa9edecccff4051c5ca61f320 Mon Sep 17 00:00:00 2001 From: martinjrobins Date: Tue, 30 Jun 2026 18:36:26 +0000 Subject: [PATCH 8/9] fix: remove duplicate libcurses workaround, keep main branch version --- .github/workflows/ci.yml | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7913dc4e..8d734bb8 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -178,20 +178,6 @@ jobs: sudo apt update wget http://security.ubuntu.com/ubuntu/pool/universe/n/ncurses/libtinfo5_6.3-2ubuntu0.1_amd64.deb sudo apt install ./libtinfo5_6.3-2ubuntu0.1_amd64.deb - - name: Workaround missing libcurses.tbd on macOS - if : matrix.os == 'macos-latest' && matrix.llvm != '' - run: | - SDK_PATH=$(xcrun --sdk macosx --show-sdk-path) - if [ ! -f "$SDK_PATH/usr/lib/libcurses.tbd" ] && [ -f "$SDK_PATH/usr/lib/libncurses.tbd" ]; then - # Create a libcurses.tbd -> libncurses.tbd symlink in a temp dir - # and add it to library/cmake search paths so both cmake and the - # linker can resolve the missing libcurses dependency. - CURSES_DIR=$(mktemp -d) - mkdir -p "$CURSES_DIR/usr/lib" - ln -s "$SDK_PATH/usr/lib/libncurses.tbd" "$CURSES_DIR/usr/lib/libcurses.tbd" - echo "CMAKE_PREFIX_PATH=$CURSES_DIR" >> "$GITHUB_ENV" - echo "LIBRARY_PATH=$CURSES_DIR/usr/lib:${LIBRARY_PATH:-}" >> "$GITHUB_ENV" - fi - name: Setup tmate session uses: mxschmitt/action-tmate@v3 if: ${{ github.event_name == 'workflow_dispatch' && inputs.debug_enabled }} From 3173cb380001721dba401c26d4e1f653b2e246b6 Mon Sep 17 00:00:00 2001 From: martinjrobins Date: Tue, 30 Jun 2026 18:41:45 +0000 Subject: [PATCH 9/9] fix: broaden sed pattern to match full SDK path for libcurses --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8d734bb8..a5cd499f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -191,7 +191,7 @@ jobs: LLVM_CMAKE_DIR="$LLVM_PREFIX/lib/cmake/llvm" if [ -d "$LLVM_CMAKE_DIR" ]; then grep -rl 'libcurses\.tbd' "$LLVM_CMAKE_DIR" 2>/dev/null | while IFS= read -r f; do - sed -i '' 's|/usr/lib/libcurses\.tbd|/usr/lib/libncurses.tbd|g' "$f" + sed -i '' 's|libcurses\.tbd|libncurses.tbd|g' "$f" done fi # 2. Provide a symlink via CMAKE_PREFIX_PATH so find_library(curses)