**********************************
Building Idris 2 with new backends
**********************************

The way to extend Idris 2 with new backends is to use it as
a library. The module ``Idris.Driver`` exports the function
``mainWithCodegens``, that takes a list of ``(String, Codegen)``,
starting idris with these codegens in addition to the built-in ones. The first
codegen in the list will be set as the default codegen.

Getting started
===============

To use Idris 2 as a library you need a self-hosting installation and
then install the `idris2api` library (at the top level of the Idris2 repo)

::

    make install-api

Now create a file containing

.. code-block:: idris

    module Main

    import Core.Context
    import Compiler.Common
    import Idris.Driver
    import Idris.Syntax

    compile :
      Ref Ctxt Defs -> Ref Syn SyntaxInfo ->
      (tmpDir : String) -> (execDir : String) ->
      ClosedTerm -> (outfile : String) -> Core (Maybe String)
    compile syn defs tmp dir term file
      = do coreLift $ putStrLn "I'd rather not."
           pure Nothing

    execute :
      Ref Ctxt Defs -> Ref Syn SyntaxInfo ->
      (execDir : String) -> ClosedTerm -> Core ()
    execute defs syn dir term = do coreLift $ putStrLn "Maybe in an hour."

    lazyCodegen : Codegen
    lazyCodegen = MkCG compile execute Nothing Nothing

    main : IO ()
    main = mainWithCodegens [("lazy", lazyCodegen)]

Build it with

::

    $ idris2 -p idris2 -p contrib -p network Lazy.idr -o lazy-idris2

Now you have an idris2 with an added backend.

::

    $ ./build/exec/lazy-idris2
         ____    __     _         ___
        /  _/___/ /____(_)____   |__ \
        / // __  / ___/ / ___/   __/ /     Version 0.2.0-bd9498c00
      _/ // /_/ / /  / (__  )   / __/      https://www.idris-lang.org
     /___/\__,_/_/  /_/____/   /____/      Type :? for help

    Welcome to Idris 2.  Enjoy yourself!
    With codegen for: lazy
    Main>

It will not be overly eager to actually compile any code with the new backend though

::

    $ ./build/exec/lazy-idris2 --cg lazy Hello.idr -o hello
    I'd rather not.
    $

About the directories
---------------------

The code generator can assume that both ``tmpDir`` and ``outputDir`` exist. ``tmpDir``
is intended for temporary files, while ``outputDir`` is the location to put the desired
output files. By default, ``tmpDir`` and ``outputDir`` point to the same directory
(``build/exec``). The directories can be set from the package description (See Section
:ref:`ref-sect-packages`) or via command line options (Listed in ``idris2 --help``).
