Subject: Re: [bug#66201] [PATCH 1/2] gnu: scilab: Update to 2023.1.0.

From: Efraim Flashner <[email-masked]>
Date: Wed, 4 Oct 2023 18:00:34 +0300

Thanks. Patch pushed, with a couple of comments below:

On Mon, Sep 25, 2023 at 09:13:12PM +0000, David Elsing wrote:
> * gnu/packages/maths.scm (scilab): Update to 2023.1.0.
> [source] Use git-fetch.
> <modules>: Add (guix build utils) and (ice-9 ftw).
> <patches>: Add patch for hdf5 >= 1.10.
> <snippet>: Move contents of the "scilab" directory to its parents. Remove
> the other files and autogenerated files.
> [native-inputs]: Add autoconf, autoconf-archive, automake, bison, eigen, flex,
> libtool, ocaml and ocaml-findlib.
> [inputs]: Add ocaml-num, replace hdf5-1.8 by hdf5-1.14 and suitesparse-3 by
> suitesparse.
> [arguments]: Remove quasiquote. Add --enable-build-parser,
> --with-eigen-include=..., OCAMLC=... and OCAMLOPT=... to #:configure-flags.
> <#:phases>: Add fix-ocaml-num, remove-desktop-files,
> bootstrap-dynamic_link-scripts and build-parsers phases. Remove fixes for
> compilation and linker errors from the pre-build phase.
> [home-page]: Update URL.
> [description]: Add two spaces between sentences.
> [license]: Update to gpl2 and bsd-3.
> ---
>  gnu/packages/maths.scm                        | 256 +++++++++++-------
>  .../patches/scilab-hdf5-1.8-api.patch         |  71 +++++
>  2 files changed, 236 insertions(+), 91 deletions(-)
>  create mode 100644 gnu/packages/patches/scilab-hdf5-1.8-api.patch
> 
> diff --git a/gnu/packages/maths.scm b/gnu/packages/maths.scm
> index 62d4adfbd1..ff50a99599 100644
> --- a/gnu/packages/maths.scm
> +++ b/gnu/packages/maths.scm
> @@ -61,6 +61,7 @@
>  ;;; Copyright © 2022 Roman Scherer <[email-masked]>
>  ;;; Copyright © 2023 Jake Leporte <[email-masked]>
>  ;;; Copyright © 2023 Camilo Q.S. (Distopico) <[email-masked]>
> +;;; Copyright © 2023 David Elsing <[email-masked]>
>  ;;;
>  ;;; This file is part of GNU Guix.
>  ;;;
> @@ -8422,112 +8423,185 @@ (define-public optizelle
>  (define-public scilab
>    (package
>      (name "scilab")
> -    (version "5.5.2")
> +    (version "2023.1.0")
>      (source
>       (origin
> -       (method url-fetch)
> -       (uri
> -        (string-append "https://www.scilab.org/download/"
> -                       version "/scilab-" version "-src.tar.gz"))
> +       (method git-fetch)
> +       (uri (git-reference
> +             (url "https://gitlab.com/scilab/scilab")
> +             (commit version)))
> +       (file-name (git-file-name name version))
>         (sha256
> -        (base32 "0phg9pn24yw98hbh475ik84dnikf1225b2knh7qbhdbdx6fm2d57"))))
> +        (base32
> +         "0hbqsnc67b4f8zc690kl79bwhjaasykjlmqbln8iymnjcn3l5ypd"))
> +       (modules '((guix build utils)
> +                  (ice-9 ftw)))
> +       (patches (search-patches "scilab-hdf5-1.8-api.patch"))
> +       (snippet

Wow, that is a big snippet. I added some comments and grouped up some
repetitive commands with a for-each.

> +        #~(begin
> +            (for-each
> +             (lambda (file)
> +               (unless (member file '("." ".." "scilab"))
> +                 (delete-file-recursively file)))
> +             (scandir "."))
> +            (for-each
> +             (lambda (file)
> +               (unless (member file '("." ".."))
> +                 (rename-file (string-append "scilab/" file) file)))
> +             (scandir "scilab"))
> +            (delete-file-recursively "scilab")
> +            (delete-file "aclocal.m4")
> +            (for-each
> +             delete-file
> +             (find-files "." "^Makefile\\.in$"))
> +            (delete-file-recursively "config")
> +            (delete-file "configure")
> +            (delete-file-recursively "libs/GetWindowsVersion")
> +            (delete-file "m4/ax_cxx_compile_stdcxx.m4")
> +            (delete-file "m4/lib-ld.m4")
> +            (delete-file "m4/libtool.m4")
> +            (delete-file "m4/ltoptions.m4")
> +            (delete-file "m4/ltsugar.m4")
> +            (delete-file "m4/ltversion.m4")
> +            (delete-file "m4/lt~obsolete.m4")
> +            (delete-file "m4/pkg.m4")
> +            (for-each
> +             (lambda (file)
> +               (delete-file
> +                (string-append "modules/dynamic_link/src/scripts/" file)))
> +             '("aclocal.m4"
> +               "configure"
> +               "compile"
> +               "config.guess"
> +               "config.sub"
> +               "ltmain.sh"
> +               "depcomp"
> +               "install-sh"
> +               "missing"))
> +            (delete-file-recursively "modules/dynamic_link/src/scripts/m4")
> +            (delete-file "modules/ast/src/cpp/parse/scanscilab.cpp")
> +            (delete-file "modules/ast/src/cpp/parse/bison/parsescilab.output")
> +            (delete-file "modules/ast/includes/parse/parsescilab.hxx")
> +            (delete-file "modules/ast/src/cpp/parse/parsescilab.cpp")))))
>      (build-system gnu-build-system)
> -    (native-inputs (list pkg-config gfortran))
> -    (inputs (list libxml2
> -                  `(,pcre "bin")
> +    (native-inputs
> +     (list autoconf
> +           autoconf-archive
> +           automake
> +           bison
> +           eigen
> +           flex
> +           gfortran
> +           libtool
> +           ocaml
> +           ocaml-findlib
> +           pkg-config))
> +    (inputs (list `(,pcre "bin")
>                    `(,pcre "out")
> -                  readline
> -                  hdf5-1.8
> -                  curl
> -                  openblas
> -                  lapack
> +                  libxml2
>                    arpack-ng
> +                  curl
>                    fftw
>                    gettext-minimal
> -                  suitesparse-3
> -                  tcl
> -                  tk
> +                  hdf5-1.14
> +                  lapack
>                    libx11
> -                  matio))
> +                  matio
> +                  ocaml-num
> +                  openblas
> +                  readline
> +                  suitesparse
> +                  tcl
> +                  tk))
>      (arguments
> -     `(#:tests? #f
> -       #:configure-flags
> -       ,#~(list
> -           "--enable-relocatable"
> -           "--disable-static-system-lib"
> -           ;; Disable all java code.
> -           "--without-gui"
> -           "--without-javasci"
> -           "--disable-build-help"
> -           "--with-external-scirenderer"
> -           ;; Tcl and Tk library locations.
> -           (string-append "--with-tcl-include="
> -                          (string-drop-right
> -                           (search-input-file %build-inputs "include/tcl.h")
> -                           (string-length "/tcl.h")))
> -           (string-append "--with-tcl-library="
> -                          (string-drop-right
> -                           (search-input-directory %build-inputs "lib/tcl8")
> -                           (string-length "/tcl8")))
> -           (string-append "--with-tk-include="
> -                          (string-drop-right
> -                           (search-input-file %build-inputs "include/tk.h")
> -                           (string-length "/tk.h")))
> -           (string-append "--with-tk-library="
> -                          (string-drop-right
> -                           (search-input-directory %build-inputs "lib/tk8.6")
> -                           (string-length "/tk8.6")))
> -           ;; There are some 2018-fortran errors that are ignored
> -           ;; with this fortran compiler flag.
> -           "FFLAGS=-fallow-argument-mismatch")
> -       #:phases
> -       ,#~(modify-phases %standard-phases
> -            (add-before 'build 'pre-build
> -              (lambda _
> -                ;; Fix scilab script.
> -                (substitute* "bin/scilab"
> -                  (("\\/bin\\/ls")
> -                   (which "ls")))
> -                ;; Fix core.start.
> -                (substitute* "modules/core/etc/core.start"
> -                  (("'SCI/modules")
> -                   "SCI+'/modules"))
> -                ;; Fix fortran compilation error.
> -                (substitute*
> -                    "modules/differential_equations/src/fortran/twodq.f"
> -                  (("node\\(10\\),node1\\(10\\),node2\\(10\\),coef")
> -                   "node(9),node1(9),node2(9),coef"))
> -                ;; Fix C compilation errors.
> -                ;; remove &
> -                (substitute* "modules/hdf5/src/c/h5_readDataFromFile_v1.c"
> -                  (("(H5Rdereference\\(_iDatasetId, H5R_OBJECT, )&(.*)\\);$"
> -                    all common ref)
> -                   (string-append common ref)))
> -                ;; fix multiple definitions
> -                (substitute* "modules/tclsci/src/c/TCL_Command.h"
> -                  (("^__thread")
> -                   "extern __thread"))
> -                (substitute* "modules/tclsci/src/c/InitTclTk.c"
> -                  (("BOOL TK_Started = FALSE;" all)
> -                   (string-append all "\n"
> -                                  "__threadId TclThread;" "\n"
> -                                  "__threadSignal InterpReady;" "\n"
> -                                  "__threadSignalLock InterpReadyLock;"
> -                                  "\n")))
> -                ;; Fix CPP compilation errors.
> -                (substitute* "modules/output_stream/src/cpp/diary_manager.cpp"
> -                  (("if \\(array_size > 0\\)")
> -                   "if (*array_size > 0)"))
> -                ;; Set SCIHOME to /tmp before macros compilation.
> -                (setenv "SCIHOME" "/tmp"))))))
> -    (home-page "https://scilab.org")
> +     (list
> +      ;; The tests require java code.
> +      #:tests? #f
> +      #:configure-flags
> +      #~(list
> +         "--enable-relocatable"
> +         "--disable-static-system-lib"
> +         "--enable-build-parser"
> +         ;; Disable all java code.
> +         "--without-gui"
> +         "--without-javasci"
> +         "--disable-build-help"
> +         "--with-external-scirenderer"
> +         ;; Tcl and Tk library locations.
> +         (string-append "--with-tcl-include="

Here I've used dirname, so the following 3 lines become:

(dirname
  (search-input-file %build-inputs "include/tcl.h"))

> +                        (string-drop-right
> +                         (search-input-file %build-inputs "include/tcl.h")
> +                         (string-length "/tcl.h")))
> +         (string-append "--with-tcl-library="
> +                        (string-drop-right
> +                         (search-input-directory %build-inputs "lib/tcl8")
> +                         (string-length "/tcl8")))
> +         (string-append "--with-tk-include="
> +                        (string-drop-right
> +                         (search-input-file %build-inputs "include/tk.h")
> +                         (string-length "/tk.h")))
> +         (string-append "--with-tk-library="
> +                        (string-drop-right
> +                         (search-input-directory %build-inputs "lib/tk8.6")
> +                         (string-length "/tk8.6")))
> +         (string-append "--with-eigen-include="

While I was at it I changed this one to also use search-input-directory,
so we can replace eigen if desired (--with-input=eigen=my-eigen) and
still keep the flag working.

> +                        #$(this-package-native-input "eigen")
> +                        "/include/eigen3")
> +         ;; Find and link to the OCaml Num package
> +         "OCAMLC=ocamlfind ocamlc -package num"
> +         "OCAMLOPT=ocamlfind ocamlopt -package num -linkpkg"
> +         ;; There are some 2018-fortran errors that are ignored
> +         ;; with this fortran compiler flag.
> +         "FFLAGS=-fallow-argument-mismatch")
> +      #:phases
> +      #~(modify-phases %standard-phases
> +          ;; The Num library is specified with the OCAMLC and
> +          ;; OCAMLOPT variables above.
> +          (add-after 'unpack 'fix-ocaml-num
> +            (lambda _
> +              (substitute*
> +                  '("modules/scicos/Makefile.modelica.am"
> +                    "modules/scicos/src/translator/makefile.mak"
> +                    "modules/scicos/src/modelica_compiler/makefile.mak")
> +                (("nums\\.cmx?a") ""))))
> +          ;; Install only scilab-cli.desktop
> +          (add-after 'unpack 'remove-desktop-files
> +            (lambda _
> +              (substitute* "desktop/Makefile.am"
> +                (("desktop_DATA =")
> +                 "desktop_DATA = scilab-cli.desktop\nDUMMY ="))))
> +          ;; These generated files are assumed to be present during
> +          ;; the build.
> +          (add-after 'bootstrap 'bootstrap-dynamic_link-scripts
> +            (lambda _
> +              (with-directory-excursion "modules/dynamic_link/src/scripts"

I changed the invoke line to:
((assoc-ref %standard-phases 'bootstrap))

> +                (invoke "autoreconf" "-i"))))
> +          (add-before 'build 'pre-build
> +            (lambda _
> +              ;; Fix scilab script.
> +              (substitute* "bin/scilab"
> +                (("\\/bin\\/ls")
> +                 (which "ls")))

I'm not sure if scilab can be cross-compiled, but we want to use
search-input instead of (which "ls"), so we get the one for the correct
architecture.

> +              ;; Fix core.start.
> +              (substitute* "modules/core/etc/core.start"
> +                (("'SCI/modules")
> +                 "SCI+'/modules"))
> +              ;; Set SCIHOME to /tmp before macros compilation.
> +              (setenv "SCIHOME" "/tmp")))
> +          ;; Prevent race condition
> +          (add-after 'pre-build 'build-parsers
> +            (lambda _
> +              (with-directory-excursion "modules/ast"
> +                (invoke "make" "src/cpp/parse/parsescilab.cpp"
> +                        "src/cpp/parse/scanscilab.cpp")))))))

