Subject: Re: [bug#28546] Add some ocaml packages

From: Julien Lepiller <[email-masked]>
Date: Fri, 22 Sep 2017 21:04:48 +0200

Le Thu, 21 Sep 2017 23:09:28 -0500,
Eric Bavier <[email-masked]> a écrit :

> Hi Julien,
> 
> Thanks for the patches.  Just a few comments below:

Thank you for this very detailed review :)

I think I addressed all your comments in the attached new patches, and
I will answer your other questions below:

> 
> On Thu, 21 Sep 2017 22:46:51 +0200
> Julien Lepiller <[email-masked]> wrote:
> 
> In a few of the later patches, you declared 'home-page' before
> 'source' so that it could be used in the uri.  That seams reasonable
> to me.  Did you want to do that in all these patches?

It seems this is not the way it is done elsewhere, and I was asked to
stick with this style.

> > "1whqr2bb3gds2zmrzqnv8vqka9928w4lx6mi6g244kmbwb2h8d8l"))
> > +              (file-name (string-append name "-" version
> > ".tar.gz"))
> > +              (patches (search-patches
> > "ocaml-piqilib-fix-makefile.patch"))))  
>                                            ^
> This patch is missing.

Indeed, I use GUIX_PACKAGE_PATH, so it was actually fetching the
package and the patch from that other directory... I should remember to
unset this variable before testing a patch.

> 
> > +    (build-system ocaml-build-system)
> > +    (arguments
> > +     `(#:phases
> > +       (modify-phases %standard-phases
> > +         (replace 'configure
> > +           (lambda* (#:key outputs #:allow-other-keys)
> > +             (let ((out (assoc-ref outputs "out")))
> > +               (substitute* "make/OCamlMakefile"
> > +                 (("/bin/sh") (which "bash")))  
> 
> Does setting the "SHELL" environment variable work instead?

Yes it does, thank you for spotting this. It also works for most of the
other packages.

> 
> > +               (zero? (system* "./configure" "--prefix" out
> > "--ocaml-libdir"
> > +                               (string-append out
> > "/lib/ocaml/site-lib"))))))  
> 
> Is passing '#:configure-flags' not enough?

The configure script of OCaml packages is usually not an autotools one.
The all have a different set of options they require. Our
ocaml-build-system passes "-prefix" out and then configure-flags.
Setting configure-flags only would therefore fail, because the
"-prefix" option would not be recognized (one dash, when it expects
two). The ocaml-build-system is made that way because it seems most
configure scripts for ocaml packages require only one dash.

> 
> > +       (add-after 'build 'build-ocaml
> > +         (lambda* (#:key outputs #:allow-other-keys)
> > +           (zero? (system* "make" "ocaml")))) 
> > +       (add-after 'install 'install-ocaml
> > +         (lambda* (#:key outputs #:allow-other-keys)
> > +           (zero? (system* "make" "ocaml-install"))))
> > +       (add-after 'install-ocaml 'link-stubs
> > +         (lambda* (#:key outputs #:allow-other-keys)
> > +           (let* ((out (assoc-ref outputs "out"))
> > +                  (stubs (string-append out
> > "/lib/ocaml/site-lib/stubslibs"))
> > +                  (lib (string-append out
> > "/lib/ocaml/site-lib/piqilib")))
> > +             (mkdir-p stubs)
> > +             (symlink (string-append lib "/dllpiqilib_stubs.so")
> > +                      (string-append stubs
> > "/dllpiqilib_stubs.so"))))))))  
> 
> Is there some sort of configuration flag that can be used to install
> these library into the right place?

Unfortunately, I didn't find any.

> 
> Is this package to avoid having to build the entire piqi tool?

This package doesn't come from the same source as piqi-ocaml. I don't
know exactly how it works, though, because I added it only as a
dependency.

> > +   (inputs `(("llvm" ,llvm)))
> > +   (arguments
> > +    `(#:use-make? #t
> > +      #:phases
> > +      (modify-phases %standard-phases
> > +        (replace 'configure
> > +          (lambda* (#:key outputs #:allow-other-keys)
> > +            (zero? (system* "./configure" "--prefix"
> > +                            (assoc-ref outputs "out")
> > +                            "--libdir"
> > +                            (string-append
> > +                              (assoc-ref outputs "out")
> > +                              "/lib/ocaml/site-lib")
> > +                            "--with-llvm-version=3.8"
> > +                            "--with-llvm-config=llvm-config"
> > +                            "--enable-everything"))))  
> 
> Could you put these flags in '#:configure-flags' instead?

Again, --prefix vs -prefix

> 
> Maybe our ocaml-build-system should be defining SHELL and CONFIG_SHELL
> in the flags passed to configure, like gnu-build-system does.  Or does
> that not work for some ocaml projects?

Since most configure scripts are not autotools one, they don't
recognize variables passed as arguments.

> 
> 
> Otherwise looks good to me.
> 
> Sorry for long reply and all the questions,
> `~Eric

>From 5344f2cb8f8661fbc5c8ddb039ce9e2578790e71 Mon Sep 17 00:00:00 2001
From: Julien Lepiller <[email-masked]>
Date: Thu, 21 Sep 2017 20:32:27 +0200
Subject: [PATCH 01/10] gnu: Add ocaml-ezjsonm.

* gnu/packages/ocaml.scm (ocaml-ezjsonm): New variable.
---
 gnu/packages/ocaml.scm | 30 ++++++++++++++++++++++++++++++
 1 file changed, 30 insertions(+)

diff --git a/gnu/packages/ocaml.scm b/gnu/packages/ocaml.scm
index 700c5698e..f3ebb2854 100644
--- a/gnu/packages/ocaml.scm
+++ b/gnu/packages/ocaml.scm
@@ -3197,6 +3197,36 @@ writing to these structures, and they are accessed via the Bigarray module.")
     (description "Hex is a minimal library providing hexadecimal converters.")
     (license license:isc)))
 
