forked from leanprover-community/mathlib4
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathlakefile.lean
More file actions
166 lines (140 loc) · 5.99 KB
/
lakefile.lean
File metadata and controls
166 lines (140 loc) · 5.99 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
import Lake
open Lake DSL
/-!
## Mathlib dependencies on upstream projects
-/
require "leanprover-community" / "batteries" @ git "main"
require "leanprover-community" / "Qq" @ git "master"
require "leanprover-community" / "aesop" @ git "master"
require "leanprover-community" / "proofwidgets" @ git "v0.0.87" -- ProofWidgets should always be pinned to a specific version
with NameMap.empty.insert `errorOnBuild
"ProofWidgets not up-to-date. \
Please run `lake exe cache get` to fetch the latest ProofWidgets. \
If this does not work, report your issue on the Lean Zulip."
require "leanprover-community" / "importGraph" @ git "main"
require "leanprover-community" / "LeanSearchClient" @ git "main"
require "leanprover-community" / "plausible" @ git "main"
/-!
## Options for building mathlib
-/
/-- These options are used as `leanOptions`, prefixed by `` `weak``, so that
`lake build` uses them, as well as `Archive` and `Counterexamples`. -/
abbrev mathlibOnlyLinters : Array LeanOption := #[
⟨`linter.mathlibStandardSet, true⟩,
-- Explicitly enable the header linter, since the standard set is defined in `Mathlib.Init`
-- but we want to run this linter in files imported by `Mathlib.Init`.
⟨`linter.style.header, true⟩,
⟨`linter.checkInitImports, true⟩,
⟨`linter.allScriptsDocumented, true⟩,
⟨`linter.pythonStyle, true⟩,
⟨`linter.style.longFile, .ofNat 1500⟩,
-- ⟨`linter.nightlyRegressionSet, true⟩,
-- `latest_import.yml` uses this comment: if you edit it, make sure that the workflow still works
]
/-- These options are passed as `leanOptions` to building mathlib, as well as the
`Archive` and `Counterexamples`. (`tests` omits the first two options.) -/
abbrev mathlibLeanOptions := #[
⟨`pp.unicode.fun, true⟩, -- pretty-prints `fun a ↦ b`
⟨`autoImplicit, false⟩,
⟨`maxSynthPendingDepth, .ofNat 3⟩
] ++ -- options that are used in `lake build`
mathlibOnlyLinters.map fun s ↦ { s with name := `weak ++ s.name }
package mathlib where
testDriver := "MathlibTest"
-- These are additional settings which do not affect the lake hash,
-- so they can be enabled in CI and disabled locally or vice versa.
-- Warning: Do not put any options here that actually change the olean files,
-- or inconsistent behavior may result
-- weakLeanArgs := #[]
/-!
## Mathlib libraries
-/
@[default_target]
lean_lib Mathlib where
-- Enforce Mathlib's default linters and style options.
leanOptions := mathlibLeanOptions
-- NB. When adding further libraries, check if they should be excluded from `getLeanLibs` in
-- `scripts/mk_all.lean`.
lean_lib Cache
lean_lib MathlibTest where
globs := #[.submodules `MathlibTest]
lean_lib Archive where
leanOptions := mathlibLeanOptions
lean_lib Counterexamples where
leanOptions := mathlibLeanOptions
/-- Additional documentation in the form of modules that only contain module docstrings. -/
lean_lib docs where
roots := #[`docs]
/-!
## Executables provided by Mathlib
-/
/--
`lake exe autolabel 150100` adds a topic label to PR `150100` if there is a unique choice.
This requires GitHub CLI `gh` to be installed!
Calling `lake exe autolabel` without a PR number will print the result without applying
any labels online.
-/
lean_exe autolabel where
srcDir := "scripts"
/-- `lake exe cache get` retrieves precompiled `.olean` files from a central server. -/
lean_exe cache where
root := `Cache.Main
/-- `lake exe check-yaml` verifies that all declarations referred to in `docs/*.yaml` files exist. -/
lean_exe «check-yaml» where
srcDir := "scripts"
supportInterpreter := true
/-- `lake exe mk_all` constructs the files containing all imports for a project. -/
lean_exe mk_all where
srcDir := "scripts"
supportInterpreter := true
-- Executables which import `Lake` must set `-lLake`.
weakLinkArgs := #["-lLake"]
/-- `lake exe lint-style` runs text-based style linters. -/
lean_exe «lint-style» where
srcDir := "scripts"
supportInterpreter := true
-- Executables which import `Lake` must set `-lLake`.
weakLinkArgs := #["-lLake"]
/-- `lake exe check-title-labels` checks if a PR title obeys some basic formatting requirements.
Currently, these checks are quite lenient, but could be made stricter in the future. -/
lean_exe «check_title_labels» where
srcDir := "scripts"
lean_exe mathlib_test_executable where
root := `MathlibTest.MathlibTestExecutable
/-!
## Other configuration
-/
/--
When a package depending on Mathlib updates its dependencies,
update its toolchain to match Mathlib's and fetch the new cache.
-/
post_update pkg do
let rootPkg ← getRootPackage
if rootPkg.baseName = pkg.baseName then
return -- do not run in Mathlib itself
if (← IO.getEnv "MATHLIB_NO_CACHE_ON_UPDATE") != some "1" then
-- Check if Lake version matches toolchain version
let toolchainFile := rootPkg.dir / "lean-toolchain"
let toolchainContent ← IO.FS.readFile toolchainFile
let toolchainVersion := match toolchainContent.trimAscii.copy.splitOn ":" with
| [_, version] => version
| _ => toolchainContent.trimAscii.copy -- fallback to full content if format is unexpected
-- Lean.versionString does not start with a `v`, while the `lean-toolchain` file is flexible.
let toolchainVersion := (toolchainVersion.dropPrefix "v").copy
if Lean.versionString ≠ toolchainVersion then
IO.println s!"Not running `lake exe cache get` yet, as \
the `lake` version ({Lean.versionString}) does not match \
the toolchain version ({toolchainVersion}) in the project.\n\
You should run `lake exe cache get` manually."
return
let exeFile ← runBuild cache.fetch
-- Run the command in the root package directory,
-- which is the one that holds the .lake folder and lean-toolchain file.
let cwd ← IO.Process.getCurrentDir
let exitCode ← try
IO.Process.setCurrentDir rootPkg.dir
env exeFile.toString #["get"]
finally
IO.Process.setCurrentDir cwd
if exitCode ≠ 0 then
error s!"{pkg.baseName}: failed to fetch cache"