Subject: [bug#64448] [PATCH 1/2] gnu: hdf5-1.8: Remove generated files from source

From: David Elsing <[email-masked]>
Date: Mon, 3 Jul 2023 22:00:46 +0000

* gnu/packages/maths.scm (hdf5-snippet): New variable.
(hdf5-1.8.21-source): New variable.
(hdf5-1.8)[source](modules, snippet): New fields.
[native-inputs]: Add autoconf, automake, bison, flex, libtool and which.
[arguments] Use Gexps.
<#:phases>: Add 'copy-scripts, 'make-gen-deterministic, 'generate-flexbison
and 'generate-headers phases.
(hdf5-1.10)[source](modules, snippet): New fields.
[arguments]<#:phases>: Use 'substitute-keyword-arguments' and delete
'copy-scripts phase.
(hdf5-1.12): Inherit from hdf5-1.10.
[source](modules, snippet): New fields.
(hdf5-1.14): Inherit from hdf5-1.10.
[source](modules, snippet): New fields.
* gnu/packages/patches/hdf5-config-date.patch: Apply to configure.ac instead
of configure.
---
 gnu/packages/maths.scm                      | 221 +++++++++++++++-----
 gnu/packages/patches/hdf5-config-date.patch |  14 +-
 2 files changed, 176 insertions(+), 59 deletions(-)

diff --git a/gnu/packages/maths.scm b/gnu/packages/maths.scm
index 653e76027a..b2029db615 100644
--- a/gnu/packages/maths.scm
+++ b/gnu/packages/maths.scm
@@ -60,6 +60,7 @@
 ;;; Copyright © 2022 Akira Kyle <[email-masked]>
 ;;; Copyright © 2022 Roman Scherer <[email-masked]>
 ;;; Copyright © 2023 Jake Leporte <[email-masked]>
+;;; Copyright © 2023 David Elsing <[email-masked]>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -1376,12 +1377,48 @@ (define-public hdf4-alt
     (synopsis
      "HDF4 without netCDF API, can be combined with the regular netCDF library")))
 