In order to keep the make-flags (if there are any) this becomes:
(lambda* (#:key (make-flags #~'()) #:allow-other-keys)
  (with-directory-excursion "modules/ast"
    (apply invoke "make"
           "src/cpp/parse/parsescilab.cpp"
           "src/cpp/parse/scanscilab.cpp"
           make-flags)))))))

> +    (home-page "https://www.scilab.org/")
>      (synopsis "Software for engineers and scientists")
>      (description "This package provides the non-graphical version of the Scilab
> -software for engineers and scientists. Scilab is used for signal processing,
> +software for engineers and scientists.  Scilab is used for signal processing,
>  statistical analysis, image enhancement, fluid dynamics simulations, numerical
>  optimization, and modeling, simulation of explicit and implicit dynamical
>  systems and symbolic manipulations.")
> -    (license license:cecill)))                    ;CeCILL v2.1
> +    (license (list license:gpl2 license:bsd-3))))
>  
>  (define-public ruy
>    (let ((commit "caa244343de289f913c505100e6a463d46c174de")
> diff --git a/gnu/packages/patches/scilab-hdf5-1.8-api.patch b/gnu/packages/patches/scilab-hdf5-1.8-api.patch
> new file mode 100644
> index 0000000000..8b453e4720
> --- /dev/null
> +++ b/gnu/packages/patches/scilab-hdf5-1.8-api.patch
> @@ -0,0 +1,71 @@
> +This patch fixes the compilation with hdf5 version >= 1.10. Adapted from
> +https://aur.archlinux.org/cgit/aur.git/plain/hdf5_18_api.patch?h=scilab-git.
> +
> +diff -ur a/scilab/modules/hdf5/includes/HDF5Objects.h b/scilab/modules/hdf5/includes/HDF5Objects.h
> +--- a/scilab/modules/hdf5/includes/HDF5Objects.h
> ++++ b/scilab/modules/hdf5/includes/HDF5Objects.h
> +@@ -16,14 +16,12 @@
> + #ifndef __HDF5OBJECTS_H__
> + #define __HDF5OBJECTS_H__
> + 
> +-#define H5_NO_DEPRECATED_SYMBOLS
> + #undef H5_USE_16_API
> ++#define H5_USE_18_API
> + 
> +-#define H5Eset_auto_vers 2
> + #include <hdf5.h>
> + #include <hdf5_hl.h>
> + 
> +-#undef H5_NO_DEPRECATED_SYMBOLS
> + 
> + //#define __HDF5OBJECTS_DEBUG__
> + //#define __HDF5ERROR_PRINT__
> +diff -ur a/scilab/modules/hdf5/Makefile.am b/scilab/modules/hdf5/Makefile.am
> +--- a/scilab/modules/hdf5/Makefile.am
> ++++ b/scilab/modules/hdf5/Makefile.am
> +@@ -104,8 +104,7 @@
> +     -DH5Gopen_vers=2 \
> +     -DH5Tget_array_dims_vers=2 \
> +     -DH5Acreate_vers=2 \
> +-    -DH5Rdereference_vers=2 \
> +-    -DNO_DEPRECATED_SYMBOLS
> ++    -DH5Rdereference_vers=2
> + 
> + 
> + libscihdf5_la_CPPFLAGS = \
> +diff -ur a/scilab/modules/hdf5/sci_gateway/cpp/sci_hdf5_listvar_v3.cpp b/scilab/modules/hdf5/sci_gateway/cpp/sci_hdf5_listvar_v3.cpp
> +--- a/scilab/modules/hdf5/sci_gateway/cpp/sci_hdf5_listvar_v3.cpp
> ++++ b/scilab/modules/hdf5/sci_gateway/cpp/sci_hdf5_listvar_v3.cpp
> +@@ -13,6 +13,8 @@
> + *
> + */
> + 
> ++#define H5_USE_18_API
> ++
> + #include <vector>
> + #include "function.hxx"
> + #include "string.hxx"
> +diff -ur a/scilab/modules/hdf5/src/c/h5_readDataFromFile.c b/scilab/modules/hdf5/src/c/h5_readDataFromFile.c
> +--- a/scilab/modules/hdf5/src/c/h5_readDataFromFile.c
> ++++ b/scilab/modules/hdf5/src/c/h5_readDataFromFile.c
> +@@ -13,7 +13,7 @@
> + *
> + */
> + 
> +-#define H5_NO_DEPRECATED_SYMBOLS
> ++#define H5_USE_18_API
> + 
> + #ifndef _MSC_VER
> + #include <sys/time.h>
> +diff -ur a/scilab/modules/hdf5/src/c/h5_readDataFromFile_v1.c b/scilab/modules/hdf5/src/c/h5_readDataFromFile_v1.c
> +--- a/scilab/modules/hdf5/src/c/h5_readDataFromFile_v1.c
> ++++ b/scilab/modules/hdf5/src/c/h5_readDataFromFile_v1.c
> +@@ -13,7 +13,7 @@
> + *
> + */
> + 
> +-#define H5_NO_DEPRECATED_SYMBOLS
> ++#define H5_USE_18_API
> + 
> + #ifndef _MSC_VER
> + #include <sys/time.h>
> -- 
> 2.41.0
> 
> 
> 
> 

-- 
Efraim Flashner   <[email-masked]>   רנשלפ םירפא
GPG key = A28B F40C 3E55 1372 662D  14F7 41AA E7DC CA3D 8351
Confidentiality cannot be guaranteed on emails sent or received unencrypted