;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2022 Christopher Rodriguez ;;; Copyright © 2022 Liliana Marie Prikler ;;; ;;; This file is part of GNU Guix. ;;; ;;; GNU Guix is free software; you can redistribute it and/or modify it ;;; under the terms of the GNU General Public License as published by ;;; the Free Software Foundation; either version 3 of the License, or (at ;;; your option) any later version. ;;; ;;; GNU Guix is distributed in the hope that it will be useful, but ;;; WITHOUT ANY WARRANTY; without even the implied warranty of ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;;; GNU General Public License for more details. ;;; ;;; You should have received a copy of the GNU General Public License ;;; along with GNU Guix. If not, see . (define-module (gnu packages bqn) #:use-module ((guix licenses) #:prefix license:) #:use-module (guix gexp) #:use-module (guix packages) #:use-module (guix download) #:use-module (guix git-download) #:use-module (guix build-system gnu) #:use-module (guix utils) #:use-module (gnu packages) #:use-module (gnu packages bash) #:use-module (gnu packages libffi) #:use-module (gnu packages base) #:use-module (gnu packages pkg-config) #:use-module (gnu packages llvm) #:use-module (gnu packages java) #:use-module (gnu packages compression)) (define-public singeli (let ((commit "5f9cbd46c265491ff167a5d9377d1462539dbdd8") (revision "1")) (package (name "singeli") (version (git-version "0.1.1" revision commit)) (source (origin (method git-fetch) (uri (git-reference (url "https://github.com/mlochbaum/Singeli.git") (commit commit))) (file-name (git-file-name name version)) (sha256 (base32 "13mfxkb29n4phpqxiwfcd43mcg8773n03nml8d9rhbdb6s5jrixb")))) (build-system copy-build-system) (arguments '(#:install-plan '(("." "lib")))) (synopsis "Domain-specific language for high-performance algorithms") (description "Singeli is a domain-specific language for building high-performance algorithms with abstractions over code that corresponds to individual instructions. It's implemented in BQN, with a frontend that emits IR and a backend that converts it to C.") (home-page "https://github.com/mlochbaum/Singeli") (license license:isc)))) (define-public dbqn (let ((commit "ba14bcf1e1d0f90fe90906a6dd7b921460f070f6") (revision "2")) (package (name "dbqn") (version (git-version "0.2.1" revision commit)) (source (origin (method git-fetch) (uri (git-reference (url "https://github.com/dzaima/BQN") (commit commit))) (file-name (git-file-name name version)) (sha256 (base32 "06mzvv7kmandhgwb6jwz3rivsj4ic549sy8afnb5zr6mfn5isyg5")))) (build-system gnu-build-system) (arguments (list #:imported-modules `(,@%gnu-build-system-modules (guix build ant-build-system)) #:modules `((guix build gnu-build-system) ((guix build ant-build-system) #:prefix ant:) (guix build utils)) #:phases #~(modify-phases %standard-phases (delete 'configure) (replace 'build (lambda* _ (invoke "./build") (chmod "./BQN" #o755))) (replace 'check (lambda* (#:key tests? #:allow-other-keys) (when tests? (system "./BQN ./test/test")))) (add-after 'install 'reorder-jar-content (lambda* (#:key outputs #:allow-other-keys) (apply (assoc-ref ant:%standard-phases 'reorder-jar-content) #:outputs (list outputs)))) (add-after 'reorder-jar-content 'jar-indices (lambda* (#:key outputs #:allow-other-keys) (apply (assoc-ref ant:%standard-phases 'generate-jar-indices) #:outputs (list outputs)))) (add-after 'jar-indices 'fix-jar-timestamps (lambda* (#:key outputs #:allow-other-keys) (apply (assoc-ref ant:%standard-phases 'reorder-jar-content) #:outputs (list outputs)))) (replace 'install (lambda* (#:key outputs #:allow-other-keys) (let* ((out (assoc-ref outputs "out")) (dest-bin (string-append out "/bin")) (dest-jar (string-append out "/share/java"))) (mkdir-p dest-bin) (mkdir-p dest-jar) (rename-file "BQN" "dbqn") (install-file "dbqn" dest-bin) (install-file "BQN.jar" dest-jar) (substitute* (string-append dest-bin "/dbqn") (("BQN.jar") (string-append dest-jar "/BQN.jar"))))))))) (native-inputs (list `(,icedtea-8 "jdk") zip)) (inputs (list icedtea-8 bash-minimal)) (synopsis "BQN implementation based on dzaima/APL") (description "dbqn is a Java implementation of the @uref{https://mlochbaum.github.io/BQN/, BQN programming language} that does not need to be bootstrapped, based on an earlier Java implementation of APL by the same author.") (home-page "https://github.com/dzaima/BQN") (license license:expat)))) (define bqn-sources ;; Aside from dbqn above, the main bqn repository is used by other ;; implementations as a "known good" set of sources. ;; CBQN initially uses dbqn to bootstrap itself. ;; We use cbqn-bootstrap to build BQN for the end-users (let ((commit "6f651be3e09f0628c7d47ddb7ce819a1755529ca")) (origin (method git-fetch) (uri (git-reference (url "https://github.com/mlochbaum/BQN") (commit commit))) (file-name (git-file-name "bqn-sources" commit)) (sha256 (base32 "0jhrazwp4s1a0pzrzyxi7szpchp4avqsvpmslfsgk3c88wf57q6b"))))) (define cbqn-bootstrap (package (name "cbqn-bootstrap") (version "0.6.0") (outputs '("out")) (source (origin (method git-fetch) (uri (git-reference (url "https://github.com/dzaima/CBQN") (commit (string-append "v" version)))) (file-name (git-file-name name version)) (sha256 (base32 "1qh5hv76bj55ajna8smwniqfa1nmnyqahk40in5bzjsx3vvikpw5")))) (build-system gnu-build-system) (arguments (list #:tests? #f #:make-flags #~(list (string-append "version=" #$version) (string-append "CC=" #$(cc-for-target)) "REPLXX=0" "nogit=1" "notui=1") #:phases #~(modify-phases %standard-phases (delete 'configure) (add-before 'build 'generate-bytecode (lambda* (#:key outputs #:allow-other-keys) (let ((out (assoc-ref outputs "out"))) (mkdir-p (string-append "./build/bytecodeLocal/gen")) (system (string-append #+dbqn "/bin/dbqn ./build/genRuntime " #+bqn-sources " " "./build/bytecodeLocal"))))) (add-after 'generate-bytecode 'symlink-singeli (lambda* (#:key inputs outputs #:allow-other-keys) (symlink (string-append (assoc-ref inputs "singeli") "/lib") "build/singeliLocal"))) (replace 'install (lambda* (#:key outputs #:allow-other-keys) (mkdir-p (string-append #$output "/bin")) (chmod "BQN" #o755) (rename-file "BQN" "bqn") (install-file "bqn" (string-append #$output "/bin"))))))) (native-inputs (list singeli dbqn bqn-sources)) (inputs (list icedtea-8 libffi)) (synopsis "BQN implementation in C") (description "This package provides the reference implementation of @uref{https://mlochbaum.github.io/BQN/, BQN}, a programming language inspired by APL.") (home-page "https://mlochbaum.github.io/BQN/") (license license:gpl3))) (define-public cbqn (package (inherit cbqn-bootstrap) (name "cbqn") (outputs '("out" "lib")) (arguments (substitute-keyword-arguments (strip-keyword-arguments (list #:tests?) (package-arguments cbqn-bootstrap)) ((#:make-flags flags #~(list)) #~(append #$flags '("shared-o3" "o3"))) ((#:phases phases #~%standard-phases) #~(modify-phases #$phases (replace 'generate-bytecode (lambda* (#:key outputs #:allow-other-keys) (let ((out (assoc-ref outputs "out"))) (mkdir-p (string-append "./build/bytecodeLocal/gen")) (system (string-append #+cbqn-bootstrap "/bin/bqn ./build/genRuntime " #+bqn-sources " ./build/bytecodeLocal"))))) (replace 'check (lambda* (#:key inputs tests? #:allow-other-keys) (when tests? (system (string-append "./BQN -M 1000 \"" #+bqn-sources "/test/this.bqn\"")) (map (lambda (x) (system (string-append "./BQN ./test/" x ".bqn"))) '("cmp" "equal" "copy" "random")) (system "make -C test/ffi")))) (add-after 'install 'install-lib-stuff (lambda* (#:key outputs #:allow-other-keys) (let* ((lib (string-append (assoc-ref outputs "lib") "/lib")) (include (string-append (assoc-ref outputs "lib") "/include"))) (install-file "libcbqn.so" lib) (install-file "include/bqnffi.h" include)))))))) (native-inputs (list cbqn-bootstrap singeli bqn-sources libffi)) (inputs (list libffi)) (properties `((tunable? . #t)))))