/-
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.Data
import Lake.Build.TargetTypes

/-!
# Simple Builtin Facet Declarations

This module declares most of the builtin facets an targets and
their build data builtin facets and targets. Some of these definitions
are needed for  configurations, so we define them here before we need to
import said configurations for `BuildInfo`.
-/

namespace Lake

-- ## Module Facets

/-- A module facet name along with proof of its data type. -/
structure ModuleFacet (α) where
  /-- The name of the module facet. -/
  name : WfName
  /-- Proof that module's facet build result is of type α. -/
  data_eq : ModuleData name = α
  deriving Repr

instance (facet : ModuleFacet α) : FamilyDef ModuleData facet.name α :=
  ⟨facet.data_eq⟩

instance [FamilyDef ModuleData facet α] : CoeDep WfName facet (ModuleFacet α) :=
  ⟨facet, family_key_eq_type⟩

namespace Module
abbrev leanBinFacet  := &`lean.bin
abbrev oleanFacet    := &`olean
abbrev ileanFacet    := &`ilean
abbrev cFacet        := &`lean.c
abbrev oFacet        := &`lean.o
abbrev dynlibFacet   := &`dynlib
end Module

/--
The core compilation / elaboration of the Lean file via `lean`,
which produce the Lean binaries of the module (i.e., `olean` and `ilean`).
It is thus the facet used by default for building imports of a module.
Also, if the module is not lean-only, it produces `c` files as well.
-/
module_data lean.bin : ActiveOpaqueTarget

/-- The `olean` file produced by `lean`  -/
module_data olean : ActiveFileTarget

/-- The `ilean` file produced by `lean` -/
module_data ilean : ActiveFileTarget

/-- The C file built from the Lean file via `lean` -/
module_data lean.c : ActiveFileTarget

/-- The object file built from `lean.c` -/
module_data lean.o : ActiveFileTarget

/-- Shared library for `--load-dynlib` -/
module_data dynlib : ActiveFileTarget

-- ## Package Facets

/-- The package's `extraDepTarget`. -/
package_data extraDep : ActiveOpaqueTarget

-- ## Target Facets

abbrev LeanLib.staticFacet := &`leanLib.static
abbrev LeanLib.sharedFacet := &`leanLib.shared
abbrev LeanExe.exeFacet := &`leanExe
abbrev ExternLib.staticFacet := &`externLib.static
abbrev ExternLib.sharedFacet := &`externLib.shared

/-- A Lean library's static binary. -/
target_data leanLib.static : ActiveFileTarget

/-- A Lean library's shared binary. -/
target_data leanLib.shared : ActiveFileTarget

/-- A Lean binary executable. -/
target_data leanExe : ActiveFileTarget

/-- A external library's static binary. -/
target_data externLib.static : ActiveFileTarget

/-- A external library's shared binary. -/
target_data externLib.shared : ActiveFileTarget
