Skip to content
This repository was archived by the owner on Oct 25, 2023. It is now read-only.

Commit 696e46d

Browse files
committed
refactor: move lib/exe targets into the index
1 parent d169be0 commit 696e46d

16 files changed

+307
-148
lines changed

Diff for: Lake/Build.lean

+1-2
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,5 @@ Authors: Mac Malone
55
-/
66
import Lake.Build.Monad
77
import Lake.Build.Actions
8-
import Lake.Build.LeanLib
9-
import Lake.Build.LeanExe
8+
import Lake.Build.LeanTarget
109
import Lake.Build.Imports

Diff for: Lake/Build/Data.lean

+17-6
Original file line numberDiff line numberDiff line change
@@ -23,21 +23,20 @@ opaque ModuleData (facet : WfName) : Type
2323
opaque PackageData (facet : WfName) : Type
2424

2525
/-- Type of build data associated with Lake targets (e.g., `extern_lib`). -/
26-
opaque TargetData (key : BuildKey) : Type
27-
26+
opaque TargetData (facet : WfName) : Type
2827

2928
/--
3029
Type of the build data associated with a key in the Lake build store.
3130
It is dynamic type composed of the three separate dynamic types for modules,
3231
packages, and targets.
3332
-/
34-
def BuildData (key : BuildKey) :=
33+
abbrev BuildData (key : BuildKey) :=
3534
if key.isModuleKey then
3635
ModuleData key.facet
3736
else if key.isPackageKey then
3837
PackageData key.facet
3938
else
40-
TargetData key
39+
TargetData key.facet
4140

4241
theorem isModuleKey_data {k : BuildKey}
4342
(h : k.isModuleKey = true) : BuildData k = ModuleData k.facet := by
@@ -52,15 +51,20 @@ instance (k : ModuleBuildKey f)
5251
theorem isPackageKey_data {k : BuildKey}
5352
(h : k.isPackageKey = true) : BuildData k = PackageData k.facet := by
5453
unfold BuildData, BuildKey.isModuleKey
55-
have has_pkg := of_decide_eq_true (of_decide_eq_true h |>.1)
56-
simp [has_pkg, h]
54+
simp [of_decide_eq_true (of_decide_eq_true h |>.1), h]
5755

5856
instance (k : PackageBuildKey f)
5957
[t : DynamicType PackageData f α] : DynamicType BuildData k α where
6058
eq_dynamic_type := by
6159
have h := isPackageKey_data k.is_package_key
6260
simp [h, k.facet_eq_fixed, t.eq_dynamic_type]
6361

62+
theorem isTargetKey_data {k : BuildKey}
63+
(h : k.isTargetKey = true) : BuildData k = TargetData k.facet := by
64+
unfold BuildData, BuildKey.isModuleKey, BuildKey.isPackageKey
65+
have ⟨has_p, has_t⟩ := of_decide_eq_true h
66+
simp [of_decide_eq_true has_p, of_decide_eq_true has_t, h]
67+
6468
/-- Macro for declaring new `PackageData`. -/
6569
scoped macro (name := packageDataDecl) doc?:optional(Parser.Command.docComment)
6670
"package_data " id:ident " : " ty:term : command => do
@@ -74,3 +78,10 @@ scoped macro (name := moduleDataDecl) doc?:optional(Parser.Command.docComment)
7478
let dty := mkCIdentFrom (← getRef) ``ModuleData
7579
let key := WfName.quoteFrom id <| WfName.ofName <| id.getId
7680
`($[$doc?]? dynamic_data $id : $dty $key := $ty)
81+
82+
/-- Macro for declaring new `TargetData`. -/
83+
scoped macro (name := targetDataDecl) doc?:optional(Parser.Command.docComment)
84+
"target_data " id:ident " : " ty:term : command => do
85+
let dty := mkCIdentFrom (← getRef) ``TargetData
86+
let key := WfName.quoteFrom id <| WfName.ofName <| id.getId
87+
`($[$doc?]? dynamic_data $id : $dty $key := $ty)

Diff for: Lake/Build/Imports.lean

