fix: properly link libraries on MacOS

This commit is contained in:
Mac 2022-06-25 21:46:01 -04:00 committed by GitHub
parent 6812bae11a
commit a8d1ff5fdc
3 changed files with 18 additions and 8 deletions

View file

@ -56,13 +56,19 @@ def compileLeanModule (leanFile : FilePath)
args := args ++ #["-c", cFile.toString]
for dynlib in dynlibs do
args := args.push s!"--load-dynlib={dynlib}"
let dynlibVar :=
if Platform.isWindows then
"PATH"
else if Platform.isOSX then
"DYLD_LIBRARY_PATH"
else
"LD_LIBRARY_PATH"
proc {
args
cmd := lean.toString
env := #[
("LEAN_PATH", oleanPath.toString),
("PATH", (← getSearchPath "PATH") ++ dynlibPath |>.toString), -- Windows
("LD_LIBRARY_PATH", (← getSearchPath "LD_LIBRARY_PATH") ++ dynlibPath |>.toString) -- Unix
(dynlibVar, (← getSearchPath dynlibVar) ++ dynlibPath |>.toString)
]
}

View file

@ -50,7 +50,7 @@ def Module.mkDynlibTarget (self : Module) (oTarget : FileTarget)
oTarget.bindAsync fun oFile oTrace => do
libsTarget.bindSync fun libFiles libTrace => do
buildFileUnlessUpToDate self.dynlibFile (oTrace.mix libTrace) do
let args := #[oFile.toString] ++ libDirs.map (s!"-L{·}") ++ libFiles.map (s!"-l:{·}")
let args := #[oFile.toString] ++ libDirs.map (s!"-L{·}") ++ libFiles.map (s!"-l{·}")
compileSharedLib self.dynlibFile args (← getLeanc)
-- # Recursive Building
@ -82,8 +82,11 @@ variable [Monad m] [MonadLiftT BuildM m] [MonadBuildStore m]
for target in externLibTargets do
if let some parent := target.info.parent then
libDirs := libDirs.push parent
if let some fileName := target.info.fileName then
pkgTargets := pkgTargets.push <| target.withInfo fileName
if let some stem := target.info.fileStem then
if stem.startsWith "lib" then
pkgTargets := pkgTargets.push <| target.withInfo <| stem.drop 3
else
logWarning s!"external library `{target.info}` was skipped because it does not start with `lib`"
else
logWarning s!"external library `{target.info}` was skipped because it has no file name"
return (modTargets, pkgTargets, libDirs)
@ -109,7 +112,8 @@ optionally outputting a `.c` file as well if `c` is set to `true`.
<| ← imports.mapM (·.recBuildFacet &`lean)
let depTarget := Target.active <| ← extraDepTarget.mixOpaqueAsync
<| ← dynlibsTarget.mixOpaqueAsync importTarget
let modTarget ← mod.soloTarget dynlibsTarget.info libDirs.toList depTarget c |>.activate
let dynlibs := dynlibsTarget.info.map (FilePath.mk s!"lib{·}.{sharedLibExt}")
let modTarget ← mod.soloTarget dynlibs libDirs.toList depTarget c |>.activate
store (mod.mkBuildKey &`lean) modTarget
store (mod.mkBuildKey &`olean) <| modTarget.withInfo mod.oleanFile
store (mod.mkBuildKey &`ilean) <| modTarget.withInfo mod.ileanFile

View file

@ -52,10 +52,10 @@ namespace Module
@[inline] def dynlib (self : Module) : FilePath :=
-- NOTE: file name MUST be unique on Windows
s!"{self.name}.{sharedLibExt}"
self.name.toStringWithSep "-"
@[inline] def dynlibFile (self : Module) : FilePath :=
self.pkg.libDir / self.dynlib
self.pkg.libDir / s!"lib{self.dynlib}.{sharedLibExt}"
@[inline] def leanArgs (self : Module) : Array String :=
self.pkg.moreLeanArgs