[PATCH] gnu: Add bliss.

  • Done
  • quality assurance status badge
Details
3 participants
  • Andreas Enge
  • David Elsing
  • Ludovic Courtès
Owner
unassigned
Submitted by
David Elsing
Severity
normal

Debbugs page

David Elsing wrote 2 years ago
(address . guix-patches@gnu.org)(name . David Elsing)(address . david.elsing@posteo.net)
5840cd3331640479ee55e604b4e5080be85819ba.1688419275.git.david.elsing@posteo.net
* 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(+)

Toggle diff (97 lines)
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
Andreas Enge wrote 2 years ago
(name . David Elsing)(address . david.elsing@posteo.net)
ZMFFc6mBoKVRW8y8@jurong
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:
Toggle quote (5 lines)
> + (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.

Toggle quote (13 lines)
> + ;; 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").

Toggle quote (5 lines)
> + (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.

Toggle quote (2 lines)
> + (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:
"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:

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
Andreas Enge wrote 2 years ago
(name . David Elsing)(address . david.elsing@posteo.net)
ZMFIPzrVVQGSdR2l@jurong
Am Mon, Jul 03, 2023 at 09:21:32PM +0000 schrieb David Elsing:
Toggle quote (2 lines)
> + (outputs (list "out" "doc"))

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

Andreas
David Elsing wrote 1 years ago
(name . Andreas Enge)(address . andreas@enge.fr)
7y1qespk5l.fsf@posteo.net
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.

Toggle quote (3 lines)
> ;; 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.

Toggle quote (4 lines)
> 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

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
David Elsing wrote 1 years ago
[PATCH v2] gnu: Add bliss.
(address . 64446@debbugs.gnu.org)(name . David Elsing)(address . david.elsing@posteo.net)
324c31a7249b044ffb5578795c35961562b12c38.1695248353.git.david.elsing@posteo.net
* gnu/packages/maths.scm (bliss): New variable.
---
gnu/packages/maths.scm | 85 ++++++++++++++++++++++++++++++++++++++++++
1 file changed, 85 insertions(+)

Toggle diff (95 lines)
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
Ludovic Courtès wrote 1 years ago
(name . David Elsing)(address . david.elsing@posteo.net)
877cntt76t.fsf@gnu.org
Hi,

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

Toggle quote (2 lines)
> * gnu/packages/maths.scm (bliss): New variable.

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

Ludo’.
Closed
?
Your comment

This issue is archived.

To comment on this conversation send an email to 64446@debbugs.gnu.org

To respond to this issue using the mumi CLI, first switch to it
mumi current 64446
Then, you may apply the latest patchset in this issue (with sign off)
mumi am -- -s
Or, compose a reply to this issue
mumi compose
Or, send patches to this issue
mumi send-email *.patch
You may also tag this issue. See list of standard tags. For example, to set the confirmed and easy tags
mumi command -t +confirmed -t +easy
Or, remove the moreinfo tag and set the help tag
mumi command -t -moreinfo -t +help