diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c327657..0d27146 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -17,12 +17,17 @@ jobs: matrix: version: ['1.6', '1'] os: ['ubuntu-latest', 'macOS-latest', 'windows-latest'] + arch: [x64] + include: + - version: '1' + os: macos-14 + arch: aarch64 steps: - uses: actions/checkout@v4 - uses: julia-actions/setup-julia@v1 with: version: ${{ matrix.version }} - arch: 'x64' + arch: ${{ matrix.arch }} - uses: julia-actions/cache@v1 - shell: bash env: diff --git a/deps/build.jl b/deps/build.jl index d2af7cd..8d04c4c 100644 --- a/deps/build.jl +++ b/deps/build.jl @@ -43,17 +43,29 @@ end function try_ci_installation() local_filename = joinpath(@__DIR__, "knitro14.zip") - download(ENV["SECRET_KNITRO_ZIP"], local_filename) - if Sys.islinux() - run(`unzip knitro14.zip`) - write_depsfile("", joinpath(@__DIR__, "libknitro1400.so")) + # If these files exist, it is because they have been cached from a separate + # CI job. + if !isfile(local_filename) + download(ENV["SECRET_KNITRO_ZIP"], local_filename) + end + if !isfile("libknitro1400.so") + if Sys.islinux() + run(`unzip knitro14.zip`) + elseif Sys.isapple() + run(`tar -xf knitro14.zip`) + elseif Sys.iswindows() + run(`tar -xf knitro14.zip`) + end + end + filename = if Sys.islinux() + "libknitro1400.so" elseif Sys.isapple() - run(`tar -xf knitro14.zip`) - write_depsfile("", joinpath(@__DIR__, "libknitro1400.dylib")) - elseif Sys.iswindows() - run(`tar -xf knitro14.zip`) - write_depsfile("", joinpath(@__DIR__, "knitro1400.dll")) + joinpath(Sys.ARCH == :x86_64 ? "" : "mac-arm", "libknitro1400.dylib") + else + @assert Sys.iswindows() + "knitro1400.dll" end + write_depsfile("", joinpath(@__DIR__, filename)) return end diff --git a/src/KNITRO.jl b/src/KNITRO.jl index 1230961..e7bbfb3 100644 --- a/src/KNITRO.jl +++ b/src/KNITRO.jl @@ -19,9 +19,12 @@ end has_knitro() = endswith(libknitro, Libdl.dlext) function __init__() - libiomp5 = replace(libknitro, r"libknitro[0-9]+\." => "libiomp5.") - if isfile(libiomp5) - Libdl.dlopen(libiomp5) + for libiomp_name in ("libiomp5.", "libiomp.", "libiomp5md.") + libiomp = replace(libknitro, r"libknitro[0-9]+\." => libiomp_name) + if isfile(libiomp) + Libdl.dlopen(libiomp) + break + end end version = has_knitro() ? knitro_version() : v"0.0.0" if version != v"0.0.0" && version < v"11.0"