diff mbox series

[bug#49607] gnu: Add Idris 2.

Message ID ee2e60c3f133981cc5695ef93e1b4e87dff87c04.1626536112.git.public@yoctocell.xyz
State New
Headers show
Series [bug#49607] gnu: Add Idris 2. | expand

Checks

Context Check Description
cbaines/comparison success View comparision
cbaines/git branch success View Git branch
cbaines/applying patch success View Laminar job
cbaines/issue success View issue

Commit Message

Xinglu Chen July 17, 2021, 3:42 p.m. UTC
From: raingloom <raingloom@riseup.net>

* gnu/packages/idris.scm (idris2): New variable.

Co-authored-by: Xinglu Chen <public@yoctocell.xyz>
---
Based a previous patch by raingloom[1].

Some changes I made:

* Tests are enabled, but only the Chez backend is enabled since that’s
  the only backend we have for now.

* Some environment have been set, which should make it possible to
  import third-party packages.

* The bin/idris2_app directory has been removed, see the comment in the
  code below.

* The executable is wrapped so some environment variables can be set.

* I also changed the synopsis to the one on their GitHub page, and added
  a copyright line for raingloom.

[1]: https://issues.guix.gnu.org/46124#1

 gnu/packages/idris.scm | 120 ++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 119 insertions(+), 1 deletion(-)


base-commit: 9cb35c02164d929fcb8929e7f454df215df8cf25

Comments

Attila Lendvai April 14, 2022, 3:53 p.m. UTC | #1
note that some of these packages are pointing to my own fork of the Idris2 repo.

if that is an issue, then feel free to comment out those packages for the time being.

i'm working on incorporating these branches back into the official Idris2 repo.

(the current milestone of that process is to get my build system refactor merged https://github.com/idris-lang/Idris2/pull/1990)

--
• attila lendvai
• PGP: 963F 5D5F 45C7 DFCD 0A39
--
“Journalism is printing what someone else does not want printed: everything else is public relations.”
	— George Orwell (1903–1950)
Attila Lendvai July 11, 2022, 10:41 a.m. UTC | #2
please note this discussion:

https://lists.gnu.org/archive/html/guix-devel/2022-07/msg00131.html

the conclusion, roughly: it's better if the user can pick whichever c compiler they want, but to retain a slick user experience, maybe we should introduce an idris-toolchain package that does the propagation.

- attila
Attila Lendvai Dec. 8, 2022, 12:42 a.m. UTC | #3
FTR, i have failed to inspire the idris maintainers with my refactor of the idris build system, and my setup that enables chain-bootstrapping the entire idris language evolution all the way down from GHC.

https://github.com/idris-lang/Idris2/pull/1990

i have also lost my initial interest in delving deep into idris, so i will not pursue my idris related work anymore.

i'm happy to help anyone who wants to pick up this work, though! i may even get involved if there's someone else who steps up to champion the cause.
diff mbox series

Patch

diff --git a/gnu/packages/idris.scm b/gnu/packages/idris.scm
index ca2772b904..64cb4f37f5 100644
--- a/gnu/packages/idris.scm
+++ b/gnu/packages/idris.scm
@@ -3,6 +3,8 @@ 
 ;;; Copyright © 2016, 2017 David Craven <david@craven.ch>
 ;;; Copyright © 2018 Alex ter Weele <alex.ter.weele@gmail.com>
 ;;; Copyright © 2019, 2021 Eric Bavier <bavier@posteo.net>
+;;; Copyrignt © 2021 raingloom <raingloom@riseup.net>
+;;; Copyright © 2021 Xinglu Chen <public@yoctocell.xyz>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -21,6 +23,8 @@ 
 
 (define-module (gnu packages idris)
   #:use-module (gnu packages)
+  #:use-module (gnu packages bash)
+  #:use-module (gnu packages chez)
   #:use-module (gnu packages haskell-check)
   #:use-module (gnu packages haskell-web)
   #:use-module (gnu packages haskell-xyz)
@@ -28,12 +32,16 @@ 
   #:use-module (gnu packages multiprecision)
   #:use-module (gnu packages ncurses)
   #:use-module (gnu packages perl)
+  #:use-module (gnu packages python)
+  #:use-module (gnu packages sphinx)
   #:use-module (guix build-system gnu)
   #:use-module (guix build-system haskell)
   #:use-module (guix download)
   #:use-module (guix git-download)
   #:use-module ((guix licenses) #:prefix license:)
-  #:use-module (guix packages))
+  #:use-module (guix packages)
+  #:use-module (guix utils)
+  #:use-module (ice-9 regex))
 
 (define-public idris
   (package
@@ -150,6 +158,116 @@  can be specified precisely in the type.  The language is closely related to
 Epigram and Agda.")
     (license license:bsd-3)))
 
+;; TODO: Add other backends?
+(define-public idris2
+  (package
+    (name "idris2")
+    (version "0.4.0")
+    (source (origin
+              (method git-fetch)
+              (uri (git-reference
+                    (url "https://github.com/idris-lang/Idris2")
+                    (commit (string-append "v" version))))
+              (sha256
+               (base32
+                "105jybjf5s0k6003qzfxchzsfcpsxip180bh3mdmi74d464d0h8g"))))
+    (build-system gnu-build-system)
+    (arguments
+     `(#:test-target "bootstrap-test"
+       #:phases
+       (modify-phases
+           %standard-phases
+         (add-after 'unpack 'patch-paths
+           (lambda* (#:key outputs inputs #:allow-other-keys)
+             (substitute* "config.mk"
+               ((,(regexp-quote "PREFIX ?= $(HOME)/.idris2"))
+                (string-append "PREFIX = "
+                               (assoc-ref outputs "out"))))
+             (substitute* '("src/Compiler/Scheme/Chez.idr"
+                            "src/Compiler/Scheme/Racket.idr"
+                            "bootstrap/idris2_app/idris2.rkt"
+                            "bootstrap/idris2_app/idris2.ss")
+                  ((,(regexp-quote "#!/bin/sh"))
+                   (string-append "#!" (assoc-ref inputs "bash")
+                                  "/bin/sh")))))
+         ;; This is not the kind of bootstrap we want to run
+         (delete 'bootstrap)
+         (delete 'configure)            ; no configure script
+         (replace 'build
+           (lambda _
+             (invoke "make" "bootstrap"
+                     "SCHEME=scheme"
+                     ;; TODO: detect toolchain.
+                     (string-append "CC=" ,(cc-for-target)))))
+         (add-after 'build 'build-doc
+           (lambda _
+             (with-directory-excursion
+                 "docs"
+               (invoke "make" "html"))))
+         (add-before 'check 'set-cc
+           (lambda _
+             (setenv "CC" ,(cc-for-target))))
+         (add-after 'install 'install-doc
+           (lambda* (#:key outputs #:allow-other-keys)
+             (copy-recursively
+              "docs/build/html"
+              (string-append
+               (assoc-ref outputs "out")
+               "/share/doc/"
+               ,name "-" ,version))))
+         (add-after 'install-doc 'fix-ld-library-path
+           (lambda* (#:key outputs #:allow-other-keys)
+             ;; The bin/idris2 calls bin/idris2_app/idris2.so which is
+             ;; the real executable, but it sets LD_LIBRARY_PATH
+             ;; incorrectly.  Remove bin/idris2 and replace it with
+             ;; bin/idris2_app/idris2.so instead.
+             (let ((out (assoc-ref outputs "out")))
+               (delete-file (string-append out "/bin/idris2"))
+               (copy-file (string-append out "/bin/idris2_app/idris2.so")
+                          (string-append out "/bin/idris2"))
+               (delete-file-recursively (string-append out "/bin/idris2_app")))))
+         (add-after 'fix-ld-library-path 'wrap-program
+           (lambda* (#:key outputs inputs #:allow-other-keys)
+             (let* ((chez (string-append (assoc-ref inputs "chez-scheme")
+                                         "/bin/scheme"))
+                    (out (assoc-ref outputs "out"))
+                    (idris2 (string-append out "/bin/idris2"))
+                    (version ,version))
+               (wrap-program idris2
+                 `("LD_LIBRARY_PATH" ":" prefix
+                   (,(string-append out "/idris2-" version "/lib")))
+                 `("CHEZ" ":" = (,chez)))))))))
+    (inputs
+     `(("bash" ,bash-minimal)
+       ("chez-scheme" ,chez-scheme)
+       ("gmp" ,gmp)))
+    (native-inputs
+     ;; For building docs.
+     `(("python-sphinx" ,python-sphinx)
+       ("python-sphinx-rtd-theme" ,python-sphinx-rtd-theme)
+       ("python" ,python) ))
+    (native-search-paths
+     (list (search-path-specification
+            (variable "IDRIS2_PACKAGE_PATH")
+            (files (list (string-append "idris2-" version))))
+           (search-path-specification
+            (variable "IDRIS2_LIBS")
+            (files (list (string-append "idris2-" version "/lib")))
+            (file-type 'directory))
+           (search-path-specification
+            (variable "IDRIS2_DATA")
+            (files (list (string-append "idris2-" version "/support")))
+            (file-type 'directory))))
+    (home-page "https://idris-lang.org/")
+    (synopsis "Purely functional programming language with first class types")
+    (description
+     "Idris 2 is a general purpose language with dependent linear types.
+It is compiled, with eager evaluation.  Dependent types allow types to
+be predicated on values, meaning that some aspects of a program's behaviour
+can be specified precisely in the type.  It can use multiple languages as code
+generation backends.")
+    (license license:bsd-3)))
+
 ;; Idris modules use the gnu-build-system so that the IDRIS_LIBRARY_PATH is set.
 (define (idris-default-arguments name)
   `(#:modules ((guix build gnu-build-system)