+3-3
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ as "Lean-only". Otherwise, also build `.c` files.
3636
def Package.buildImportsAndDeps (imports : List String) (self : Package) : BuildM (Array FilePath) := do
3737
if imports.isEmpty then
3838
-- build the package's (and its dependencies') `extraDepTarget`
39-
buildPackageFacet self &`extraDep >>= (·.buildOpaque)
39+
self.buildFacet &`extraDep >>= (·.buildOpaque)
4040
return #[]
4141
else
4242
-- build local imports from list
@@ -50,9 +50,9 @@ def Package.buildImportsAndDeps (imports : List String) (self : Package) : Build
5050
buildModuleTop mod &`lean.c <&> (·.withoutInfo)
5151
let importTargets ← failOnBuildCycle res
5252
let dynlibTargets := bStore.collectModuleFacetArray &`lean.dynlib
53-
let externLibTargets := bStore.collectPackageFacetArray &`externSharedLibs
53+
let externLibTargets := bStore.collectSharedExternLibs
5454
importTargets.forM (·.buildOpaque)
5555
let dynlibs ← dynlibTargets.mapM (·.build)
56-
let externLibs ← externLibTargets.concatMapM (·.mapM (·.build))
56+
let externLibs ← externLibTargets.mapM (·.build)
5757
-- Note: Lean wants the external library symbols before module symbols
5858
return externLibs ++ dynlibs

Diff for: Lake/Build/Index.lean

+31-13
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
44
Authors: Mac Malone
55
-/
66
import Lake.Build.Module1
7+
import Lake.Build.LeanTarget1
78
import Lake.Build.Topological
89
import Lake.Util.EStateT
910

@@ -38,6 +39,13 @@ abbrev PackageBuildMap (m : Type → Type v) :=
3839

3940
@[inline] def PackageBuildMap.empty : PackageBuildMap m := DRBMap.empty
4041

42+
/-- A map from target facet names to build functions. -/
43+
abbrev TargetBuildMap (m : TypeType v) :=
44+
DRBMap WfName (cmp := WfName.quickCmp) fun k =>
45+
Package → IndexBuildFn m → m (PackageData k)
46+
47+
@[inline] def TargetBuildMap.empty : PackageBuildMap m := DRBMap.empty
48+
4149
/-!
4250
## Build Function Constructor Helpers
4351
-/
@@ -58,6 +66,14 @@ dynamically typed equivalent.
5866
[h : DynamicType PackageData facet α] : Package → IndexT m (PackageData facet) :=
5967
cast (by rw [← h.eq_dynamic_type]) build
6068

69+
/--
70+
Converts a conveniently typed target build function into its
71+
dynamically typed equivalent.
72+
-/
73+
@[inline] def mkTargetBuild (facet : WfName) (build : IndexT m α)
74+
[h : DynamicType TargetData facet α] : IndexT m (TargetData facet) :=
75+
cast (by rw [← h.eq_dynamic_type]) build
76+
6177
section
6278
variable [Monad m] [MonadLiftT BuildM m] [MonadBuildStore m]
6379

@@ -127,15 +143,6 @@ the initial set of Lake package facets (e.g., `extraDep`).
127143
target ← target.mixOpaqueAsync extraDepTarget
128144
target.mixOpaqueAsync <| ← pkg.extraDepTarget.activate
129145
)
130-
-- Build the `extern_lib` targets of the package
131-
|>.insert &`externSharedLibs (mkPackageFacetBuild <| fun pkg => do
132-
let mut targets := #[]
133-
for (_, config) in pkg.externLibConfigs.toList do
134-
let target := staticToLeanDynlibTarget config.target
135-
targets := targets.push <| ← target.activate
136-
return targets
137-
)
138-
139146
/-!
140147
## Topologically-based Recursive Build Using the Index
141148
-/
@@ -154,6 +161,16 @@ the initial set of Lake package facets (e.g., `extraDep`).
154161
build pkg
155162
else
156163
error s!"do not know how to build package facet `{facet}`"
164+
| .staticLeanLib lib =>
165+
mkTargetBuild &`leanLib.static lib.recBuildStatic
166+
| .sharedLeanLib lib =>
167+
mkTargetBuild &`leanLib.shared lib.recBuildShared
168+
| .leanExe exe =>
169+
mkTargetBuild &`leanExe exe.recBuild
170+
| .staticExternLib lib =>
171+
mkTargetBuild &`externLib.static <| lib.target.activate
172+
| .sharedExternLib lib =>
173+
mkTargetBuild &`externLib.shared <| staticToLeanDynlibTarget (lib.target) |>.activate
157174
| _ =>
158175
error s!"do not know how to build `{info.key}`"
159176

@@ -171,7 +188,9 @@ of the top-level build.
171188
-/
172189
@[inline] def buildPackageTop (pkg : Package) (facet : WfName)
173190
[h : DynamicType PackageData facet α] : CycleT BuildKey m α :=
174-
have of_data := by unfold BuildData, BuildInfo.key; simp [h.eq_dynamic_type]
191+
have of_data := by
192+
unfold BuildData, BuildInfo.key, Package.mkBuildKey
193+
simp [h.eq_dynamic_type]
175194
cast of_data <| buildIndexTop (m := m) <| BuildInfo.package pkg facet
176195

177196
end
@@ -184,8 +203,7 @@ end
184203
Recursively build the specified facet of the given package,
185204
returning the result.
186205
-/
187-
def buildPackageFacet
188-
(pkg : Package) (facet : WfName)
206+
def Package.buildFacet (self : Package) (facet : WfName)
189207
[DynamicType PackageData facet α] : BuildM α := do
190208
failOnBuildCycle <| ← EStateT.run' BuildStore.empty do
191-
buildPackageTop pkg facet
209+
buildPackageTop self facet

Diff for: Lake/Build/Info.lean

+64-10
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@ Released under Apache 2.0 license as described in the file LICENSE.
44
Authors: Mac Malone
55
-/
66
import Lake.Build.Data
7-
import Lake.Config.Module
7+
import Lake.Config.LeanExe
8+
import Lake.Config.ExternLib
89
import Lake.Util.EquipT
910

1011
namespace Lake
@@ -17,17 +18,42 @@ namespace Lake
1718
@[inline] def Package.mkBuildKey (facet : WfName) (self : Package) : PackageBuildKey facet :=
1819
⟨⟨self.name, none, facet⟩, rfl, rfl⟩
1920

21+
abbrev LeanLib.staticBuildKey (self : LeanLib) : BuildKey :=
22+
⟨self.pkg.name, self.name, &`leanLib.static⟩
23+
24+
abbrev LeanLib.sharedBuildKey (self : LeanLib) : BuildKey :=
25+
⟨self.pkg.name, self.name, &`leanLib.shared⟩
26+
27+
abbrev LeanExe.buildKey (self : LeanExe) : BuildKey :=
28+
⟨self.pkg.name, self.name, &`leanExe⟩
29+
30+
abbrev ExternLib.staticBuildKey (self : ExternLib) : BuildKey :=
31+
⟨self.pkg.name, self.name, &`externLib.static⟩
32+
33+
abbrev ExternLib.sharedBuildKey (self : ExternLib) : BuildKey :=
34+
⟨self.pkg.name, self.name, &`externLib.shared⟩
35+
2036
-- # Build Info
2137

