unofficial mirror of guix-patches@gnu.org 
 help / color / mirror / code / Atom feed
* [bug#64446] [PATCH] gnu: Add bliss.
@ 2023-07-03 21:21 David Elsing
  2023-07-26 16:10 ` Andreas Enge
  2023-07-26 16:22 ` [bug#64446] [PATCH] " Andreas Enge
  0 siblings, 2 replies; 6+ messages in thread
From: David Elsing @ 2023-07-03 21:21 UTC (permalink / raw)
  To: 64446; +Cc: David Elsing, andreas, efraim, bavier

* 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





^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [bug#64446] [PATCH] gnu: Add bliss.
  2023-07-03 21:21 [bug#64446] [PATCH] gnu: Add bliss David Elsing
@ 2023-07-26 16:10 ` Andreas Enge
  2023-09-20 22:14   ` David Elsing
  2023-07-26 16:22 ` [bug#64446] [PATCH] " Andreas Enge
  1 sibling, 1 reply; 6+ messages in thread
From: Andreas Enge @ 2023-07-26 16:10 UTC (permalink / raw)
  To: David Elsing; +Cc: 64446, efraim, bavier

Hello,

I have spent quite a long time on this package, trying to simplify your
recipe.

Am Mon, Jul 03, 2023 at 09:21:32PM +0000 schrieb David Elsing:
> +          (add-after 'unpack 'fix-string-macro
> +            (lambda _
> +              (substitute* "bliss.cc"
> +                (("\"__DATE__\"") "\" __DATE__ \""))))

This so far is only a warning with newer gcc versions, so we do not really
need it.

> +          ;; 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)$"))))

All surprising phases need more comments for their rationale.
I added this:
          ;; Move headers under the bliss/ prefix. This is a Guix choice,
          ;; since the header names are sufficiently generic to cause
          ;; confusions with other packages ("heap.hh").

> +          (add-after 'move-headers 'disable-gmp
> +            (lambda _
> +              (substitute* "bliss/bignum.hh"
> +                (("defined\\(BLISS_USE_GMP\\)") "0"))))

This looks like it is not needed if using the Makefile.

> +          (replace 'build

Here I am not convinced. You end up rewriting the Makefile in Guile.
The Makefile works, but it tries to create a binary "bliss", which
collides with the new file for the headers. This could be solved by
moving the content of the 'move-headers phase between the installation
of the bliss binary (after which it can be deleted) and the installation
of the headers.

Moreover, the Makefile does not create a dynamic, but only a static
library, and your build phase adds a dynamic library. Is this our role
as packagers?

According to the time stamps of the files inside the .zip, the software
dates from 2015 and is apparently unmaintained (otherwise I would have
suggested to get in touch with the developers to improve the Makefile).

So I wonder whether this software meets the quality standards for inclusion
into Guix.

Hm, I just found a new version here:
   https://users.aalto.fi/~tjunttil/bliss/index.html :
"Compiling
In Linux and macOS, one can use GNU Make to compile the bliss executable, as well as the static and shared libraries, with (...)"!

And the author is here:
   https://users.aalto.fi/~tjunttil/

Would you like to give it another try, David? And maybe discuss with the
author whether they would be willing to implement the bliss/ subdirectory
for the headers? (Given that there are now separate src/ and build/
subdirectories that would be quite easy.) And add an "install" target?

Andreas





^ permalink raw reply	[flat|nested] 6+ messages in thread

* [bug#64446] [PATCH] gnu: Add bliss.
  2023-07-03 21:21 [bug#64446] [PATCH] gnu: Add bliss David Elsing
  2023-07-26 16:10 ` Andreas Enge
@ 2023-07-26 16:22 ` Andreas Enge
  1 sibling, 0 replies; 6+ messages in thread
From: Andreas Enge @ 2023-07-26 16:22 UTC (permalink / raw)
  To: David Elsing; +Cc: 64446, efraim, bavier

Am Mon, Jul 03, 2023 at 09:21:32PM +0000 schrieb David Elsing:
> +    (outputs (list "out" "doc"))

Oh, and I think the documentation is sufficiently small to be kept in the
same package.

Andreas





^ permalink raw reply	[flat|nested] 6+ messages in thread

* [bug#64446] [PATCH] gnu: Add bliss.
  2023-07-26 16:10 ` Andreas Enge
@ 2023-09-20 22:14   ` David Elsing
  2023-09-20 22:19     ` [bug#64446] [PATCH v2] " David Elsing
  0 siblings, 1 reply; 6+ messages in thread
From: David Elsing @ 2023-09-20 22:14 UTC (permalink / raw)
  To: Andreas Enge; +Cc: 64446, efraim, bavier

Andreas Enge <andreas@enge.fr> writes:

Hello,

thanks for your comments! I noticed that igraph actually contains a
bundled copy of bliss which uses GMP, so I added it as a dependency
here.

>           ;; Move headers under the bliss/ prefix. This is a Guix choice,
>           ;; since the header names are sufficiently generic to cause
>           ;; confusions with other packages ("heap.hh").
In igraph, the bundled copy also has the files under the bliss/ prefix,
so I think it's good we do the same.

> Would you like to give it another try, David? And maybe discuss with the
> author whether they would be willing to implement the bliss/ subdirectory
> for the headers? (Given that there are now separate src/ and build/
> subdirectories that would be quite easy.) And add an "install" target?
I updated the package using the CMake build files in the new version.

During unbundling bliss from igraph, I saw that it also contains
a copy of CXSparse, which led me to split SuiteSparse into its
subpackages: https://issues.guix.gnu.org/66129.

When updating the igraph package, it would be good to use the
suitesparse-cxsparse package right away, so I did not include it yet.
The build with the bliss package succeeds however.

Cheers,
David




^ permalink raw reply	[flat|nested] 6+ messages in thread

* [bug#64446] [PATCH v2] gnu: Add bliss.
  2023-09-20 22:14   ` David Elsing
@ 2023-09-20 22:19     ` David Elsing
  2023-10-11 17:11       ` bug#64446: " Ludovic Courtès
  0 siblings, 1 reply; 6+ messages in thread
From: David Elsing @ 2023-09-20 22:19 UTC (permalink / raw)
  To: 64446; +Cc: David Elsing

* gnu/packages/maths.scm (bliss): New variable.
---
 gnu/packages/maths.scm | 85 ++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 85 insertions(+)

diff --git a/gnu/packages/maths.scm b/gnu/packages/maths.scm
index 6141c09886..76ac34a5d9 100644
--- a/gnu/packages/maths.scm
+++ b/gnu/packages/maths.scm
@@ -8567,3 +8567,88 @@ (define-public ruy
 architecture.")
       (license license:asl2.0))))
 
+(define-public bliss
+  (package
+    (name "bliss")
+    (version "0.77")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append
+                    "https://users.aalto.fi/~tjunttil/bliss/downloads/bliss-"
+                    version ".zip"))
+              (sha256
+               (base32
+                "193jb63kdwfas2cf61xj3fgkvhb6v2mnbwwpr0jas3zk6j0bkj5c"))))
+    (build-system cmake-build-system)
+    (arguments
+     (list
+      ;; There are no tests
+      #:tests? #f
+      #:configure-flags #~(list "-DUSE_GMP=ON") ; Used by igraph
+      #:phases
+      #~(modify-phases %standard-phases
+          ;; Ensure that GMP is used, otherwise the BigNum type changes.
+          (add-after 'unpack 'define-use-gmp
+            (lambda _
+              (substitute* "src/bignum.hh"
+                (("#pragma once.*" all)
+                 (string-append all "#define BLISS_USE_GMP")))))
+          ;; Move headers under the bliss/ prefix. This is a Guix choice,
+          ;; since there are no upstream installation instructions and the
+          ;; header names are sufficiently generic to cause confusions with
+          ;; other packages (e.g. "heap.hh").
+          (add-after 'define-use-gmp 'move-headers
+            (lambda _
+              (substitute* (find-files "src")
+                (("#include \"(.*)\"" _ path)
+                 (string-append "#include <bliss/" path ">")))
+              (mkdir-p "include/bliss")
+              (for-each
+               (lambda (file)
+                 (rename-file file
+                              (string-append "include/bliss/" (basename file))))
+               (find-files "src" "\\.(h|hh)$"))
+              (substitute* "Doxyfile"
+                (("INPUT *=.*") "INPUT = bliss"))))
+          (add-after 'move-headers 'patch-cmake
+            (lambda _
+              (let ((port (open-file "CMakeLists.txt" "a")))
+                (display
+                 (apply
+                  string-append
+                  ;; Install the executable and the shared library.
+                  "install(TARGETS bliss)\n"
+                  "install(TARGETS bliss-executable)\n"
+                  "install(DIRECTORY include/bliss DESTINATION include)\n"
+                  "target_link_libraries(bliss PUBLIC ${GMP_LIBRARIES})\n"
+                  ;; Missing include directories.
+                  (map
+                   (lambda (name)
+                     (string-append
+                      "target_include_directories(" name " PUBLIC\n"
+                      "${CMAKE_CURRENT_SOURCE_DIR}/include"
+                      " ${GMP_INCLUDE_DIR})\n"))
+                   '("bliss" "bliss_static" "bliss-executable")))
+                 port)
+                (close-port port))))
+          (add-after 'build 'build-doc
+            (lambda _
+              (mkdir "doc")
+              (with-directory-excursion "doc"
+                (let ((srcdir (string-append "../../bliss-" #$version)))
+                  (copy-recursively (string-append srcdir "/include/bliss")
+                                    "bliss")
+                  (invoke "doxygen" (string-append srcdir "/Doxyfile"))))))
+          (add-after 'install 'install-doc
+            (lambda _
+              (copy-recursively
+               "doc/html" (string-append #$output "/share/doc/"
+                                     #$name "-" #$version "/html")))))))
+    (native-inputs (list doxygen graphviz unzip))
+    (propagated-inputs (list gmp))
+    (home-page "https://users.aalto.fi/~tjunttil/bliss/index.html")
+    (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.41.0





^ permalink raw reply related	[flat|nested] 6+ messages in thread

* bug#64446: [PATCH v2] gnu: Add bliss.
  2023-09-20 22:19     ` [bug#64446] [PATCH v2] " David Elsing
@ 2023-10-11 17:11       ` Ludovic Courtès
  0 siblings, 0 replies; 6+ messages in thread
From: Ludovic Courtès @ 2023-10-11 17:11 UTC (permalink / raw)
  To: David Elsing; +Cc: Andreas Enge, 64446-done

Hi,

David Elsing <david.elsing@posteo.net> skribis:

> * gnu/packages/maths.scm (bliss): New variable.

I believe this version addresses the concerns Andreas raised.  Applied!

Ludo’.




^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2023-10-11 17:12 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-07-03 21:21 [bug#64446] [PATCH] gnu: Add bliss David Elsing
2023-07-26 16:10 ` Andreas Enge
2023-09-20 22:14   ` David Elsing
2023-09-20 22:19     ` [bug#64446] [PATCH v2] " David Elsing
2023-10-11 17:11       ` bug#64446: " Ludovic Courtès
2023-07-26 16:22 ` [bug#64446] [PATCH] " Andreas Enge

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/guix.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).