diff --git a/nimjl/config.nim b/nimjl/config.nim index 6e28207..718edf2 100644 --- a/nimjl/config.nim +++ b/nimjl/config.nim @@ -1,5 +1,7 @@ -import std/os -import std/strutils +import std/[os, strutils, strformat] + +when defined(windows): + {.error: "Compilation on windows is not supported.".} proc JuliaBinPath*() : string {.compileTime.} = gorge("julia -E Sys.BINDIR").replace("\"", "") @@ -14,23 +16,49 @@ const JuliaHeader* = "julia.h" const JuliaLibPath* = JuliaPath / "lib" const JuliaDepPath* = JuliaPath / "lib" / "julia" -const JlVersionCmd = JuliaPath / "bin" / "julia" & " -E VERSION" -const (cmdOutput, exitCode) = gorgeEx(JlVersionCmd) -static: - echo "Nimjl> ", JuliaPath -when exitCode != 0: - {.error: "Nimjl> Fatal error ! Julia could not be found on your system.".} +const libPrefix = "lib" +when defined(osx): + const libSuffix = ".dylib" +else: + const libSuffix = ".so" + +const JuliaLibName* = JuliaLibPath / libPrefix & "julia" & libSuffix + +when defined(nimjl_cross_compile): + # This will use bash to extract the version from the naming of the file + # It's less robust and thus not preferred but necessary for cross-compilation + const + JuliaLibPattern = JuliaLibPath / libPrefix & "julia*" & libSuffix + prefixLen = len(libPrefix)+len("julia")+1 # length of the string 'libjulia.' + suffixLen = len(libSuffix) + + const JlVersionCmd = &"fullname=$(echo {JuliaLibPath}/libjulia.*.*.*.dylib); name=$(basename ${{fullname}}); vers=${{name:{prefixLen}:{suffixLen} }}; echo $vers" + const (cmdOutput, exitCode) = gorgeEx(JlVersionCmd) + when exitCode != 0: + {.error: "Nimjl> Fatal error ! Julia could not be found on your system.".} + # The bash line is just paramters expansion + string substitution to extract the version from the name + # This assumes the files is always called : libjulia.so OR libjulia.dylib for osx + const JuliaArrayVersion* = cmdOutput.split(".") + const JuliaMajorVersion* = JuliaArrayVersion[0].parseInt() + const JuliaMinorVersion* = JuliaArrayVersion[1].parseInt() + const JuliaPatchVersion* = JuliaArrayVersion[2].parseInt() -const JuliaArrayVersion* = cmdOutput.split("\"")[1].split(".") +else: + const JlVersionCmd = JuliaPath / "bin" / "julia" & " -E VERSION" + const (cmdOutput, exitCode) = gorgeEx(JlVersionCmd) + when exitCode != 0: + {.error: "Nimjl> Fatal error ! Julia could not be found on your system.".} + const JuliaArrayVersion* = cmdOutput.split("\"")[1].split(".") # For release : result has the form ["v", "1.6.0", ""] -> splitting [1] yields ["1", "6, "0"] # For dev: result has the form ["v", "1.7.0-DEV", "667"] -> splitting [1] yields ["1", "7, "0-DEV", "667"] -const JuliaMajorVersion* = JuliaArrayVersion[0].parseInt() -const JuliaMinorVersion* = JuliaArrayVersion[1].parseInt() -const JuliaPatchVersion* = JuliaArrayVersion[2].parseInt() -const libPrefix = "lib" -const libSuffix = ".so" -const JuliaLibName* = JuliaLibPath / libPrefix & "julia" & libSuffix + const JuliaMajorVersion* = JuliaArrayVersion[0].parseInt() + const JuliaMinorVersion* = JuliaArrayVersion[1].parseInt() + const JuliaPatchVersion* = JuliaArrayVersion[2].parseInt() + +static: + echo "Nimjl> ", JuliaPath, ", version:", JuliaMajorVersion, ".", JuliaMinorVersion, ".", JuliaPatchVersion + # TODO: handle more platform {.passC: " -DJulia_ENABLE_THREADING=1".} @@ -46,4 +74,3 @@ const JuliaLibName* = JuliaLibPath / libPrefix & "julia" & libSuffix when (JuliaMajorVersion, JuliaMinorVersion) == (1, 6): const internalJuliaLibName* = JuliaDepPath / libPrefix & "julia-internal" & libSuffix {.passL: "-ljulia-internal".} -