Skip to content
Draft
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
59 changes: 43 additions & 16 deletions nimjl/config.nim
Original file line number Diff line number Diff line change
@@ -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("\"", "")
Expand All @@ -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".}
Expand All @@ -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".}

Loading