2238
/-- The type of Lake's build info. -/
2339
inductive BuildInfo
2440
| module (module : Module) (facet : WfName)
2541
| package (package : Package) (facet : WfName)
42+
| staticLeanLib (lib : LeanLib)
43+
| sharedLeanLib (lib : LeanLib)
44+
| leanExe (exe : LeanExe)
45+
| staticExternLib (lib : ExternLib)
46+
| sharedExternLib (lib : ExternLib)
2647
| target (package : Package) (target : WfName) (facet : WfName)
2748

2849
def BuildInfo.key : (self : BuildInfo) → BuildKey
29-
| module m f => ⟨none, m.name, f⟩
30-
| package p f => ⟨p.name, none, f⟩
50+
| module m f => m.mkBuildKey f
51+
| package p f => p.mkBuildKey f
52+
| staticLeanLib l => l.staticBuildKey
53+
| sharedLeanLib l => l.sharedBuildKey
54+
| leanExe x => x.buildKey
55+
| staticExternLib l => l.staticBuildKey
56+
| sharedExternLib l => l.sharedBuildKey
3157
| target p t f => ⟨p.name, t, f⟩
3258

3359
/-- A build function for any element of the Lake build index. -/
@@ -38,15 +64,29 @@ abbrev IndexBuildFn (m : Type → Type v) :=
3864
/-- A transformer to equip a monad with a build function for the Lake index. -/
3965
abbrev IndexT (m : TypeType v) := EquipT (IndexBuildFn m) m
4066

