From e26a040bb753ed990f38886eba0b996a84f2ea7e Mon Sep 17 00:00:00 2001 From: tydeu Date: Wed, 8 Jun 2022 17:06:03 -0400 Subject: [PATCH] feat: syntax for defining extra lib & exe targets --- Lake/Config/Load.lean | 12 ++++++-- Lake/Config/Package.lean | 35 +++++++---------------- Lake/Config/Targets.lean | 30 +++++++++++++------- Lake/DSL.lean | 3 +- Lake/DSL/Attributes.lean | 6 ++++ Lake/DSL/DeclUtil.lean | 14 +++++++++ Lake/DSL/Package.lean | 5 +--- Lake/DSL/Targets.lean | 52 ++++++++++++++++++++++++++++++++++ examples/targets/lakefile.lean | 33 ++++++--------------- 9 files changed, 121 insertions(+), 69 deletions(-) create mode 100644 Lake/DSL/Targets.lean diff --git a/Lake/Config/Load.lean b/Lake/Config/Load.lean index 6d0ca76..f98d331 100644 --- a/Lake/Config/Load.lean +++ b/Lake/Config/Load.lean @@ -40,8 +40,6 @@ unsafe def evalScriptDecl env.evalConstCheck ScriptFn leanOpts ``ScriptFn declName return {fn, doc? := (← findDocString? env declName)} -namespace Package - deriving instance BEq, Hashable for Import /- Cache for the imported header environment of Lake configuration files. -/ @@ -62,6 +60,8 @@ def processHeader (header : Syntax) (opts : Options) (trustLevel : UInt32) modify (·.add { fileName := inputCtx.fileName, data := toString e, pos }) mkEmptyEnvironment +namespace Package + /-- Unsafe implementation of `load`. -/ unsafe def loadUnsafe (dir : FilePath) (args : List String := []) (configFile := dir / defaultConfigFile) (leanOpts := Options.empty) @@ -97,7 +97,13 @@ unsafe def loadUnsafe (dir : FilePath) (args : List String := []) let config := {config with dependencies := depsExt.getState env ++ config.dependencies} let scripts ← scriptAttr.ext.getState env |>.foldM (init := {}) fun m d => return m.insert d <| ← evalScriptDecl env d leanOpts - return {dir, config, scripts} + let libs ← leanLibAttr.ext.getState env |>.foldM (init := {}) fun m d => + let eval := env.evalConstCheck LeanLibConfig leanOpts ``LeanLibConfig d + return m.insert d <| ← IO.ofExcept eval.run.run + let exes ← leanExeAttr.ext.getState env |>.foldM (init := {}) fun m d => + let eval := env.evalConstCheck LeanExeConfig leanOpts ``LeanExeConfig d + return m.insert d <| ← IO.ofExcept eval.run.run + return {dir, config, scripts, libs, exes} | _ => error s!"configuration file has multiple `package` declarations" else error s!"package configuration `{configFile}` has errors" diff --git a/Lake/Config/Package.lean b/Lake/Config/Package.lean index e4075ac..13ef3a4 100644 --- a/Lake/Config/Package.lean +++ b/Lake/Config/Package.lean @@ -217,12 +217,6 @@ structure PackageConfig extends WorkspaceConfig where -/ moreLinkArgs : Array String := #[] - /-- Additional library targets for the package. -/ - libConfigs : NameMap LeanLibConfig := {} - - /-- Additional binary executable targets for the package. -/ - exeConfigs : NameMap LeanExeConfig := {} - deriving Inhabited namespace PackageConfig @@ -252,13 +246,12 @@ structure Package where dir : FilePath /-- The package's configuration. -/ config : PackageConfig - /-- - A `NameMap` of scripts for the package. - - A `Script` is a `(args : List String) → IO UInt32` definition with - a `@[script]` tag that can be run by `lake run