+(define-public ocaml-ezjsonm
+  (package
+    (name "ocaml-ezjsonm")
+    (version "0.4.3")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "https://github.com/mirage/ezjsonm/archive/"
+                                  version ".tar.gz"))
+              (sha256
+               (base32
+                "1kag0z2xlk4rw73a240dmkxh9rj6psxxcxkm7d7z0rrj6hzjajgq"))
+              (file-name (string-append name "-" version ".tar.gz"))))
+    (build-system ocaml-build-system)
+    (native-inputs
+     `(("alcotest" ,ocaml-alcotest)))
+    (propagated-inputs
+     `(("hex" ,ocaml-hex)
+       ("jsonm" ,ocaml-jsonm)
+       ("lwt" ,ocaml-lwt)
+       ("sexplib" ,ocaml-sexplib)))
+    (arguments
+     `(#:configure-flags (list "--enable-lwt")))
+    (home-page "https://github.com/mirage/ezjsonm/")
+    (synopsis "Read and write JSON data")
+    (description "Ezjsonm provides more convenient (but far less flexible) input
+and output functions that go to and from [string] values than jsonm.  This avoids
+the need to write signal code, which is useful for quick scripts that manipulate
+JSON.")
+    (license license:isc)))
+
 (define-public coq-flocq
   (package
     (name "coq-flocq")
-- 
2.14.1

>From bde4818c65208765febb9407b6c7e524a171a3d8 Mon Sep 17 00:00:00 2001
From: Julien Lepiller <[email-masked]>
Date: Thu, 21 Sep 2017 20:33:33 +0200
Subject: [PATCH 02/10] gnu: Add ocaml-uri.

* gnu/packages/ocaml.scm (ocaml-uri): New variable.
---
 gnu/packages/ocaml.scm | 26 ++++++++++++++++++++++++++
 1 file changed, 26 insertions(+)

diff --git a/gnu/packages/ocaml.scm b/gnu/packages/ocaml.scm
index f3ebb2854..b4b4f2333 100644
--- a/gnu/packages/ocaml.scm
+++ b/gnu/packages/ocaml.scm
@@ -3227,6 +3227,32 @@ the need to write signal code, which is useful for quick scripts that manipulate
 JSON.")
     (license license:isc)))
 
+(define-public ocaml-uri
+  (package
+    (name "ocaml-uri")
+    (version "1.9.2")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "https://github.com/mirage/ocaml-uri/archive/v"
+                                  version ".tar.gz"))
+              (sha256
+               (base32
+                "02bzrag79prx261rxf9mlak749pwf4flpfl8p012x1xznv9m0clc"))
+              (file-name (string-append name "-" version ".tar.gz"))))
+    (build-system ocaml-build-system)
+    (native-inputs
+     `(("ounit" ,ocaml-ounit)))
+    (propagated-inputs
+     `(("ppx-sexp-conv" ,ocaml-ppx-sexp-conv)
+       ("re" ,ocaml-re)
+       ("ppx-deriving" ,ocaml-ppx-deriving)
+       ("sexplib" ,ocaml-sexplib)
+       ("stringext" ,ocaml-stringext)))
+    (home-page "https://github.com/mirage/ocaml-uri")
+    (synopsis "RFC3986 URI/URL parsing library")
+    (description "OCaml-uri is a library for parsing URI/URL in the RFC3986 format.")
+    (license license:isc)))
+
 (define-public coq-flocq
   (package
     (name "coq-flocq")
-- 
2.14.1

>From e99d48de514e98bf9c1e862f35df406eda9c4a60 Mon Sep 17 00:00:00 2001
From: Julien Lepiller <[email-masked]>
Date: Thu, 21 Sep 2017 20:34:27 +0200
Subject: [PATCH 03/10] gnu: Add ocaml-easy-format.

* gnu/packages/ocaml.scm (ocaml-easy-format): New variable.
---
 gnu/packages/ocaml.scm | 23 +++++++++++++++++++++++
 1 file changed, 23 insertions(+)

diff --git a/gnu/packages/ocaml.scm b/gnu/packages/ocaml.scm
index b4b4f2333..35a5a10e4 100644
--- a/gnu/packages/ocaml.scm
+++ b/gnu/packages/ocaml.scm
@@ -3253,6 +3253,29 @@ JSON.")
     (description "OCaml-uri is a library for parsing URI/URL in the RFC3986 format.")
     (license license:isc)))
 
+(define-public ocaml-easy-format
+  (package
+    (name "ocaml-easy-format")
+    (version "1.2.0")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "https://github.com/mjambon/easy-format/"
+                                  "archive/v" version ".tar.gz"))
+              (sha256
+               (base32
+                "1zcz682y9figa84k7lgdjcab5qbzk3yy14ygfqp2dhhrvjygm252"))
+              (file-name (string-append name "-" version ".tar.gz"))))
+    (build-system ocaml-build-system)
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         (delete 'configure))))
+    (home-page "https://github.com/mjambon/easy-format")
+    (synopsis "Interface to the Format module")
+    (description "Easy-format is a high-level and functional interface to the
+Format module of the OCaml standard library.")
+    (license license:bsd-3)))
+
 (define-public coq-flocq
   (package
     (name "coq-flocq")
-- 
2.14.1

>From ba5861d55b9749978aa7191798afc87417c67c59 Mon Sep 17 00:00:00 2001
From: Julien Lepiller <[email-masked]>
Date: Thu, 21 Sep 2017 20:35:17 +0200
Subject: [PATCH 04/10] gnu: Add ocaml-optcomp.

* gnu/packages/ocaml.scm (ocaml-optcomp): New variable.
---
 gnu/packages/ocaml.scm | 27 +++++++++++++++++++++++++++
 1 file changed, 27 insertions(+)

diff --git a/gnu/packages/ocaml.scm b/gnu/packages/ocaml.scm
index 35a5a10e4..4cb66bd2b 100644
--- a/gnu/packages/ocaml.scm
+++ b/gnu/packages/ocaml.scm
@@ -3276,6 +3276,33 @@ JSON.")
 Format module of the OCaml standard library.")
     (license license:bsd-3)))
 
+(define-public optcomp
+  (package
+    (name "optcomp")
+    (version "1.6")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "https://github.com/diml/optcomp/archive/"
+                                  version ".tar.gz"))
+              (sha256
+               (base32
+                "0hhhb2gisah1h22zlg5iszbgqxdd7x85cwd57bd4mfkx9l7dh8jh"))
+              (file-name (string-append name "-" version ".tar.gz"))))
+    (build-system ocaml-build-system)
+    (arguments
+     `(#:use-make? #t
+       #:make-flags
+       (list (string-append "BUILDFLAGS=\"-cflags -I,"
+                            (assoc-ref %build-inputs "camlp4")
+                            "/lib/ocaml/site-lib/camlp4/Camlp4Parsers\""))))
+    (native-inputs `(("camlp4" ,camlp4)))
+    (propagated-inputs `(("camlp4" ,camlp4)))
+    (home-page "https://github.com/diml/optcomp")
+    (synopsis "Optional compilation for OCaml")
+    (description "Optcomp provides an optional compilation facility with
+cpp-like directives.")
+    (license license:bsd-3)))
+
 (define-public coq-flocq
   (package
     (name "coq-flocq")
-- 
2.14.1

>From 3647f7d8e330e1f6fbb60596739a21ccd1bd85f3 Mon Sep 17 00:00:00 2001
From: Julien Lepiller <[email-masked]>
Date: Thu, 21 Sep 2017 20:44:57 +0200
Subject: [PATCH 05/10] gnu: Add ocaml-piqilib.

* gnu/packages/ocaml.scm (ocaml-piqilib): New variable.
---
 gnu/packages/ocaml.scm                             | 53 ++++++++++++++++++++++
 .../patches/ocaml-piqilib-fix-makefile.patch       | 47 +++++++++++++++++++
 2 files changed, 100 insertions(+)
 create mode 100644 gnu/packages/patches/ocaml-piqilib-fix-makefile.patch

diff --git a/gnu/packages/ocaml.scm b/gnu/packages/ocaml.scm
index 4cb66bd2b..00665959a 100644
--- a/gnu/packages/ocaml.scm
+++ b/gnu/packages/ocaml.scm
@@ -3303,6 +3303,59 @@ Format module of the OCaml standard library.")
 cpp-like directives.")
     (license license:bsd-3)))
 
