91 lines
2.9 KiB
Text
91 lines
2.9 KiB
Text
/-
|
||
Copyright (c) 2022 Mac Malone. All rights reserved.
|
||
Released under Apache 2.0 license as described in the file LICENSE.
|
||
Authors: Mac Malone
|
||
-/
|
||
import Lake.Build.Trace
|
||
import Lake.Config.Package
|
||
import Lake.Util.Name
|
||
|
||
namespace Lake
|
||
open Std System
|
||
|
||
/-- A buildable Lean module of a `Package`. -/
|
||
structure Module where
|
||
pkg : Package
|
||
name : WfName
|
||
deriving Inhabited
|
||
|
||
abbrev ModuleSet := RBTree Module (·.name.quickCmp ·.name)
|
||
@[inline] def ModuleSet.empty : ModuleSet := RBTree.empty
|
||
|
||
abbrev ModuleMap (α) := RBMap Module α (·.name.quickCmp ·.name)
|
||
@[inline] def ModuleMap.empty : ModuleMap α := RBMap.empty
|
||
|
||
/-- Locate the named module in the package (if it is local to it). -/
|
||
def Package.findModule? (mod : Name) (self : Package) : Option Module :=
|
||
let mod := WfName.ofName mod
|
||
if self.isBuildableModule mod then some ⟨self, mod⟩ else none
|
||
|
||
namespace Module
|
||
|
||
@[inline] def leanFile (self : Module) : FilePath :=
|
||
Lean.modToFilePath self.pkg.srcDir self.name "lean"
|
||
|
||
@[inline] def oleanFile (self : Module) : FilePath :=
|
||
Lean.modToFilePath self.pkg.oleanDir self.name "olean"
|
||
|
||
@[inline] def ileanFile (self : Module) : FilePath :=
|
||
Lean.modToFilePath self.pkg.oleanDir self.name "ilean"
|
||
|
||
@[inline] def traceFile (self : Module) : FilePath :=
|
||
Lean.modToFilePath self.pkg.oleanDir self.name "trace"
|
||
|
||
@[inline] def cFile (self : Module) : FilePath :=
|
||
Lean.modToFilePath self.pkg.irDir self.name "c"
|
||
|
||
@[inline] def cTraceFile (self : Module) : FilePath :=
|
||
Lean.modToFilePath self.pkg.irDir self.name "c.trace"
|
||
|
||
@[inline] def oFile (self : Module) : FilePath :=
|
||
Lean.modToFilePath self.pkg.irDir self.name "o"
|
||
|
||
@[inline] def dynlib (self : Module) : FilePath :=
|
||
-- NOTE: file name MUST be unique on Windows
|
||
self.name.toStringWithSep "-"
|
||
|
||
@[inline] def dynlibFile (self : Module) : FilePath :=
|
||
self.pkg.libDir / s!"lib{self.dynlib}.{sharedLibExt}"
|
||
|
||
@[inline] def leanArgs (self : Module) : Array String :=
|
||
self.pkg.moreLeanArgs
|
||
|
||
@[inline] def leancArgs (self : Module) : Array String :=
|
||
self.pkg.moreLeancArgs
|
||
|
||
@[inline] def linkArgs (self : Module) : Array String :=
|
||
-- TODO: derive link arguments from library, not package
|
||
self.pkg.config.moreLinkArgs
|
||
|
||
@[inline] def shouldPrecompile (self : Module) : Bool :=
|
||
self.pkg.precompileModules
|
||
|
||
@[inline] def isLeanOnly (self : Module) : Bool :=
|
||
self.pkg.isLeanOnly && !self.shouldPrecompile
|
||
|
||
-- ## Trace Helpers
|
||
|
||
protected def getMTime (self : Module) : IO MTime := do
|
||
return mixTrace (← getMTime self.oleanFile) (← getMTime self.ileanFile)
|
||
|
||
instance : GetMTime Module := ⟨Module.getMTime⟩
|
||
|
||
protected def computeHash (self : Module) : IO Hash := do
|
||
return mixTrace (← computeHash self.oleanFile) (← computeHash self.ileanFile)
|
||
|
||
instance : ComputeHash Module IO := ⟨Module.computeHash⟩
|
||
|
||
protected def checkExists (self : Module) : BaseIO Bool := do
|
||
return (← checkExists self.oleanFile) && (← checkExists self.ileanFile)
|
||
|
||
instance : CheckExists Module := ⟨Module.checkExists⟩
|