-(define-public hdf5-1.8
-  (package
-    (name "hdf5")
-    (version "1.8.23")
-    (source
-     (origin
+(define hdf5-snippet
+  #~(begin
+      (for-each delete-file (find-files "." "Makefile\\.in$"))
+      (when (file-exists? "autom4te.cache")
+        (delete-file-recursively "autom4te.cache"))
+      (for-each (lambda (file)
+                  (when (file-exists? file)
+                    (delete-file file)))
+                (list
+                 "configure"
+                 "bin/ltmain.sh"
+                 "bin/compile"
+                 "bin/config.guess"
+                 "bin/config.sub"
+                 "bin/install-sh"
+                 "bin/missing"
+                 "bin/test-driver"
+                 "bin/depcomp"
+                 "src/H5config.h.in"
+                 "src/H5Epubgen.h"
+                 "src/H5Einit.h"
+                 "src/H5Eterm.h"
+                 "src/H5Edefin.h"
+                 "src/H5version.h"
+                 "src/H5overflow.h"
+                 "aclocal.m4"
+                 "hl/tools/gif2h5/testfiles/ex_image2.h5"
+                 "hl/tools/gif2h5/testfiles/5giftst.h5"
+                 "hl/src/H5LTparse.h"
+                 "hl/src/H5LTparse.c"
+                 "hl/src/H5LTanalyze.c"
+                 ;; In later releases
+                 "m4/libtool.m4"
+                 "m4/ltoptions.m4"
+                 "m4/ltsugar.m4"
+                 "m4/ltversion.m4"
+                 "m4/lt~obsolete.m4"))))
+
+;; In the 1.8.22 and 1.8.23 release, some m4 scripts are missing
+(define hdf5-1.8.21-source
+  (let ((version "1.8.21"))
+    (origin
       (method url-fetch)
       (uri (list (string-append "https://support.hdfgroup.org/ftp/HDF5/releases/"
                                 "hdf5-" (version-major+minor version)
@@ -1394,18 +1431,53 @@ (define-public hdf5-1.8
                                    (string-append major minor)))
                                 "/src/hdf5-" version ".tar.bz2")))
       (sha256
-       (base32 "0km65mr6dgk4ia2dqr1b9dzw9qg15j5z35ymbys9cnny51z1zb39"))
-      (patches (search-patches "hdf5-config-date.patch"))))
+       (base32 "03glk4w4wyb1jyb443g53y3y1ncnf6mj2cqwm6avfr2awkgb3cg5"))
+      (modules '((guix build utils)))
+      (snippet hdf5-snippet)
+      (patches (search-patches "hdf5-config-date.patch")))))
+
+(define-public hdf5-1.8
+  (package
+    (name "hdf5")
+    (version "1.8.23")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (list (string-append "https://support.hdfgroup.org/ftp/HDF5/releases/"
+                                 "hdf5-" (version-major+minor version)
+                                 "/hdf5-" version "/src/hdf5-"
+                                 version ".tar.bz2")
+                  (string-append "https://support.hdfgroup.org/ftp/HDF5/"
+                                 "current"
+                                 (match (string-split version #\.)
+                                   ((major minor _ ...)
+                                    (string-append major minor)))
+                                 "/src/hdf5-" version ".tar.bz2")))
+       (sha256
+        (base32 "0km65mr6dgk4ia2dqr1b9dzw9qg15j5z35ymbys9cnny51z1zb39"))
+       (modules '((guix build utils)))
+       (snippet hdf5-snippet)
+       (patches (search-patches "hdf5-config-date.patch"))))
     (build-system gnu-build-system)
     (inputs
      (list zlib))
     (native-inputs
-     (list gfortran perl))                 ;part of the test machinery needs Perl
+     (list autoconf
+           automake
+           bison
+           flex
+           gfortran
+           libtool
+           ;; Needed to generate some headers and for tests
+           perl
+           which))
     (outputs '("out"       ; core library
                "fortran")) ; fortran interface
     (arguments
-     `(;; Some of the users, notably Flann, need the C++ interface.
-       #:configure-flags '("--enable-cxx"
+     (list
+      ;; Some of the users, notably Flann, need the C++ interface.
+      #:configure-flags #~(list
+                           "--enable-cxx"
                            "--enable-fortran"
                            "--enable-fortran2003"
 
@@ -1418,44 +1490,71 @@ (define-public hdf5-1.8
                            "--enable-threadsafe"
                            "--with-pthread"
                            "--enable-unsupported")
-       ;; Use -fPIC to allow the R bindings to link with the static libraries
-       #:make-flags (list "CFLAGS=-fPIC"
-                          "CXXFLAGS=-fPIC")
-       #:phases
-       (modify-phases %standard-phases
-         (add-before 'configure 'patch-configure
-           (lambda* (#:key outputs #:allow-other-keys)
-             (substitute* "configure"
-               (("/bin/mv") "mv"))
-             (substitute* "fortran/src/Makefile.in"
-               (("libhdf5_fortran_la_LDFLAGS =")
-                (string-append "libhdf5_fortran_la_LDFLAGS = -Wl,-rpath="
-                               (assoc-ref outputs "fortran") "/lib")))
-             (substitute* "hl/fortran/src/Makefile.in"
-               (("libhdf5hl_fortran_la_LDFLAGS =")
-                (string-append "libhdf5hl_fortran_la_LDFLAGS = -Wl,-rpath="
-                               (assoc-ref outputs "fortran") "/lib")))))
-         (add-after 'configure 'patch-settings
-           (lambda _
-             ;; libhdf5.settings contains the full path of the
-             ;; compilers used, and its contents are included in
-             ;; libhdf5.so.  We truncate the hashes to avoid
-             ;; unnecessary store references to those compilers:
-             (substitute* "src/libhdf5.settings"
-              (("(/gnu/store/)([a-zA-Z0-9]*)" all prefix hash)
-               (string-append prefix (string-take hash 10) "..."))
-              ;; Don't record the build-time kernel version to make the
-              ;; settings file reproducible.
-              (("Uname information:.*")
-               "Uname information: Linux\n"))))
-         (add-after 'install 'patch-references
-           (lambda* (#:key inputs outputs #:allow-other-keys)
-             (let ((bin (string-append (assoc-ref outputs "out") "/bin"))
-                   (zlib (assoc-ref inputs "zlib")))
-               (substitute* (find-files bin "h5p?cc")
-                 (("-lz" lib)
-                  (string-append "-L" zlib "/lib " lib))))))
-         (add-after 'install 'split
+      ;; Use -fPIC to allow the R bindings to link with the static libraries
+      #:make-flags #~(list "CFLAGS=-fPIC"
+                           "CXXFLAGS=-fPIC")
+      #:phases
+      #~(modify-phases %standard-phases
+          ;; These scripts are missing in this release
+          (add-after 'unpack 'copy-scripts
+            (lambda _
+              (invoke "tar" "-xf" #$hdf5-1.8.21-source
+                      "-C" "m4" "--strip-components=2"
+                      "hdf5-1.8.21/m4/aclocal_fc.m4"
+                      "hdf5-1.8.21/m4/aclocal_cxx.m4")
+              (invoke "tar" "-xf" #$(package-source hdf5-1.10)
+                      "-C" "bin" "--strip-components=2"
+                      "hdf5-1.10.9/bin/genparser")))
+          (add-after 'copy-scripts 'make-gen-deterministic
+            (lambda _
+              (substitute* "bin/make_err"
+                (("keys %major" all)
+                 (string-append "sort " all))
+                (("while.*each \\(%section\\).*")
+                 (string-append
+                  "foreach $sect_name (sort keys %section) {\n"
+                  "        $sect_desc = $section{$sect_name};\n")))))
+          (add-after 'copy-scripts 'generate-flexbison
+            (lambda _
+              (invoke "bash" "bin/genparser" "hl/src")))
+          (add-before 'configure 'patch-configure
+            (lambda* (#:key outputs #:allow-other-keys)
+              (substitute* "configure"
+                (("/bin/mv") "mv"))
+              (substitute* "fortran/src/Makefile.in"
+                (("libhdf5_fortran_la_LDFLAGS =")
+                 (string-append "libhdf5_fortran_la_LDFLAGS = -Wl,-rpath="
+                                (assoc-ref outputs "fortran") "/lib")))
+              (substitute* "hl/fortran/src/Makefile.in"
+                (("libhdf5hl_fortran_la_LDFLAGS =")
+                 (string-append "libhdf5hl_fortran_la_LDFLAGS = -Wl,-rpath="
+                                (assoc-ref outputs "fortran") "/lib")))))
+          (add-after 'configure 'patch-settings
+            (lambda _
+              ;; libhdf5.settings contains the full path of the
+              ;; compilers used, and its contents are included in
+              ;; libhdf5.so.  We truncate the hashes to avoid
+              ;; unnecessary store references to those compilers:
+              (substitute* "src/libhdf5.settings"
+                (("(/gnu/store/)([a-zA-Z0-9]*)" all prefix hash)
+                 (string-append prefix (string-take hash 10) "..."))
+                ;; Don't record the build-time kernel version to make the
+                ;; settings file reproducible.
+                (("Uname information:.*")
+                 "Uname information: Linux\n"))))
+          (add-after 'configure 'generate-headers
+            (lambda _
+              (invoke "perl" "bin/make_err" "src/H5err.txt")
+              (invoke "perl" "bin/make_vers" "src/H5vers.txt")
+              (invoke "perl" "bin/make_overflow" "src/H5overflow.txt")))
+          (add-after 'install 'patch-references
+            (lambda* (#:key inputs outputs #:allow-other-keys)
+              (let ((bin (string-append (assoc-ref outputs "out") "/bin"))
+                    (zlib (assoc-ref inputs "zlib")))
+                (substitute* (find-files bin "h5p?cc")
+                  (("-lz" lib)
+                   (string-append "-L" zlib "/lib " lib))))))
+          (add-after 'install 'split
             (lambda* (#:key inputs outputs #:allow-other-keys)
               ;; Move all fortran-related files
               (let* ((out (assoc-ref outputs "out"))
@@ -1515,11 +1614,25 @@ (define-public hdf5-1.10
                                  "/src/hdf5-" version ".tar.bz2")))
        (sha256
         (base32 "14gih7kmjx4h3lc7pg4fwcl28hf1qqkf2x7rljpxqvzkjrqbxi00"))
-       (patches (search-patches "hdf5-config-date.patch"))))))
+       (modules '((guix build utils)))
+       (snippet hdf5-snippet)
+       (patches (search-patches "hdf5-config-date.patch"))))
+    (arguments
+     (substitute-keyword-arguments (package-arguments hdf5-1.8)
+       ((#:phases phases)
+        #~(modify-phases #$phases
+            (delete 'copy-scripts)
+            (add-after 'unpack 'patch-trace-shebang
+              (lambda _
+                (for-each
+                 patch-shebang
+                 (find-files "bin"
+                             (lambda (file stat)
+                               (executable-file? file))))))))))))
 
 (define-public hdf5-1.12
   (package
-    (inherit hdf5-1.8)
+    (inherit hdf5-1.10)
     (version "1.12.2")
     (source
      (origin
@@ -1535,11 +1648,13 @@ (define-public hdf5-1.12
                                  "/src/hdf5-" version ".tar.bz2")))
        (sha256
         (base32 "1zlawdzb0gsvcxif14fwr5ap2gk4b6j02wirr2hcx8hkcbivp20s"))
+       (modules '((guix build utils)))
+       (snippet hdf5-snippet)
        (patches (search-patches "hdf5-config-date.patch"))))))
 
 (define-public hdf5-1.14
   (package
-    (inherit hdf5-1.8)
+    (inherit hdf5-1.10)
     (version "1.14.0")
     (source
      (origin
@@ -1555,6 +1670,8 @@ (define-public hdf5-1.14
                                  "/src/hdf5-" version ".tar.bz2")))
        (sha256
         (base32 "181bdh8hp7v9xqwcby3lknr92lxlicc2hqscba3f5nhf8lrr9rz4"))
+       (modules '((guix build utils)))
+       (snippet hdf5-snippet)
        (patches (search-patches "hdf5-config-date.patch"))))))
 
 (define-public hdf5
diff --git a/gnu/packages/patches/hdf5-config-date.patch b/gnu/packages/patches/hdf5-config-date.patch
index c105435dc2..d9710f91e9 100644
--- a/gnu/packages/patches/hdf5-config-date.patch
+++ b/gnu/packages/patches/hdf5-config-date.patch
@@ -1,14 +1,14 @@
 Honor SOURCE_DATE_EPOCH when exporting configuration date.
 Autoconf-level patch submitted upstream on Wed Apr 13 17:03:23 UTC 2016
 
---- a/configure
-+++ b/configure
-@@ -27737,7 +28573,14 @@
- 
+--- a/configure.ac
++++ b/configure.ac
+@@ -3566,7 +3566,14 @@
+ AC_SUBST([H5_VERSION])
  
  ## Configuration date
-- CONFIG_DATE="`date`"
-+ CONFIG_DATE="`date -u`"
+-AC_SUBST([CONFIG_DATE]) CONFIG_DATE="`date`"
++AC_SUBST([CONFIG_DATE]) CONFIG_DATE="`date -u`"
 +if test -n "$SOURCE_DATE_EPOCH"; then
 +  CONFIG_DATE=`date -u -d "@$SOURCE_DATE_EPOCH" 2>/dev/null \
 +               || date -u -r "$SOURCE_DATE_EPOCH" 2>/dev/null`
@@ -18,4 +18,4 @@ Autoconf-level patch submitted upstream on Wed Apr 13 17:03:23 UTC 2016
 +fi
  
  ## User doing the configuration
-  CONFIG_USER="`whoami`@`hostname`"
+ AC_SUBST([CONFIG_USER]) CONFIG_USER="`whoami`@`hostname`"
\ No newline at end of file
-- 
2.40.1