Subject: [PATCH] gnu: Add dart
From: Jørgen Kvalsvik <[email-masked]>
To: [email-masked]
Cc: Jørgen Kvalsvik <[email-masked]>
Date: Mon, 28 Oct 2024 21:45:04 +0100
List-Id: <debbugs-submit.debbugs.gnu.org>

* gnu/packages/dart.scm: New file.
* gnu/local.mk: Register it.

Change-Id: Idbdcf4e30790b3225bf86a36a0a4c4b081b557aa
---
 gnu/local.mk          |   1 +
 gnu/packages/dart.scm | 101 ++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 102 insertions(+)
 create mode 100644 gnu/packages/dart.scm

---

Hello,

This is a port of the nixpkgs Dart compiler package [1]. I am interested
in it specifically because it is a transitive dependency of Hugo [2],
and I figured I other people might be interested in these packages, too.

The from-source build of Dart is quite the pain (nixpkgs seems to have
given up, but I do not know the story there). I looked around and while
I did not find a strict rule saying "source only", it does stand out by
relying on prebuilt artifacts. For my current needs it is good enough,
and I hope that in the future it could get a proper source build. I saw
there was an effort a few years ago, but it appears to have stopped
completely.

[1] https://github.com/NixOS/nixpkgs/blob/master/pkgs/development/compilers/dart/default.nix
[2] https://gohugo.io/

diff --git a/gnu/local.mk b/gnu/local.mk
index 6bd7c75090..925a561d45 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -224,6 +224,7 @@ GNU_SYSTEM_MODULES =				\
   %D%/packages/cvassistant.scm			\
   %D%/packages/cybersecurity.scm		\
   %D%/packages/cyrus-sasl.scm			\
+  %D%/packages/dart.scm			\
   %D%/packages/darwin.scm			\
   %D%/packages/data-language.scm		\
   %D%/packages/databases.scm			\
diff --git a/gnu/packages/dart.scm b/gnu/packages/dart.scm
new file mode 100644
index 0000000000..faf840d547
--- /dev/null
+++ b/gnu/packages/dart.scm
@@ -0,0 +1,101 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; 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 <http://www.gnu.org/licenses/>.
+
+(define-module (gnu packages dart)
+  #:use-module ((guix licenses) #:prefix license:)
+  #:use-module (guix download)
+  #:use-module (guix packages)
+  #:use-module (guix gexp)
+  #:use-module (guix config)
+  #:use-module (guix build-system copy)
+  #:use-module ((gnu packages bootstrap) #:select (glibc-dynamic-linker))
+  #:use-module (gnu packages base)
+  #:use-module (gnu packages compression)
+  #:use-module (gnu packages elf)
+  #:use-module (ice-9 match)
+  #:use-module (srfi srfi-1))
+
+(define-public dart-3.5
+  (package
+    (name "dart")
+    (version "3.5.4")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append
+                    "https://storage.googleapis.com/dart-archive/channels/stable/release/"
+                    version "/sdk/dartsdk-"
+                    (match (%current-system)
+                      ("x86_64-linux" "linux-x64")
+                      ("i686-linux" "linux-ia32")
+                      ("aarch64-linux" "linux-arm64")
+                      (_ "unsupported"))
+                    "-release.zip"))
+              (sha256
+               (base32 (match (%current-system)
+                  ("x86_64-linux" "0rv9rp8g5blhncqwciymhxh3z2832yp54lphxgsvkmm9y8s5w34d")
+                  ("i686-linux" "02kv119swcp7y4n3yb2i5a4dagjpf0zq3b3an1apahj5zn6ak41g")
+                  ("aarch64-linux" "1v437zpksk0jhib6vhpcbvv715mv32zmwby8b3p9qd3k67fn87d9")
+                  (_ "0000000000000000000000000000000000000000000000000000"))))))
+    (build-system copy-build-system)
+    (arguments
+     (list
+      #:phases
+      #~(modify-phases %standard-phases
+          (replace 'install
+            (lambda* (#:key outputs inputs #:allow-other-keys)
+              (let* ((out (assoc-ref outputs "out"))
+                     (bin (string-append out "/bin"))
+                     (patchelf (string-append (assoc-ref inputs "patchelf")
+                                              "/bin/patchelf"))
+                     (ld-so (string-append (assoc-ref inputs "libc")
+                                           #$(glibc-dynamic-linker))))
+                (mkdir-p out)
+                (copy-recursively "." out)
+                (for-each
+                 (lambda (file) (invoke patchelf "--set-interpreter" ld-so file))
+                 (find-files bin (lambda (file stat) (and (executable-file? file)
+                                                          (elf-file? file))))))))
+          (add-after 'install 'check
+            (lambda* (#:key tests? inputs outputs #:allow-other-keys)
+              (when tests?
+                (let* ((out (assoc-ref outputs "out"))
+                       (coreutils (assoc-ref inputs "coreutils"))
+                       (PATH (string-join
+                              (list
+                               (string-append out "/bin")
+                               (string-append coreutils "/bin"))
+                              ":"))
+                       (hello #$(plain-file
+                               "hello.dart"
+                               "void main() => print('hello, world!');")))
+                  (setenv "PATH" PATH)
+                  (invoke "dart" "create" "--no-pub" "dart_test_project")
+                  (unless (directory-exists? "dart_test_project")
+                    (error "'dart create' did not create expected directory"))
+                  (unless (file-exists? "dart_test_project/bin/dart_test_project.dart")
+                    (error "'dart create' did not create expected .dart file"))
+                  (invoke "dart" "compile" "exe" hello "-o" "hello.exe")
+                  (invoke "./hello.exe")))))
+          (delete 'strip))))
+    (inputs (list coreutils))
+    (native-inputs (list unzip coreutils patchelf))
+    (home-page "https://dart.dev/")
+    (synopsis "Approachable, portable, and productive language")
+    (description "Dart is a class-based, single inheritance, object-oriented
+language with C-style syntax.  It offers compilation to JavaScript, interfaces,
+mixins, abstract classes, reified generics, and optional typing.")
+    (supported-systems '("x86_64-linux" "i686-linux" "aarch64-linux"))
+    (license license:bsd-3)))

base-commit: 6d334173a30579f04cac37458f8c696b51e2ecba
prerequisite-patch-id: 2f364131a4d24d80490d69a595e8d70c90de488f
prerequisite-patch-id: 2897995fb414cfcaff1dacf6f285bb07635a1c3a
prerequisite-patch-id: fae24f50d8f46c977a7b997a97252ebe7ad2c7c7
prerequisite-patch-id: b34be5beb88f1d7d14849a5bfb46d5caf7327fbc
prerequisite-patch-id: 601da7b7499b3752f8e9248a837688994d21ed0e
prerequisite-patch-id: f0cb2621cb9438cc0b3d2a2ca36c3428bad89087
-- 
2.39.5