41-
@[inline] def Module.recBuildFacet (mod : Module) (facet : WfName)
67+
@[inline] def Module.recBuildFacet (self : Module) (facet : WfName)
4268
[DynamicType ModuleData facet α] : IndexT m α := fun build =>
43-
let to_data := by unfold BuildData, BuildInfo.key; simp [eq_dynamic_type]
44-
cast to_data <| build <| BuildInfo.module mod facet
69+
let to_data := by
70+
unfold BuildData, BuildInfo.key, Module.mkBuildKey
71+
simp [eq_dynamic_type]
72+
cast to_data <| build <| BuildInfo.module self facet
4573

46-
@[inline] def Package.recBuildFacet (pkg : Package) (facet : WfName)
74+
@[inline] def Package.recBuildFacet (self : Package) (facet : WfName)
4775
[DynamicType PackageData facet α] : IndexT m α := fun build =>
76+
let to_data := by
77+
unfold BuildData, BuildInfo.key, Package.mkBuildKey
78+
simp [eq_dynamic_type]
79+
cast to_data <| build <| BuildInfo.package self facet
80+
81+
@[inline] def ExternLib.recBuildStatic (self : ExternLib)
82+
[DynamicType TargetData &`externLib.static α] : IndexT m α := fun build =>
4883
let to_data := by unfold BuildData, BuildInfo.key; simp [eq_dynamic_type]
49-
cast to_data <| build <| BuildInfo.package pkg facet
84+
cast to_data <| build <| BuildInfo.staticExternLib self
85+
86+
@[inline] def ExternLib.recBuildShared (self : ExternLib)
87+
[DynamicType TargetData &`externLib.shared α] : IndexT m α := fun build =>
88+
let to_data := by unfold BuildData, BuildInfo.key; simp [eq_dynamic_type]
89+
cast to_data <| build <| BuildInfo.sharedExternLib self
5090

5191
-- # Data Types of Build Results
5292

@@ -81,5 +121,19 @@ package_data deps : Array Package
81121
/-- The package's `extraDepTarget`. -/
82122
package_data extraDep : ActiveOpaqueTarget
83123

84-
/-- The package's `extern_lib` targets compiled into shared libraries. -/
85-
package_data externSharedLibs : Array ActiveFileTarget
124+
-- ## For Target Types
125+
126+
/-- A Lean library's static binary. -/
127+
target_data leanLib.static : ActiveFileTarget
128+
129+
/-- A Lean library's shared binary. -/
130+
target_data leanLib.shared : ActiveFileTarget
131+
132+
/-- A Lean binary executable. -/
133+
target_data leanExe : ActiveFileTarget
134+
135+
/-- A external library's static binary. -/
136+
target_data externLib.static : ActiveFileTarget
137+
138+
/-- A external library's shared binary. -/
139+
target_data externLib.shared : ActiveFileTarget

Diff for: Lake/Build/Key.lean

+3
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,9 @@ namespace BuildKey
6262
@[simp] theorem isPackageKey_mk : BuildKey.isPackageKey ⟨some p, none, f⟩ := by
6363
simp [BuildKey.isPackageKey]
6464

65+
@[simp] theorem not_isPackageKey_target : ¬BuildKey.isPackageKey ⟨o, some t, f⟩ := by
66+
simp [BuildKey.isPackageKey]
67+
6568
@[inline] def isTargetKey (self : BuildKey) : Bool :=
6669
self.hasPackage ∧ self.hasTarget
6770

Diff for: Lake/Build/LeanExe.lean

-27
This file was deleted.

0 commit comments

Comments
 (0)