107 lines
3.9 KiB
Text
107 lines
3.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.Config.Package
|
|
|
|
namespace Lake
|
|
open Lean System
|
|
|
|
/-- A Lean library -- its package plus its configuration. -/
|
|
structure LeanLib where
|
|
/-- The package the library belongs to. -/
|
|
pkg : Package
|
|
/-- The library's user-defined configuration. -/
|
|
config : LeanLibConfig
|
|
deriving Inhabited
|
|
|
|
/-- The Lean libraries of the package (as an Array). -/
|
|
@[inline] def Package.leanLibs (self : Package) : Array LeanLib :=
|
|
self.leanLibConfigs.fold (fun a _ v => a.push (⟨self, v⟩)) #[]
|
|
|
|
/-- The Lean library built into the package. -/
|
|
@[inline] def Package.builtinLib (self : Package) : LeanLib :=
|
|
⟨self, self.builtinLibConfig⟩
|
|
|
|
/-- Try to find a Lean library in the package with the given name. -/
|
|
@[inline] def Package.findLeanLib? (name : Name) (self : Package) : Option LeanLib :=
|
|
self.leanLibConfigs.find? name |>.map (⟨self, ·⟩)
|
|
|
|
namespace LeanLib
|
|
|
|
/- The library's well-formed name. -/
|
|
@[inline] def name (self : LeanLib) : Name :=
|
|
self.config.name
|
|
|
|
/- The package's `srcDir` joined with the library's `srcDir`. -/
|
|
@[inline] def srcDir (self : LeanLib) : FilePath :=
|
|
self.pkg.srcDir / self.config.srcDir
|
|
|
|
/-- The library's root directory for `lean` (i.e., `srcDir`). -/
|
|
@[inline] def rootDir (self : LeanLib) : FilePath :=
|
|
self.srcDir
|
|
|
|
/-- Whether the given module is considered local to the library. -/
|
|
@[inline] def isLocalModule (mod : Name) (self : LeanLib) : Bool :=
|
|
self.config.isLocalModule mod
|
|
|
|
/-- Whether the given module is a buildable part of the library. -/
|
|
@[inline] def isBuildableModule (mod : Name) (self : LeanLib) : Bool :=
|
|
self.config.isBuildableModule mod
|
|
|
|
/-- The file name of the library's static binary (i.e., its `.a`) -/
|
|
@[inline] def staticLibFileName (self : LeanLib) : FilePath :=
|
|
nameToStaticLib self.config.libName
|
|
|
|
/-- The path to the static library in the package's `libDir`. -/
|
|
@[inline] def staticLibFile (self : LeanLib) : FilePath :=
|
|
self.pkg.libDir / self.staticLibFileName
|
|
|
|
/-- The file name of the library's shared binary (i.e., its `dll`, `dylib`, or `so`) . -/
|
|
@[inline] def sharedLibFileName (self : LeanLib) : FilePath :=
|
|
nameToSharedLib self.config.libName
|
|
|
|
/-- The path to the shared library in the package's `libDir`. -/
|
|
@[inline] def sharedLibFile (self : LeanLib) : FilePath :=
|
|
self.pkg.libDir / self.sharedLibFileName
|
|
|
|
/--
|
|
Whether to precompile the library's modules.
|
|
Is true if either the package or the library have `precompileModules` set.
|
|
-/
|
|
@[inline] def precompileModules (self : LeanLib) : Bool :=
|
|
self.pkg.precompileModules || self.config.precompileModules
|
|
|
|
/-- The library's `nativeFacets` configuration. -/
|
|
@[inline] def nativeFacets (self : LeanLib) : Array (ModuleFacet ActiveFileTarget) :=
|
|
self.config.nativeFacets
|
|
|
|
/--
|
|
The build type for modules of this library.
|
|
That is, the minimum of package's `buildType` and the library's `buildType`.
|
|
-/
|
|
@[inline] def buildType (self : LeanLib) : BuildType :=
|
|
min self.pkg.buildType self.config.buildType
|
|
|
|
/--
|
|
The arguments to pass to `lean` when compiling the library's Lean files.
|
|
That is, the package's `moreLeanArgs` plus the library's `moreLeanArgs`.
|
|
-/
|
|
@[inline] def leanArgs (self : LeanLib) : Array String :=
|
|
self.pkg.moreLeanArgs ++ self.config.moreLeanArgs
|
|
|
|
/--
|
|
The arguments to pass to `leanc` when compiling the library's C files.
|
|
That is, the build type's `leancArgs`, the package's `moreLeancArgs`,
|
|
and then the library's `moreLeancArgs`.
|
|
-/
|
|
@[inline] def leancArgs (self : LeanLib) : Array String :=
|
|
self.buildType.leancArgs ++ self.pkg.moreLeancArgs ++ self.config.moreLeancArgs
|
|
|
|
/--
|
|
The arguments to pass to `leanc` when linking the shared library.
|
|
That is, the package's `moreLinkArgs` plus the library's `moreLinkArgs`.
|
|
-/
|
|
@[inline] def linkArgs (self : LeanLib) : Array String :=
|
|
self.pkg.moreLinkArgs ++ self.config.moreLinkArgs
|