+(define-public ocaml-piqilib
+  (package
+    (name "ocaml-piqilib")
+    (version "0.6.13")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "https://github.com/alavrik/piqi/archive/v"
+                                  version ".tar.gz"))
+              (sha256
+               (base32
+                "1whqr2bb3gds2zmrzqnv8vqka9928w4lx6mi6g244kmbwb2h8d8l"))
+              (file-name (string-append name "-" version ".tar.gz"))
+              (patches (search-patches "ocaml-piqilib-fix-makefile.patch"))))
+    (build-system ocaml-build-system)
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         (replace 'configure
+           (lambda* (#:key outputs #:allow-other-keys)
+             (let ((out (assoc-ref outputs "out")))
+               (substitute* "make/OCamlMakefile"
+                 (("/bin/sh") (which "bash")))
+               (zero? (system* "./configure" "--prefix" out "--ocaml-libdir"
+                               (string-append out "/lib/ocaml/site-lib"))))))
+       (add-after 'build 'build-ocaml
+         (lambda* (#:key outputs #:allow-other-keys)
+           (zero? (system* "make" "ocaml")))) 
+       (add-after 'install 'install-ocaml
+         (lambda* (#:key outputs #:allow-other-keys)
+           (zero? (system* "make" "ocaml-install"))))
+       (add-after 'install-ocaml 'link-stubs
+         (lambda* (#:key outputs #:allow-other-keys)
+           (let* ((out (assoc-ref outputs "out"))
+                  (stubs (string-append out "/lib/ocaml/site-lib/stubslibs"))
+                  (lib (string-append out "/lib/ocaml/site-lib/piqilib")))
+             (mkdir-p stubs)
+             (symlink (string-append lib "/dllpiqilib_stubs.so")
+                      (string-append stubs "/dllpiqilib_stubs.so"))))))))
+    (native-inputs
+     `(("which" ,which)
+       ("camlp4" ,camlp4)))
+    (propagated-inputs
+     `(("xmlm" ,ocaml-xmlm)
+       ("ulex" ,ocaml-ulex)
+       ("optcomp" ,optcomp)
+       ("easy-format" ,ocaml-easy-format)
+       ("base64" ,ocaml-base64)))
+    (home-page "http://piqi.org")
+    (synopsis "Data serialization and conversion library")
+    (description "Piqilib is the common library used by the piqi command-line
+tool and piqi-ocaml.")
+    (license license:asl2.0)))
+
 (define-public coq-flocq
   (package
     (name "coq-flocq")
diff --git a/gnu/packages/patches/ocaml-piqilib-fix-makefile.patch b/gnu/packages/patches/ocaml-piqilib-fix-makefile.patch
new file mode 100644
index 000000000..a21b21983
--- /dev/null
+++ b/gnu/packages/patches/ocaml-piqilib-fix-makefile.patch
@@ -0,0 +1,47 @@
+From 336e69d6882a1b8d725c43f1c2e340ef4464bac5 Mon Sep 17 00:00:00 2001
+From: Julien Lepiller <[email-masked]>
+Date: Sat, 31 Dec 2016 11:21:14 +0100
+Subject: [PATCH] fix OCAMLPATH in makefile
+
+---
+ Makefile            | 2 +-
+ make/Makefile.ocaml | 3 ++-
+ 2 files changed, 3 insertions(+), 2 deletions(-)
+
+diff --git a/Makefile b/Makefile
+index 4db87da..9315887 100644
+--- a/Makefile
++++ b/Makefile
+@@ -23,7 +23,7 @@ OCAMLFIND_DESTDIR := $(shell cygpath -w $(OCAMLFIND_DESTDIR))
+ endif
+ export OCAMLFIND_DESTDIR
+
+-OCAMLPATH := $(PIQI_ROOT)/deps
++OCAMLPATH := $(OCAMLPATH):$(PIQI_ROOT)/deps
+ ifeq ($(SYSTEM),$(filter $(SYSTEM),mingw mingw64))
+ OCAMLPATH := $(shell cygpath -w $(OCAMLPATH))
+ endif
+diff --git a/make/Makefile.ocaml b/make/Makefile.ocaml
+index 2b6324d..b82c041 100644
+--- a/make/Makefile.ocaml
++++ b/make/Makefile.ocaml
+@@ -1,7 +1,7 @@
+ OCAMLMAKEFILE := $(PIQI_ROOT)/make/OCamlMakefile
+
+
+-OCAMLPATH := $(PIQI_BUILD)/lib/ocaml
++OCAMLPATH := $(OCAMLPATH):$(PIQI_BUILD)/lib/ocaml
+ ifeq ($(SYSTEM),$(filter $(SYSTEM),mingw mingw64))
+ OCAMLPATH := $(shell cygpath -w $(OCAMLPATH))
+ endif
+@@ -23,6 +23,7 @@ post_target::
+
+
+ .ml.mli: $(EXTRADEPS)
++			echo $(OCAMLPATH)
+ 			$(QUIET)pp=`sed -n -e '/^#/d' -e 's/(\*pp \([^*]*\) \*)/\1/p;q' $<`; \
+ 			if [ -z "$$pp" ]; then \
+ 			  $(ECHO) $(REAL_OCAMLFIND) $(INTF_OCAMLC) $(OCAML_FIND_PACKAGES) \
+--
+2.11.0
+
-- 
2.14.1

>From c0a16c103b6fd2336183e6e3677af5ba61bcbf64 Mon Sep 17 00:00:00 2001
From: Julien Lepiller <[email-masked]>
Date: Thu, 21 Sep 2017 20:45:47 +0200
Subject: [PATCH 06/10] gnu: Add ocaml-uuidm.

* gnu/packages/ocaml.scm (ocaml-uuidm): New variable.
---
 gnu/packages/ocaml.scm | 30 ++++++++++++++++++++++++++++++
 1 file changed, 30 insertions(+)

diff --git a/gnu/packages/ocaml.scm b/gnu/packages/ocaml.scm
index 00665959a..d8b43a2bc 100644
--- a/gnu/packages/ocaml.scm
+++ b/gnu/packages/ocaml.scm
@@ -3356,6 +3356,36 @@ cpp-like directives.")
 tool and piqi-ocaml.")
     (license license:asl2.0)))
 
