lean4-htt/Lake/Build/Library.lean

97 lines
3.4 KiB
Text
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/-
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.Targets
namespace Lake
/-! # Build Lean & Static Lib -/
/-- Build and collect the specified facet of the library's local modules. -/
def LeanLib.recBuildLocalModules
(facets : Array (ModuleFacet α)) (self : LeanLib) : IndexBuildM (Array α) := do
let mut results := #[]
let mut modSet := ModuleSet.empty
let mods ← self.getModuleArray
for mod in mods do
let (_, mods) ← mod.imports.recBuild
let mods := mods.push mod
for mod in mods do
if self.isLocalModule mod.name then
unless modSet.contains mod do
for facet in facets do
results := results.push <| ← recBuild <| mod.facet facet.name
modSet := modSet.insert mod
return results
protected def LeanLib.recBuildLean
(self : LeanLib) : IndexBuildM (BuildJob Unit) := do
BuildJob.mixArray (α := Unit) <| ← self.recBuildLocalModules #[Module.leanBinFacet]
/-- The `LibraryFacetConfig` for the builtin `leanFacet`. -/
def LeanLib.leanFacetConfig : LibraryFacetConfig leanFacet :=
mkFacetJobConfig (·.recBuildLean)
protected def LeanLib.recBuildStatic
(self : LeanLib) : IndexBuildM (BuildJob FilePath) := do
let oTargets := (← self.recBuildLocalModules self.nativeFacets).map Target.active
staticLibTarget self.staticLibFile oTargets |>.activate
/-- The `LibraryFacetConfig` for the builtin `staticFacet`. -/
def LeanLib.staticFacetConfig : LibraryFacetConfig staticFacet :=
mkFacetJobConfig (·.recBuildStatic)
/-! # Build Shared Lib -/
/--
Build and collect the local object files and external libraries
of a library and its modules' imports.
-/
def LeanLib.recBuildLinks
(self : LeanLib) : IndexBuildM (Array (BuildJob FilePath)) := do
-- Build and collect modules
let mut jobs := #[]
let mut pkgs := #[]
let mut pkgSet := PackageSet.empty
let mut modSet := ModuleSet.empty
let mods ← self.getModuleArray
for mod in mods do
let (_, mods) ← mod.imports.recBuild
let mods := mods.push mod
for mod in mods do
unless modSet.contains mod do
unless pkgSet.contains mod.pkg do
pkgSet := pkgSet.insert mod.pkg
pkgs := pkgs.push mod.pkg
if self.isLocalModule mod.name then
for facet in self.nativeFacets do
jobs := jobs.push <| ← recBuild <| mod.facet facet.name
modSet := modSet.insert mod
-- Build and collect external library jobs
for pkg in pkgs do
let externLibJobs ← pkg.externLibs.mapM (·.shared.recBuild)
for job in externLibJobs do
jobs := jobs.push job
return jobs
protected def LeanLib.recBuildShared
(self : LeanLib) : IndexBuildM (BuildJob FilePath) := do
let linkJobs := (← self.recBuildLinks).map Target.active
leanSharedLibTarget self.sharedLibFile linkJobs self.linkArgs |>.activate
/-- The `LibraryFacetConfig` for the builtin `sharedFacet`. -/
def LeanLib.sharedFacetConfig : LibraryFacetConfig sharedFacet :=
mkFacetJobConfig (·.recBuildShared)
open LeanLib in
/--
A library facet name to build function map that contains builders for
the initial set of Lake package facets (e.g., `lean`, `static`, and `shared`).
-/
def initLibraryFacetConfigs : DNameMap LibraryFacetConfig :=
DNameMap.empty
|>.insert leanFacet leanFacetConfig
|>.insert staticFacet staticFacetConfig
|>.insert sharedFacet sharedFacetConfig