Subject: [bug#54021] [PATCH] Adding rhino package, revised patch

From: Frank Pursel <[email-masked]>
Date: Wed, 16 Feb 2022 21:22:39 -0800

Hi,

I've incorporated the feedback I've receive so far and worked to get the
check phase to complete successfully but this effort is complicated by
the default use of benchmarking and instrumentation.  I don't think this
additional instrumentation is appropriate to the check phase of this
package.  I can get testing to naively succeed using an alternate target
but because this version of the software has had longterm and widespread
experience I recommend that we simply be honest and set tests? to #f.
That is what I've done here.  Comments in the source describe choices I
made that you might decide are undesirable.

Let me know what you think.

Regards,
Frank

>From 84848769a9c40e770d7a29edf200292a04bdcb2e Mon Sep 17 00:00:00 2001
Message-Id: <8484[email-masked]>
From: Frank Pursel <[email-masked]>
Date: Tue, 15 Feb 2022 14:07:28 -0800
Subject: [PATCH] Adding rhino javascript guix package.

       * guix/gnu/package/javascript.scm (rhino): Added package.
---
 gnu/packages/javascript.scm | 105 +++++++++++++++++++++++++++++++++++-
 1 file changed, 104 insertions(+), 1 deletion(-)

diff --git a/gnu/packages/javascript.scm b/gnu/packages/javascript.scm
index c453ac432a..3068ce8197 100644
--- a/gnu/packages/javascript.scm
+++ b/gnu/packages/javascript.scm
@@ -6,6 +6,7 @@
 ;;; Copyright © 2018 Nicolas Goaziou <[email-masked]>
 ;;; Copyright © 2021 Pierre Neidhardt <[email-masked]>
 ;;; Copyright © 2021 Maxim Cournoyer <[email-masked]>
+;;; Copyright © 2022 Frank Pursel <[email-masked]>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -31,6 +32,9 @@ (define-module (gnu packages javascript)
   #:use-module (gnu packages readline)
   #:use-module (gnu packages uglifyjs)
   #:use-module (gnu packages web)
+  #:use-module (gnu packages java)
+  #:use-module (gnu packages bash)
+  #:use-module (gnu packages perl)
   #:use-module (guix packages)
   #:use-module (guix download)
   #:use-module (guix git-download)
@@ -38,7 +42,9 @@ (define-module (gnu packages javascript)
   #:use-module (guix build-system cmake)
   #:use-module (guix build-system trivial)
   #:use-module (guix build-system minify)
-  #:use-module (guix utils))
+  #:use-module (guix build-system ant)
+  #:use-module (guix utils)
+  #:use-module (guix gexp))
 
 (define-public cjson
   (package
@@ -788,3 +794,100 @@ (define-public duktape
 your build, and use the Duktape API to call ECMAScript functions from C code
 and vice versa.")
     (license license:expat)))
+
+(define-public rhino
+  (let* ((rel-ver "1.7.7.2")
+         (commit "935942527ff434b205e797df4185518e5369466e"))
+    (package
+      (name "rhino")
+      (version rel-ver)
+      (source (origin
+                (method git-fetch)
+                (uri (git-reference
+                      (url "https://github.com/mozilla/rhino.git")
+                      (commit commit)))
+                (file-name (git-file-name name version))
+                (sha256
+                 (base32 "09i4yr98hs6855fs7fhgmrpiwpr90lhxdv2bvfj97nn4rv1d7wl8"))
+                (modules '((guix build utils)))
+                (snippet
+                 '(begin
+                    ;; Identify bundled jars to maintain build purity
+                    ;; remove bundled jars but those for testing
+                    ;; all appear to be for testing or unused build system
+                    ;;
+                    ;; source/rhino [env]$ find . -name '*.jar'
+                    ;; ./testsrc/org/mozilla/javascript/tests/commonjs/module/modules.jar
+                    ;; ./testsrc/tests/src/jstests.jar
+                    ;; ./gradle/wrapper/gradle-wrapper.jar
+                    (format #t "~%~a~%" "Sourced jars")
+                    (for-each
+                     (lambda (f) (format #t "~/~a~%" f))
+                     (find-files "." ".*\\.jar$"))
+                    #t))))
+      (build-system ant-build-system)
+      (inputs (list bash-minimal))
+      (native-inputs (list java-junit
+                           java-hamcrest-core
+                           java-snakeyaml     ;Required for tests.
+                           perl               ;Required for 'jsdriver' check target.
+                           ))
+      (arguments
+       `(#:tests? #f
+                 ;; tests? currently fail
+                 ;; the 'junit' target defaults to impure instrumentation and benchmarking.
+                 ;; there is another target 'jsdriver' of unknown scope which succeeds
+                 ;; As this pkg+ver has seen longstanding use, tests? are disabled.
+         #:phases (modify-phases %standard-phases
+                    (replace 'check
+                      (lambda* (#:key tests? inputs native-inputs #:allow-other-keys)
+                        (when tests?
+                          (setenv "ANT_OPTS" "-Doffline=true")
+                          (let ((junit-lib (assoc-ref inputs "java-junit"))
+                                (hamcrest-lib (assoc-ref inputs "java-hamcrest-core"))
+                                (snakeyaml-lib (assoc-ref inputs "java-snakeyaml")))
+                            (with-directory-excursion "testsrc"
+                              (substitute* "build.xml"
+                                (("<pathelement location=\"\\$\\{xbean.jar\\}\" */>" all)
+                                 (string-append "<!-- " all " -->"))
+                                (("<pathelement location=\"\\$\\{jsr173.jar\\}\" */>" all)
+                                 (string-append "<!-- " all " -->"))
+                                (("<pathelement path=\"\\$\\{coverage.classes.dir\\}\" */>" all)
+                                 (string-append "<!-- " all " -->"))
+                                (("<pathelement path=\"lib/emma.jar\"/>" all)
+                                 (string-append "<!-- " all " -->"))
+                                (("<pathelement path=\"lib/junit.jar\" ?/>")
+                                 (string-append "<fileset dir=\"" junit-lib
+                                                "\" includes=\"**/*.jar\"/>"))
+                                (("<pathelement path=\"lib/hamcrest.jar\" ?/>")
+                                 (string-append "<fileset dir=\"" hamcrest-lib
+                                                "\" includes=\"**/*.jar\"/>"))
+                                (("<pathelement path=\"lib/snakeyaml.jar\" ?/>")
+                                 (string-append "<fileset dir=\"" snakeyaml-lib
+                                                "\" includes=\"**/*.jar\"/>"))))
+                            ;; Check could alternatively invoke the jsdriver target here.
+                          (invoke "ant" "junit")))))
+                    (replace 'install
+                      (lambda* (#:key inputs outputs #:allow-other-keys)
+                        (let* ((out (assoc-ref outputs "out"))
+                               (pkg+ver (string-append ,name ,version))
+                               (bin (string-append out "/bin"))
+                               (rhino (string-append bin "/rhino")))
+                          (mkdir-p bin)
+                          (install-file (string-append "build/" pkg+ver
+                                                       "/js.jar")
+                                        (string-append out "/share/java"))
+                          (with-output-to-file rhino
+                            (lambda _
+                              (format #t "#!~a~%~a -jar ~a~%"
+                                      (search-input-file inputs "/bin/bash")
+                                      (search-input-file inputs "/bin/java")
+                                      (string-append out "/share/java/js.jar"))))
+                          (chmod rhino #o755)))))))
+      (home-page "https://mozilla.github.io/rhino")
+      (synopsis "Javascript implemented in Java")
+      (description
+       "Rhino implements ECMAScript, also known as JavaScript, in Java as
+specified in the fifth edition of ECMA-262")
+      (license license:mpl2.0))))
+
-- 
2.34.0