+(define-public ocaml-uuidm
+  (package
+    (name "ocaml-uuidm")
+    (version "0.9.6")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "http://erratique.ch/software/uuidm/"
+                                  "releases/uuidm-" version ".tbz"))
+              (sha256
+               (base32
+                "0hz4fdx0x16k0pw9995vkz5d1hmzz6b16wck9li399rcbfnv5jlc"))))
+    (build-system ocaml-build-system)
+    (arguments
+     `(#:build-flags
+       (list "build" "--tests" "true" "--with-cmdliner" "true")
+       #:phases
+       (modify-phases %standard-phases
+         (delete 'configure))))
+    (native-inputs
+     `(("opam" ,opam)))
+    (propagated-inputs
+     `(("cmdliner" ,ocaml-cmdliner)
+       ("topkg" ,ocaml-topkg)))
+    (home-page "http://erratique.ch/software/uuidm")
+    (synopsis "Universally unique identifiers for OCaml")
+    (description "Uuidm is an OCaml module implementing 128 bits universally
+unique identifiers (UUIDs) version 3, 5 (named based with MD5, SHA-1 hashing)
+and 4 (random based) according to RFC 4122.")
+    (license license:isc)))
+
 (define-public coq-flocq
   (package
     (name "coq-flocq")
-- 
2.14.1

>From 11841bf1700fada87a4a747130543ce8de4930f5 Mon Sep 17 00:00:00 2001
From: Julien Lepiller <[email-masked]>
Date: Thu, 21 Sep 2017 20:46:37 +0200
Subject: [PATCH 07/10] gnu: Add ocaml-graph.

* gnu/packages/ocaml.scm (ocaml-graph): New variable.
---
 gnu/packages/ocaml.scm                             | 27 +++++++++++++++++
 .../ocaml-graph-honor-source-date-epoch.patch      | 34 ++++++++++++++++++++++
 2 files changed, 61 insertions(+)
 create mode 100644 gnu/packages/patches/ocaml-graph-honor-source-date-epoch.patch

diff --git a/gnu/packages/ocaml.scm b/gnu/packages/ocaml.scm
index d8b43a2bc..1d4c95730 100644
--- a/gnu/packages/ocaml.scm
+++ b/gnu/packages/ocaml.scm
@@ -3386,6 +3386,33 @@ unique identifiers (UUIDs) version 3, 5 (named based with MD5, SHA-1 hashing)
 and 4 (random based) according to RFC 4122.")
     (license license:isc)))
 
+(define-public ocaml-graph
+  (package
+    (name "ocaml-graph")
+    (version "1.8.7")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "http://ocamlgraph.lri.fr/download/"
+                                  "ocamlgraph-" version ".tar.gz"))
+              (sha256
+               (base32
+                "1845r537swjil2fcj7lgbibc2zybfwqqasrd2s7bncajs83cl1nz"))
+              (patches (search-patches "ocaml-graph-honor-source-date-epoch.patch"))))
+    (build-system ocaml-build-system)
+    (arguments
+     `(#:install-target "install-findlib"
+       #:phases
+       (modify-phases %standard-phases
+         (add-before 'configure 'set-shell
+           (lambda* (#:key inputs #:allow-other-keys)
+             (setenv "CONFIG_SHELL" (string-append (assoc-ref inputs "bash")
+                                                   "/bin/sh")))))))
+    (inputs `(("lablgtk" ,lablgtk)))
+    (home-page "http://ocamlgraph.lri.fr/")
+    (synopsis "Graph library for OCaml")
+    (description "OCamlgraph is a generic graph library for OCaml.")
+    (license license:lgpl2.1)))
+
 (define-public coq-flocq
   (package
     (name "coq-flocq")
diff --git a/gnu/packages/patches/ocaml-graph-honor-source-date-epoch.patch b/gnu/packages/patches/ocaml-graph-honor-source-date-epoch.patch
new file mode 100644
index 000000000..9f8713e3d
--- /dev/null
+++ b/gnu/packages/patches/ocaml-graph-honor-source-date-epoch.patch
@@ -0,0 +1,34 @@
+From 354ef78aac0b887fae3c10b28eb2b0d83f66bdfe Mon Sep 17 00:00:00 2001
+From: Julien Lepiller <[email-masked]>
+Date: Mon, 2 Jan 2017 17:05:24 +0100
+Subject: [PATCH] Honor SOURCE_DATE_EPOCH
+
+---
+ Makefile.in | 7 ++++++-
+ 1 file changed, 6 insertions(+), 1 deletion(-)
+
+diff --git a/Makefile.in b/Makefile.in
+index a32b4b8..ef4c174 100644
+--- a/Makefile.in
++++ b/Makefile.in
+@@ -113,11 +113,16 @@ graph.cmx: $(CMI) $(CMX)
+	$(OCAMLOPT) $(INCLUDES) -pack -o $@ $^
+ 
+ VERSION=1.8.7
++ifdef SOURCE_DATE_EPOCH
++BUILD_DATE=$(shell date -u -d "@$(SOURCE_DATE_EPOCH)" 2>/dev/null || date -u -r "$(SOURCE_DATE_EPOCH)" 2>/dev/null || date)
++else
++BUILD_DATE=$(shell date)
++endif
+ 
+ src/version.ml: Makefile
+	rm -f $@
+	echo "let version = \""$(VERSION)"\"" > $@
+-	echo "let date = \""`date`"\"" >> $@
++	echo "let date = \""$(BUILD_DATE)"\"" >> $@
+ 
+ # gtk2 graph editor
+ ###################
+-- 
+2.11.0
+
-- 
2.14.1

>From 28c4c8ce2d5f8b0975b96a578ebbd05002db7774 Mon Sep 17 00:00:00 2001
From: Julien Lepiller <[email-masked]>
Date: Thu, 21 Sep 2017 20:47:40 +0200
Subject: [PATCH 08/10] gnu: Add ocaml-piqi.

* gnu/packages/ocaml.scm (ocaml-piqi): New variable.
---
 gnu/packages/ocaml.scm | 33 +++++++++++++++++++++++++++++++++
 1 file changed, 33 insertions(+)

diff --git a/gnu/packages/ocaml.scm b/gnu/packages/ocaml.scm
index 1d4c95730..27ec8354b 100644
--- a/gnu/packages/ocaml.scm
+++ b/gnu/packages/ocaml.scm
@@ -47,6 +47,7 @@
   #:use-module (gnu packages pcre)
   #:use-module (gnu packages perl)
   #:use-module (gnu packages pkg-config)
+  #:use-module (gnu packages protobuf)
   #:use-module (gnu packages python)
   #:use-module (gnu packages tex)
   #:use-module (gnu packages texinfo)
@@ -3413,6 +3414,38 @@ and 4 (random based) according to RFC 4122.")
     (description "OCamlgraph is a generic graph library for OCaml.")
     (license license:lgpl2.1)))
 
+(define-public ocaml-piqi
+  (package
+    (name "ocaml-piqi")
+    (version "0.7.5")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "https://github.com/alavrik/piqi-ocaml/"
+                                  "archive/v" version ".tar.gz"))
+              (sha256
+               (base32
+                "0ngz6y8i98i5v2ma8nk6mc83pdsmf2z0ks7m3xi6clfg3zqbddrv"))))
+    (build-system ocaml-build-system)
+    (arguments
+     `(#:make-flags
+       (list (string-append "DESTDIR=" (assoc-ref %outputs "out"))
+             (string-append "SHELL=" (assoc-ref %build-inputs "bash")
+                            "/bin/sh"))
+       #:phases
+       (modify-phases %standard-phases
+         (delete 'configure))))
+    (native-inputs
+     `(("which" ,which)
+       ("protobuf" ,protobuf))) ; for tests
+    (propagated-inputs
+     `(("piqilib" ,ocaml-piqilib)))
+    (home-page "https://github.com/alavrik/piqi-ocaml")
+    (synopsis "Protocol serialization system for OCaml")
+    (description "Piqi is a multi-format data serialization system for OCaml.
+It provides a uniform interface for serializing OCaml data structures to JSON,
+XML and Protocol Buffers formats.")
+    (license license:asl2.0)))
+
 (define-public coq-flocq
   (package
     (name "coq-flocq")
-- 
2.14.1

>From 9859961c3ab90b8bc5d94689c9bb6e0f657f88c4 Mon Sep 17 00:00:00 2001
From: Julien Lepiller <[email-masked]>
Date: Thu, 21 Sep 2017 20:49:29 +0200
Subject: [PATCH 09/10] gnu: Add bap.

* gnu/packages/ocaml.scm (bap): New variable.
---
 gnu/packages/ocaml.scm | 69 ++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 69 insertions(+)

diff --git a/gnu/packages/ocaml.scm b/gnu/packages/ocaml.scm
index 27ec8354b..61ebbd937 100644
--- a/gnu/packages/ocaml.scm
+++ b/gnu/packages/ocaml.scm
@@ -41,6 +41,7 @@
   #:use-module (gnu packages gnome)
   #:use-module (gnu packages gtk)
   #:use-module (gnu packages libevent)
+  #:use-module (gnu packages llvm)
   #:use-module (gnu packages m4)
   #:use-module (gnu packages multiprecision)
   #:use-module (gnu packages ncurses)
@@ -3446,6 +3447,74 @@ It provides a uniform interface for serializing OCaml data structures to JSON,
 XML and Protocol Buffers formats.")
     (license license:asl2.0)))
 
+(define-public bap
+  (package
+    (name "bap")
+    (version "1.1.0")
+    (home-page "https://github.com/BinaryAnalysisPlatform/bap")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append home-page "/archive/v" version ".tar.gz"))
+              (sha256
+               (base32
+                "1ms95m4j1qrmy7zqmsn2izh7gq68lnmssl7chyhk977kd3sxj66m"))
+              (file-name (string-append name "-" version ".tar.gz"))))
+   (build-system ocaml-build-system)
+   (native-inputs
+    `(("oasis" ,ocaml-oasis)
+      ("clang" ,clang)
+      ("ounit" ,ocaml-ounit)))
+   (propagated-inputs
+    `(("core-kernel" ,ocaml-core-kernel)
+      ("ppx-driver" ,ocaml-ppx-driver)
+      ("uri" ,ocaml-uri)
+      ("llvm" ,llvm)
+      ("gmp" ,gmp)
+      ("clang-runtime" ,clang-runtime)
+      ("fileutils" ,ocaml-fileutils)
+      ("cmdliner" ,ocaml-cmdliner)
+      ("zarith" ,ocaml-zarith)
+      ("uuidm" ,ocaml-uuidm)
+      ("camlzip" ,camlzip)
+      ("frontc" ,ocaml-frontc)
+      ("ezjsonm" ,ocaml-ezjsonm)
+      ("ocurl" ,ocaml-ocurl)
+      ("piqi" ,ocaml-piqi)
+      ("ocamlgraph" ,ocaml-graph)
+      ("bitstring" ,ocaml-bitstring)
+      ("ppx-jane" ,ocaml-ppx-jane)
+      ("re" ,ocaml-re)))
+   (inputs `(("llvm" ,llvm)))
+   (arguments
+    `(#:use-make? #t
+      #:phases
+      (modify-phases %standard-phases
+        (replace 'configure
+          (lambda* (#:key outputs #:allow-other-keys)
+            (zero? (system* "./configure" "--prefix"
+                            (assoc-ref outputs "out")
+                            "--libdir"
+                            (string-append
+                              (assoc-ref outputs "out")
+                              "/lib/ocaml/site-lib")
+                            "--with-llvm-version=3.8"
+                            "--with-llvm-config=llvm-config"
+                            "--enable-everything"))))
+        (add-after 'install 'link-stubs
+          (lambda* (#:key outputs #:allow-other-keys)
+            (let* ((out (assoc-ref outputs "out"))
+                   (stubs (string-append out "/lib/ocaml/site-lib/stubslibs"))
+                   (lib (string-append out "/lib/ocaml/site-lib/bap-plugin-llvm")))
+              (mkdir-p stubs)
+              (symlink (string-append lib "/dllllvm_plugin_stubs.so")
+                       (string-append stubs "/dllllvm_plugin_stubs.so"))))))))
+   (synopsis "Binary Analysis Platform")
+   (description "Binary Analysis Platform is a framework for writing program
+analysis tools, that target binary files.  The framework consists of a plethora
+of libraries, plugins, and frontends.  The libraries provide code reusability,
+the plugins facilitate extensibility, and the frontends serve as entry points.")
+   (license license:expat)))
+
 (define-public coq-flocq
   (package
     (name "coq-flocq")
-- 
2.14.1

>From 0a638c17bda12cc16def3c94946f9a065e014949 Mon Sep 17 00:00:00 2001
From: Julien Lepiller <[email-masked]>
Date: Thu, 21 Sep 2017 20:51:14 +0200
Subject: [PATCH 10/10] gnu: Add ocaml-camomile.

* gnu/packages/ocaml.scm (ocaml-camomile): New variable.
---
 gnu/packages/ocaml.scm | 28 ++++++++++++++++++++++++++++
 1 file changed, 28 insertions(+)

diff --git a/gnu/packages/ocaml.scm b/gnu/packages/ocaml.scm
index 61ebbd937..61cad7c48 100644
--- a/gnu/packages/ocaml.scm
+++ b/gnu/packages/ocaml.scm
@@ -3515,6 +3515,34 @@ of libraries, plugins, and frontends.  The libraries provide code reusability,
 the plugins facilitate extensibility, and the frontends serve as entry points.")
    (license license:expat)))
 
+(define-public ocaml-camomile
+  (package
+    (name "ocaml-camomile")
+    (version "0.8.5")
+    (home-page "https://github.com/yoriyuki/Camomile")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append home-page "/releases/download/rel-" version
+                                  "/camomile-" version ".tar.bz2"))
+              (sha256
+               (base32
+                "003ikpvpaliy5hblhckfmln34zqz0mk3y2m1fqvbjngh3h2np045"))))
+    (build-system ocaml-build-system)
+    (native-inputs `(("camlp4" ,camlp4)))
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         (add-before 'configure 'fix-bin/sh
+           (lambda _
+             (setenv "CONFIG_SHELL" (which "bash")))))))
+    (synopsis "Comprehensive Unicode library")
+    (description "Camomile is a Unicode library for OCaml.  Camomile provides
+Unicode character type, UTF-8, UTF-16, UTF-32 strings, conversion to/from about
+200 encodings, collation and locale-sensitive case mappings, and more.  The
+library is currently designed for Unicode Standard 3.2.")
+    ;; with an exception for linked libraries to use a different license
+    (license license:lgpl2.0+)))
+
 (define-public coq-flocq
   (package
     (name "coq-flocq")
-- 
2.14.1