Subject: [bug#64446] [PATCH] gnu: Add bliss.

From: David Elsing <[email-masked]>
Date: Mon, 3 Jul 2023 21:21:32 +0000

* gnu/packages/maths.scm (bliss): New variable.
---
The Makefile is rudimentary, so it is easier to call g++ directly.
I did not include GMP, as it is only used to express group sizes exactly.
 gnu/packages/maths.scm | 87 ++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 87 insertions(+)

diff --git a/gnu/packages/maths.scm b/gnu/packages/maths.scm
index 653e76027a..ff0aa6170b 100644
--- a/gnu/packages/maths.scm
+++ b/gnu/packages/maths.scm
@@ -8529,3 +8529,90 @@ (define-public scilab
 optimization, and modeling, simulation of explicit and implicit dynamical
 systems and symbolic manipulations.")
     (license license:cecill)))                    ;CeCILL v2.1
+
+(define-public bliss
+  (package
+    (name "bliss")
+    (version "0.73")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "http://www.tcs.hut.fi/Software/bliss/bliss-"
+                                  version ".zip"))
+              (sha256
+               (base32
+                "110ggzyn4fpsq3haisv7pzkgfs5x1m7802r4n5cas30l0hlg6yzm"))))
+    (outputs (list "out" "doc"))
+    (build-system gnu-build-system)
+    (arguments
+     (list
+      #:tests? #f ; No tests
+      #:phases
+      #~(modify-phases %standard-phases
+          (add-after 'unpack 'fix-string-macro
+            (lambda _
+              (substitute* "bliss.cc"
+                (("\"__DATE__\"") "\" __DATE__ \""))))
+          ;; Move headers under the bliss/ prefix
+          (add-after 'unpack 'move-headers
+            (lambda _
+              (substitute* (find-files "." "\\.(h|hh|cc)$")
+                (("#include \"(.*)\"" all path)
+                 (string-append "#include <bliss/" path ">")))
+              (mkdir-p "bliss")
+              (for-each
+               (lambda (file)
+                 (rename-file file
+                              (string-append "bliss/" (basename file))))
+               (find-files "." "\\.(h|hh)$"))))
+          (add-after 'move-headers 'disable-gmp
+            (lambda _
+              (substitute* "bliss/bignum.hh"
+                (("defined\\(BLISS_USE_GMP\\)") "0"))))
+          (delete 'configure)
+          (replace 'build
+            (lambda _
+              (let ((source-files
+                     '("defs" "graph" "partition" "orbit" "uintseqhash" "heap"
+                       "timer" "utils")))
+                (for-each
+                 (lambda (file)
+                   (display (string-append "Compiling " file "\n"))
+                   (invoke "g++" "-I." "-fPIC" "-c" "-o"
+                           (string-append file ".o")
+                           (string-append file ".cc")))
+                 source-files)
+                (let ((object-files
+                       (map (lambda (file) (string-append file ".o"))
+                            source-files)))
+                  (display (string-append "Linking shared library\n"))
+                  (apply invoke "g++" "-I." "-fPIC" "-shared"
+                         "-o" "libbliss.so"
+                         "bliss_C.cc"
+                         object-files)
+                  (display (string-append "Building bliss\n"))
+                  (apply invoke "g++" "-I." "-o" "bliss.out" "bliss.cc"
+                         "-L." "-lbliss"
+                         (string-append "-Wl,-rpath=" #$output:out "/lib")
+                         object-files)))))
+          (add-after 'build 'build-doc
+            (lambda _
+              (substitute* "Doxyfile"
+                (("INPUT *=.*") "INPUT = . bliss\n"))
+              (invoke "doxygen")))
+          (replace 'install
+            (lambda _
+              (install-file "libbliss.so" (string-append #$output:out "/lib"))
+              (mkdir-p (string-append #$output:out "/bin/"))
+              (copy-file "bliss.out" (string-append #$output:out "/bin/bliss"))
+              (copy-recursively "bliss"
+                                (string-append #$output:out "/include/bliss"))
+              (copy-recursively
+               "html" (string-append #$output:doc "/share/doc/"
+                                     #$name "-" #$version "/html")))))))
+    (native-inputs (list doxygen unzip))
+    (home-page "http://www.tcs.hut.fi/Software/bliss/index.shtml")
+    (synopsis "Tool for computing automorphism groups and canonical labelings of graphs")
+    (description "@code{bliss} is a library for computing automorphism groups
+and canonical forms of graphs.  It has both a command line user interface as
+well as C++ and C programming language APIs.")
+    (license license:lgpl3)))
-- 
2.40.1