From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mp0 ([2001:41d0:2:4a6f::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by ms11 with LMTPS id WO07GmWcuF5sLgAA0tVLHw (envelope-from ) for ; Mon, 11 May 2020 00:29:25 +0000 Received: from aspmx1.migadu.com ([2001:41d0:2:4a6f::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by mp0 with LMTPS id fHJnCnOcuF5PHQAA1q6Kng (envelope-from ) for ; Mon, 11 May 2020 00:29:39 +0000 Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by aspmx1.migadu.com (Postfix) with ESMTPS id 96E6E940DC5 for ; Mon, 11 May 2020 00:29:36 +0000 (UTC) Received: from localhost ([::1]:36870 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jXwK9-0001nh-E4 for larch@yhetil.org; Sun, 10 May 2020 20:29:37 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:51472) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1jXwJz-0001lB-VO for guix-devel@gnu.org; Sun, 10 May 2020 20:29:27 -0400 Received: from mail-pj1-x1036.google.com ([2607:f8b0:4864:20::1036]:54494) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1jXwJx-0007iY-FW for guix-devel@gnu.org; Sun, 10 May 2020 20:29:27 -0400 Received: by mail-pj1-x1036.google.com with SMTP id y6so6972645pjc.4 for ; Sun, 10 May 2020 17:29:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=to:from:subject:message-id:date:user-agent:mime-version :content-language; bh=UaSuFj2tS/GzEF/ViE8phh8JlqCLmo+3uVNemRvqKdc=; b=H0/4GD1Fport+A74zUtUif1OpVi/625YJsigAeTV50JVcVl+WuZpDapLQm9GXmrzgT /d3AVNN5PQcU4WIjSu1Hi0Ew8pVje5uvFzVk6vZ/8uQ3arNSYEBMB+8SfEeFXo0NbqW2 xU+F2sKf/oDEtj5KnRs2Mk99QbbOmrNuzgQPx+00BUExRQN7JhQ9nd896jxdC1AG+GzZ 959usxc8KGlaEw6W+ky6YD4aOsSzA/W87EwA46T7pR8uAPfhUYwVp+lZ+/HDFCRSnOyL TVEZXqpyHpbFQJstvuHFt/MhOZwH5VurdjKkBG+DpfWCVdO9NTXPvN2BmjYzMEv216F5 SXZA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:to:from:subject:message-id:date:user-agent :mime-version:content-language; bh=UaSuFj2tS/GzEF/ViE8phh8JlqCLmo+3uVNemRvqKdc=; b=n42WAxW6eo3dTEGzi84fZHasI58km8yUZnwOJzHCGDXhftyhGTtzwmQXNOgv3MBpub 6UvjY6Yer34Sjl0cSeNNPwnyf7b/zTdlUNfWQMYsp0nZxpDRhKOv5/SZ5CjMoVDH9aMg DP+QxGUcPKHvurf8HJgTWTIG7R+P4IcLcimUQLf4APO4pWUcCp8h8e8pFKwngzbaI4bI CkhhAFGyJJ9DuqZJEm2MBvt43F4HLE+DOz22uW0oehov00zDVAyzZ/ZKvthHEwau3xGO ZUp4aCzywoGL8D9tbNCE81oNumUh/IIUmLKcqDOeMTsZk/9lt6/tSatIT3J18zCc/KAY AadQ== X-Gm-Message-State: AGi0PuZSgPL0oQCBaU1mFNQmXhurgmtWERQziGOL00H708lmK656R/rh IWHDLrrU3jdHvoL1vFMXLk7q9PJo X-Google-Smtp-Source: APiQypKbAbZ7DhEwXmH+886h4sA8+veQN6drLblcGCeJ9ZL4tZQznzREE/XzCa0GTCYLcRjzJ7/LmA== X-Received: by 2002:a17:90a:5648:: with SMTP id d8mr19393787pji.163.1589156963138; Sun, 10 May 2020 17:29:23 -0700 (PDT) Received: from ?IPv6:2001:44b8:203:1200:be5f:f4ff:fef7:7bdc? (2001-44b8-0203-1200-be5f-f4ff-fef7-7bdc.static.ipv6.internode.on.net. [2001:44b8:203:1200:be5f:f4ff:fef7:7bdc]) by smtp.googlemail.com with ESMTPSA id u12sm7730341pfc.15.2020.05.10.17.29.21 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Sun, 10 May 2020 17:29:22 -0700 (PDT) To: guix-devel From: Michael Zucchi Subject: icu4j, antlr4, source archives without a root path Message-ID: <5b42ff70-c6e3-e1f5-c1f8-101df1314f96@gmail.com> Date: Mon, 11 May 2020 09:59:18 +0930 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.9.0 MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="------------D201B137C5269EFF3FF231DD" Content-Language: en-AU Received-SPF: pass client-ip=2607:f8b0:4864:20::1036; envelope-from=notzed@gmail.com; helo=mail-pj1-x1036.google.com X-detected-operating-system: by eggs.gnu.org: No matching host in p0f cache. That's all we know. X-Spam_score_int: -10 X-Spam_score: -1.1 X-Spam_bar: - X-Spam_report: (-1.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, HTML_FONT_FACE_BAD=0.981, HTML_MESSAGE=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_PASS=-0.001, URIBL_BLOCKED=0.001 autolearn=_AUTOLEARN X-Spam_action: no action X-BeenThere: guix-devel@gnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: "Development of GNU Guix and the GNU System distribution." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: guix-devel-bounces+larch=yhetil.org@gnu.org Sender: "Guix-devel" X-Scanner: scn0 X-Spam-Score: -0.71 Authentication-Results: aspmx1.migadu.com; dkim=pass header.d=gmail.com header.s=20161025 header.b=H0/4GD1F; dmarc=pass (policy=none) header.from=gmail.com; spf=pass (aspmx1.migadu.com: domain of guix-devel-bounces@gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=guix-devel-bounces@gnu.org X-Scan-Result: default: False [-0.71 / 13.00]; RCVD_VIA_SMTP_AUTH(0.00)[]; GENERIC_REPUTATION(0.00)[-0.53925206137982]; DWL_DNSWL_BLOCKED(0.00)[209.51.188.17:from,gmail.com:dkim]; R_SPF_ALLOW(-0.20)[+ip4:209.51.188.0/24:c]; FREEMAIL_FROM(0.00)[gmail.com]; IP_REPUTATION_HAM(0.00)[asn: 22989(0.08), country: US(-0.00), ip: 209.51.188.17(-0.54)]; URI_COUNT_ODD(1.00)[25]; TO_DN_ALL(0.00)[]; DKIM_TRACE(0.00)[gmail.com:+]; DMARC_POLICY_ALLOW(-0.50)[gmail.com,none]; MX_GOOD(-0.50)[cached: eggs.gnu.org]; MAILLIST(-0.20)[mailman]; FORGED_RECIPIENTS_MAILLIST(0.00)[]; RCVD_IN_DNSWL_FAIL(0.00)[209.51.188.17:server fail]; MIME_TRACE(0.00)[0:+,1:+,2:~]; RCVD_TLS_LAST(0.00)[]; ASN(0.00)[asn:22989, ipnet:209.51.188.0/24, country:US]; MID_RHS_MATCH_FROM(0.00)[]; TAGGED_FROM(0.00)[larch=yhetil.org]; ARC_NA(0.00)[]; R_DKIM_ALLOW(-0.20)[gmail.com:s=20161025]; RCVD_COUNT_FIVE(0.00)[6]; FROM_HAS_DN(0.00)[]; URIBL_BLOCKED(0.00)[antlr.org:url,icu-project.org:url,javaee.github.io:url]; FROM_NEQ_ENVFROM(0.00)[notzed@gmail.com,guix-devel-bounces@gnu.org]; MIME_GOOD(-0.10)[multipart/alternative,text/plain]; PREVIOUSLY_DELIVERED(0.00)[guix-devel@gnu.org]; HAS_LIST_UNSUB(-0.01)[]; RCPT_COUNT_ONE(0.00)[1]; RWL_MAILSPIKE_POSSIBLE(0.00)[209.51.188.17:from]; FORGED_SENDER_MAILLIST(0.00)[] X-TUID: pMnqOJwFAh4u This is a multi-part message in MIME format. --------------D201B137C5269EFF3FF231DD Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit Morning, While working toward openjfx I encountered a problem with the java-icu4j package required for antlr4 which openjfx requires. Firstly it's building the wrong source - it's trying to build ic4j-*-src.jar which only contains the java source suitable for browsing in an ide and is thus missing the resource and build files.  So while it creates a package that allows compilation to pass it doesn't actually work. So I tried creating one from the correct source, and for the sake of it, using the same version as the existing icu4c package - 66.1[1].  The correct java source archive is icu4j-66_1.tgz . I couldn't use githere because the icu git repository requires git lfs.  My system git doesn't have it so i didn't even try to see if git-fetch supports it. For some reason (unlike icu4c) this is not archived within a single subdirectory which causes at least two problems.  First the gnu-build-system unpack function changes to the first subdirectory it finds after unpacking any archive, which in this case is nothing useful.  This can be hacked around by replacing the unpack function or adding a post-pack modification to run "cd ..". The second is that you cannot apply any patches as the (source (patches --)) function uses an entirely different  mechanism to change to the source root subdirectory where it simply chooses the first directory entry it finds - which at least in this case is a file!  So it fails and aborts.  Of course the patches could just be applied as a post-unpack function in the same manner as substitute* is often used. I found this second issue by accident, icu4j doesn't need a patch. For what it's worth by mid last week I went through this and managed to get antlr4 to build (what an awful mess[2]) and have worked out the steps for openjfx but it was such a miserable few days of work that I went and did other things for a while.  So sorry to say that at this point I'm not sure if i'll ever get around to submitting patches for any of this. Regards,  Z [1] https://github.com/unicode-org/icu/releases/tag/release-66-1 [2] antlr.scm work in progress (define-module (antlr)  #:use-module (guix packages)  #:use-module (guix download)  #:use-module (guix git-download)  #:use-module (guix build-system ant)  #:use-module ((guix licenses) #:prefix license:)  #:use-module (gnu packages)  #:use-module (gnu packages java))                                         ; really out of date but this is the version used by antlr4                                         ; this might want to have javafx.json (the api) as a separate output? (define-public jsonp   (package     (name "jsonp")     (version "jsonp-1.0.4")     (source (origin               (method git-fetch)               (uri (git-reference                     (url "https://github.com/javaee/jsonp.git")                     (commit version)))               (file-name (git-file-name name version))               (sha256                (base32 "01r4syivcywpvxkr1hn0az9316pr7qpnx154zzzw0nijfmdlbw7n"))))     (build-system ant-build-system)     (arguments      `(#:jar-name (string-append ,name "-" ,version ".jar")                   #:tests? #f                   #:source-dir "impl/src/main/java:api/src/main/java"                   #:phases                   (modify-phases %standard-phases                     (add-before 'build 'fix-build-xml                       (lambda _                         (substitute* "build.xml"                           (("target name=\"compile\">")                            "target name=\"compile\"> ")))))))     (home-page "https://javaee.github.io/jsonp/")     (synopsis "JSON Processing api")     (description "JSON Processing (JSON-P) is a Java API to process  (for e.g. parse, generate, transform and query) JSON messages. It  produces and consumes JSON text in a streaming fashion (similar to  StAX API for XML) and allows to build a Java object model for JSON  text using API classes (similar to DOM API for XML). ")     (license license:gpl2))) ; with classpath exception                                         ; java-icu4j is broken (define-public java-icu4j-66   (package     (name "icu4j")     (version "66.1")     (source (origin               (method url-fetch)               (uri (string-append "https://github.com/unicode-org/icu/releases/download/release-"                     (string-map (lambda (x) (if (char=? x #\.) #\- x)) version)                     "/icu4j-"                     (string-map (lambda (x) (if (char=? x #\.) #\_ x)) version)                     ".tgz"))               (sha256                (base32 "1ahdyz9209lwl7knb2l3gmnkkby221p0vpgx70fj4j02rdzgvw0d"))               ))     (build-system ant-build-system)     (arguments      `(#:tests? #f                      ; no tests included                 #:phases                 (modify-phases %standard-phases                   (replace 'unpack                     (lambda* (#:key source #:allow-other-keys)                       (mkdir "source")                       (chdir "source")                       (invoke "tar" "xvf" source)))                   (replace 'install                     (lambda* (#:key outputs #:allow-other-keys)                       (let ((out (assoc-ref outputs "out")))                         (mkdir-p (string-append out "/share/java"))                         (copy-file "icu4j.jar" (string-append out "/share/java/icu4j-" ,version ".jar"))                         #t)))                   )                 )      )     (home-page "http://site.icu-project.org/")     (synopsis "International Components for Unicode")     (description      "ICU is a set of C/C++ and Java libraries providing Unicode and globalisation support for software applications.  This package contains the Java part.")     (license license:x11))) (define-public antlr4   (package     (name "antlr4")     (version "4.7.2")     (source (origin               (method git-fetch)               (uri (git-reference                     (url "https://github.com/antlr/antlr4")                     (commit version)))               (file-name (git-file-name name version))               (sha256                (base32 "1pl0zs6c6wx9nmq30s7ccpc3dl72az55i8vfp574fw9sywmvxmlj"))               (patches                (search-patches "antlr-template.patch"))               ))     (build-system ant-build-system)     (arguments      `(#:jar-name (string-append ,name "-" ,version ".jar")                   #:source-dir "tool/src:runtime/Java/src:build/gensrc/tool"                   #:tests? #f                   #:phases                   (modify-phases %standard-phases                     (add-after 'install 'bin-install                       (lambda* (#:key inputs outputs #:allow-other-keys)                         (let ((jar (string-append (assoc-ref outputs "out") "/share/java"))                               (bin (string-append (assoc-ref outputs "out") "/bin")))                           (mkdir-p bin)                           (with-output-to-file (string-append bin "/antlr4")                             (lambda _                               (display                                (string-append "#!" (which "sh") "\n"                                               "java -cp " jar "/" ,name "-" ,version ".jar:"                                               (string-concatenate                                                (find-files (assoc-ref inputs "stringtemplate") ".*\\.jar"))                                               ":"                                               (string-concatenate                                                (find-files (assoc-ref inputs "stringtemplate4") ".*\\.jar"))                                               ":"                                               (string-concatenate                                                (find-files (string-append (assoc-ref inputs "antlr") "/lib") ".*\\.jar"))                                               " org.antlr.Tool $*"))))                           (chmod (string-append bin "/antlr4") #o755))                         #t))                     (add-after 'configure 'generate-grammar                       (lambda _                         (invoke "antlr3"                                 "-o", "build/gensrc", "tool/src/org/antlr/v4/codegen/SourceGenTriggers.g" "tool/src/org/antlr/v4/parse/ANTLRLexer.g" "tool/src/org/antlr/v4/parse/ANTLRParser.g" "tool/src/org/antlr/v4/parse/ATNBuilder.g" "tool/src/org/antlr/v4/parse/ActionSplitter.g" "tool/src/org/antlr/v4/parse/BlockSetTransformer.g" "tool/src/org/antlr/v4/parse/GrammarTreeVisitor.g" "tool/src/org/antlr/v4/parse/LeftRecursiveRuleWalker.g")                         #t))                     (add-after 'generate-grammar 'build-runtime                       (lambda _                         (mkdir-p "build/classes")                         (apply invoke "javac"                                "-source" "1.7"                                "-target" "1.7"                                "-d" "build/classes"                                (find-files "runtime/Java/src" "\\.java$"))))                     (add-after 'build-runtime 'build-controller                                         ; replicate functionality of maven-stringtemplate-plugin as there is no tool for it(?)                       (lambda* (#:key inputs #:allow-other-keys)                         (with-output-to-file "build/gensrc/MakeTemplate.java"                           (lambda _                             (display "import org.stringtemplate.v4.ST; import org.stringtemplate.v4.STGroup; import org.stringtemplate.v4.STGroupDir; import org.stringtemplate.v4.misc.ErrorBuffer; import org.stringtemplate.v4.AutoIndentWriter; import java.io.FileWriter; import java.io.IOException; import java.util.Map; public class MakeTemplate {     public static void main(String[] argv) {         String dir=argv[0];         String name=argv[1];         String res=argv[2];         STGroup group = new STGroupDir(dir);         ST st = group.getInstanceOf(name);         for (Map.Entry e: org.antlr.v4.unicode.UnicodeDataTemplateController.getProperties().entrySet())             st.add(e.getKey(), e.getValue());         try (FileWriter out = new FileWriter(res)) {             ErrorBuffer listener = new ErrorBuffer();             st.write(new AutoIndentWriter(out), listener);             if(!listener.errors.isEmpty())                 throw new IOException(listener.toString());         } catch (IOException x) {             x.printStackTrace(System.err);             System.exit(1);         }     } }")))                         (mkdir "build/genclasses")                         (invoke "javac"                                 "-d" "build/genclasses"                                 "-classpath"                                 (string-join                                  (append                                   '("build/classes")                                   (find-files (assoc-ref inputs "stringtemplate") "\\.jar$")                                   (find-files (assoc-ref inputs "icu4j") "\\.jar$"))                                  ":") "tool/src/org/antlr/v4/unicode/UnicodeDataTemplateController.java"                                 "build/gensrc/MakeTemplate.java")                         #t))                     (add-after 'build-controller 'process-templates                       (lambda* (#:key inputs #:allow-other-keys)                         (mkdir-p "build/gensrc/tool/org/antlr/v4/unicode")                         (invoke "java"                                 "-classpath"                                 (string-join                                  (append                                   '("build/classes" "build/genclasses")                                   (find-files (assoc-ref inputs "stringtemplate") "\\.jar$")                                   (find-files (assoc-ref inputs "antlr3") "\\.jar$")                                   (find-files (assoc-ref inputs "icu4j") "\\.jar$"))                                  ":")                                 "MakeTemplate" "tool/resources/org/antlr/v4/tool/templates"                                 "unicodedata" "build/gensrc/tool/org/antlr/v4/unicode/UnicodeData.java")))                     (add-before 'build 'fix-build-xml                       (lambda _                         (substitute* "build.xml"                           (("target name=\"compile\">")                            "target name=\"compile\"> ") (("(]*)/>" all letters)                            (string-append letters "> ")))                         #t)))))     (native-inputs      `(("icu4j" ,java-icu4j-66)        ("antlr3" ,antlr3)        ))     (inputs      `(("junit" ,java-junit)        ("stringtemplate" ,java-stringtemplate)        ("jsonp" ,jsonp)        ))     (propagated-inputs      `(        ("antlr3" ,antlr3)        ("stringtemplate" ,java-stringtemplate)        ))     (home-page "https://www.antlr.org")     (synopsis "Framework for constructing recognisers, compilers, and translators")     (description "ANTLR, ANother Tool for Language Recognition, (formerly PCCTS) is a language tool that provides a framework for constructing recognisers, compilers, and translators from grammatical descriptions containing Java, C#, C++, or Python actions.  ANTLR provides excellent support for tree construction, tree walking, and translation.")     (license license:bsd-3))) --------------D201B137C5269EFF3FF231DD Content-Type: text/html; charset=utf-8 Content-Transfer-Encoding: 8bit
Morning,

While working toward openjfx I encountered a problem with the java-icu4j package required for antlr4 which openjfx requires.  Firstly it's building the wrong source - it's trying to build ic4j-*-src.jar which only contains the java source suitable for browsing in an ide and is thus missing the resource and build files.  So while it creates a package that allows compilation to pass it doesn't actually work.

So I tried creating one from the correct source, and for the sake of it, using the same version as the existing icu4c package - 66.1[1].  The correct java source archive is
icu4j-66_1.tgz I couldn't use git here because the icu git repository requires git lfs.  My system git doesn't have it so i didn't even try to see if git-fetch supports it.

For some reason (unlike icu4c) thi
s is not archived within a single subdirectory which causes at least two problems.  First the gnu-build-system unpack function changes to the first subdirectory it finds after unpacking any archive, which in this case is nothing useful.  This can be hacked around by replacing the unpack function or adding a post-pack modification to run "cd ..". The second is that you cannot apply any patches as the (source (patches --)) function uses an entirely different  mechanism to change to the source root subdirectory where it simply chooses the first directory entry it finds - which at least in this case is a file!  So it fails and aborts.  Of course the patches could just be applied as a post-unpack function in the same manner as substitute* is often used.

I found this second issue by accident, icu4j doesn't need a patch.

For what it's worth by mid last week I went through this and managed to get antlr4 to build (what an awful mess[2]) and have worked out the steps for openjfx but it was such a miserable few days of work that I went and did other things for a while.  So sorry to say that at this point I'm not sure if i'll ever get around to submitting patches for any of this.

Regards,
 Z

[1] https://github.com/unicode-org/icu/releases/tag/release-66-1
[2] antlr.scm work in progress

(define-module (antlr)
 #:use-module (guix packages)
 #:use-module (guix download)
 #:use-module (guix git-download)
 #:use-module (guix build-system ant)
 #:use-module ((guix licenses) #:prefix license:)
 #:use-module (gnu packages)
 #:use-module (gnu packages java))

                                        ; really out of date but this is the version used by antlr4
                                        ; this might want to have javafx.json (the api) as a separate output?
(define-public jsonp
  (package
    (name "jsonp")
    (version "jsonp-1.0.4")
    (source (origin
              (method git-fetch)
              (uri (git-reference
                    (url "https://github.com/javaee/jsonp.git")
                    (commit version)))
              (file-name (git-file-name name version))
              (sha256
               (base32
                "01r4syivcywpvxkr1hn0az9316pr7qpnx154zzzw0nijfmdlbw7n"))))
    (build-system ant-build-system)
    (arguments
     `(#:jar-name (string-append ,name "-" ,version ".jar")
                  #:tests? #f
                  #:source-dir "impl/src/main/java:api/src/main/java"
                  #:phases
                  (modify-phases %standard-phases
                    (add-before 'build 'fix-build-xml
                      (lambda _
                        (substitute* "build.xml"
                          (("target name=\"compile\">")
                           "target name=\"compile\">
<copy todir=\"${classes.dir}\">
<fileset dir=\"impl/src/main/resources\">
<include name=\"**/*.properties\"/>
</fileset>
</copy>")))))))
    (home-page "https://javaee.github.io/jsonp/")
    (synopsis "JSON Processing api")
    (description "JSON Processing (JSON-P) is a Java API to process
 (for e.g. parse, generate, transform and query) JSON messages. It
 produces and consumes JSON text in a streaming fashion (similar to
 StAX API for XML) and allows to build a Java object model for JSON
 text using API classes (similar to DOM API for XML). ")
    (license license:gpl2))) ; with classpath exception

                                        ; java-icu4j is broken
(define-public java-icu4j-66
  (package
    (name "icu4j")
    (version "66.1")
    (source (origin
              (method url-fetch)
              (uri (string-append
                    "https://github.com/unicode-org/icu/releases/download/release-"
                    (string-map (lambda (x) (if (char=? x #\.) #\- x)) version)
                    "/icu4j-"
                    (string-map (lambda (x) (if (char=? x #\.) #\_ x)) version)
                    ".tgz"))
              (sha256
               (base32
                "1ahdyz9209lwl7knb2l3gmnkkby221p0vpgx70fj4j02rdzgvw0d"))
              ))
    (build-system ant-build-system)
    (arguments
     `(#:tests? #f                      ; no tests included
                #:phases
                (modify-phases %standard-phases
                  (replace 'unpack
                    (lambda* (#:key source #:allow-other-keys)
                      (mkdir "source")
                      (chdir "source")
                      (invoke "tar" "xvf" source)))

                  (replace 'install
                    (lambda* (#:key outputs #:allow-other-keys)
                      (let ((out (assoc-ref outputs "out")))
                        (mkdir-p (string-append out "/share/java"))
                        (copy-file "icu4j.jar" (string-append out "/share/java/icu4j-" ,version ".jar"))
                        #t)))
                  )
                )
     )
    (home-page "http://site.icu-project.org/")
    (synopsis "International Components for Unicode")
    (description
     "ICU is a set of C/C++ and Java libraries providing Unicode and
globalisation support for software applications.  This package contains the
Java part.")
    (license license:x11)))

(define-public antlr4
  (package
    (name "antlr4")
    (version "4.7.2")
    (source (origin
              (method git-fetch)
              (uri (git-reference
                    (url "https://github.com/antlr/antlr4")
                    (commit version)))
              (file-name (git-file-name name version))
              (sha256
               (base32
                "1pl0zs6c6wx9nmq30s7ccpc3dl72az55i8vfp574fw9sywmvxmlj"))
              (patches
               (search-patches "antlr-template.patch"))
              ))


    (build-system ant-build-system)
    (arguments
     `(#:jar-name (string-append ,name "-" ,version ".jar")
                  #:source-dir "tool/src:runtime/Java/src:build/gensrc/tool"
                  #:tests? #f
                  #:phases
                  (modify-phases %standard-phases
                    (add-after 'install 'bin-install
                      (lambda* (#:key inputs outputs #:allow-other-keys)
                        (let ((jar (string-append (assoc-ref outputs "out") "/share/java"))
                              (bin (string-append (assoc-ref outputs "out") "/bin")))
                          (mkdir-p bin)
                          (with-output-to-file (string-append bin "/antlr4")
                            (lambda _
                              (display
                               (string-append "#!" (which "sh") "\n"
                                              "java -cp " jar "/" ,name "-" ,version ".jar:"
                                              (string-concatenate
                                               (find-files (assoc-ref inputs "stringtemplate")
                                                           ".*\\.jar"))
                                              ":"
                                              (string-concatenate
                                               (find-files (assoc-ref inputs "stringtemplate4")
                                                           ".*\\.jar"))
                                              ":"
                                              (string-concatenate
                                               (find-files (string-append
                                                            (assoc-ref inputs "antlr")
                                                            "/lib")
                                                           ".*\\.jar"))
                                              " org.antlr.Tool $*"))))
                          (chmod (string-append bin "/antlr4") #o755))
                        #t))
                    (add-after 'configure 'generate-grammar
                      (lambda _
                        (invoke "antlr3"
                                "-o", "build/gensrc",
                                "tool/src/org/antlr/v4/codegen/SourceGenTriggers.g"
                                "tool/src/org/antlr/v4/parse/ANTLRLexer.g"
                                "tool/src/org/antlr/v4/parse/ANTLRParser.g"
                                "tool/src/org/antlr/v4/parse/ATNBuilder.g"
                                "tool/src/org/antlr/v4/parse/ActionSplitter.g"
                                "tool/src/org/antlr/v4/parse/BlockSetTransformer.g"
                                "tool/src/org/antlr/v4/parse/GrammarTreeVisitor.g"
                                "tool/src/org/antlr/v4/parse/LeftRecursiveRuleWalker.g")
                        #t))
                    (add-after 'generate-grammar 'build-runtime
                      (lambda _
                        (mkdir-p "build/classes")
                        (apply invoke "javac"
                               "-source" "1.7"
                               "-target" "1.7"
                               "-d" "build/classes"
                               (find-files "runtime/Java/src" "\\.java$"))))
                    (add-after 'build-runtime 'build-controller
                                        ; replicate functionality of maven-stringtemplate-plugin as there is no tool for it(?)
                      (lambda* (#:key inputs #:allow-other-keys)
                        (with-output-to-file "build/gensrc/MakeTemplate.java"
                          (lambda _
                            (display "import org.stringtemplate.v4.ST;
import org.stringtemplate.v4.STGroup;
import org.stringtemplate.v4.STGroupDir;
import org.stringtemplate.v4.misc.ErrorBuffer;
import org.stringtemplate.v4.AutoIndentWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Map;

public class MakeTemplate {
    public static void main(String[] argv) {
        String dir=argv[0];
        String name=argv[1];
        String res=argv[2];

        STGroup group = new STGroupDir(dir);
        ST st = group.getInstanceOf(name);

        for (Map.Entry<String,Object> e: org.antlr.v4.unicode.UnicodeDataTemplateController.getProperties().entrySet())
            st.add(e.getKey(), e.getValue());

        try (FileWriter out = new FileWriter(res)) {
            ErrorBuffer listener = new ErrorBuffer();
            st.write(new AutoIndentWriter(out), listener);
            if(!listener.errors.isEmpty())
                throw new IOException(listener.toString());
        } catch (IOException x) {
            x.printStackTrace(System.err);
            System.exit(1);
        }
    }
}")))
                        (mkdir "build/genclasses")
                        (invoke "javac"
                                "-d" "build/genclasses"
                                "-classpath"
                                (string-join
                                 (append
                                  '("build/classes")
                                  (find-files (assoc-ref inputs "stringtemplate") "\\.jar$")
                                  (find-files (assoc-ref inputs "icu4j") "\\.jar$"))
                                 ":")
                                "tool/src/org/antlr/v4/unicode/UnicodeDataTemplateController.java"
                                "build/gensrc/MakeTemplate.java")
                        #t))
                    (add-after 'build-controller 'process-templates
                      (lambda* (#:key inputs #:allow-other-keys)
                        (mkdir-p "build/gensrc/tool/org/antlr/v4/unicode")
                        (invoke "java"
                                "-classpath"
                                (string-join
                                 (append
                                  '("build/classes" "build/genclasses")
                                  (find-files (assoc-ref inputs "stringtemplate") "\\.jar$")
                                  (find-files (assoc-ref inputs "antlr3") "\\.jar$")
                                  (find-files (assoc-ref inputs "icu4j") "\\.jar$"))
                                 ":")
                                "MakeTemplate"
                                "tool/resources/org/antlr/v4/tool/templates"
                                "unicodedata"
                                "build/gensrc/tool/org/antlr/v4/unicode/UnicodeData.java")))
                    (add-before 'build 'fix-build-xml
                      (lambda _
                        (substitute* "build.xml"
                          (("target name=\"compile\">")
                           "target name=\"compile\">
<copy todir=\"${classes.dir}\">
<fileset dir=\"tool/resources\">
<include name=\"**/*.stg\"/>
<include name=\"**/*.st\"/>
<include name=\"**/*.sti\"/>
</fileset>
</copy>")
                          (("(<javac.*srcdir=\"tool/src[^>]*)/>" all letters)
                           (string-append letters "><exclude name=\"org/antlr/v4/unicode/UnicodeDataTemplateController.java\"/>
<exclude name=\"org/antlr/v4/gui/**\"/>
</javac>")))
                        #t)))))
    (native-inputs
     `(("icu4j" ,java-icu4j-66)
       ("antlr3" ,antlr3)
       ))
    (inputs
     `(("junit" ,java-junit)
       ("stringtemplate" ,java-stringtemplate)
       ("jsonp" ,jsonp)
       ))
    (propagated-inputs
     `(
       ("antlr3" ,antlr3)
       ("stringtemplate" ,java-stringtemplate)
       ))
    (home-page "https://www.antlr.org")
    (synopsis "Framework for constructing recognisers, compilers, and translators")
    (description "ANTLR, ANother Tool for Language Recognition, (formerly PCCTS)
is a language tool that provides a framework for constructing recognisers,
compilers, and translators from grammatical descriptions containing Java, C#,
C++, or Python actions.  ANTLR provides excellent support for tree construction,
tree walking, and translation.")
    (license license:bsd-3)))

--------------D201B137C5269EFF3FF231DD--