aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gnu/local.mk2
-rw-r--r--gnu/packages/chemistry.scm131
-rw-r--r--gnu/packages/patches/avalon-toolkit-rdkit-fixes.patch110
3 files changed, 166 insertions, 77 deletions
diff --git a/gnu/local.mk b/gnu/local.mk
index 7806771eea..ab690795a7 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -63,6 +63,7 @@
# Copyright © 2023 gemmaro <gemmaro.dev@gmail.com>
# Copyright © 2023 Herman Rimm <herman@rimm.ee>
# Copyright © 2023 Troy Figiel <troy@troyfigiel.com>
+# Copyright © 2024 David Elsing <david.elsing@posteo.net>
#
# This file is part of GNU Guix.
#
@@ -957,6 +958,7 @@ dist_patch_DATA = \
%D%/packages/patches/audiofile-function-signature.patch \
%D%/packages/patches/automake-skip-amhello-tests.patch \
%D%/packages/patches/avahi-localstatedir.patch \
+ %D%/packages/patches/avalon-toolkit-rdkit-fixes.patch \
%D%/packages/patches/avidemux-install-to-lib.patch \
%D%/packages/patches/awesome-reproducible-png.patch \
%D%/packages/patches/awesome-4.3-fno-common.patch \
diff --git a/gnu/packages/chemistry.scm b/gnu/packages/chemistry.scm
index 4a9dd97c5b..5e19bdf182 100644
--- a/gnu/packages/chemistry.scm
+++ b/gnu/packages/chemistry.scm
@@ -917,90 +917,67 @@ calculations and analyzing the results.")
(define-public avalon-toolkit
(package
(name "avalon-toolkit")
- (version "1.2.0")
- (source
- (origin
- (method url-fetch)
- (uri (string-append
- "mirror://sourceforge/avalontoolkit/"
- "AvalonToolkit_" (substring version 0 3) "/AvalonToolkit_"
- version ".source.tar"))
- (sha256
- (base32
- "0rnnyy6axs2da7aa4q6l30ldavbk49v6l22llj1adn74h1i67bpv"))
- (modules '((guix build utils) (ice-9 ftw)))
- (snippet
- #~(begin
- (delete-file-recursively "../SourceDistribution/java")))))
+ (version "2.0.5a")
+ (source (origin
+ (method git-fetch)
+ (uri (git-reference
+ (url "https://github.com/rohdebe1/ava-formake")
+ (commit (string-append "AvalonToolkit_" version))))
+ (file-name (git-file-name name version))
+ (sha256
+ (base32
+ "1mfg40y5xc17sm59zdfc5sk22n9zm5zk0z1aw47chvl6hp465szk"))
+ (patches
+ (search-patches "avalon-toolkit-rdkit-fixes.patch"))
+ (modules '((guix build utils) (ice-9 ftw)))
+ (snippet
+ #~(begin
+ (delete-file-recursively "src/main/java")
+ (delete-file-recursively "src/test/target")))))
(build-system gnu-build-system)
(arguments
(list
- ;; There are no intended tests
+ ;; There is only one test, which is missing a file
#:tests? #f
#:phases
- #~(let ((programs '("canonizer" "matchtest" "sketch" "smi2mol" "struchk")))
- (modify-phases %standard-phases
- (add-after 'unpack 'chdir
- (lambda _ (chdir "common")))
- (delete 'configure)
- (add-before 'build 'dont-free-static-memory
- (lambda _
- (substitute* "reaccsio.c"
- (("MyFree\\(.*tempdir\\)" m)
- (string-append "/* freeing memory from getenv is bad */"
- "// " m)))))
- ;; The makefile has incorrect compiler flags and is missing some
- ;; object files, so we build it ourselves.
- (replace 'build
- (lambda _
- (for-each
- (lambda (part)
- (format #t "Compiling ~a.c ~~> ~a.o~%" part part)
- (invoke #$(cc-for-target) "-c" "-fPIC" "-O2"
- (string-append part ".c")
- "-o" (string-append part ".o")))
- (list "aacheck" "casutils" "denormal" "depictutil"
- "didepict" "fixcharges" "forio" "geometry"
- "graph" "hashcode" "layout" "local" "pattern"
- "perceive" "reaccsio" "rtutils" "set" "shortcut"
- "sketch" "ssmatch" "stereo" "symbol_lists"
- "symboltable" "utilities"))
- (display "Building libavalontoolkit.so\n")
- (apply invoke "gcc" "-fPIC" "-shared" "-lm"
- "-o" "libavalontoolkit.so" "canonizer.c" "smi2mol.c"
- "struchk.c" "patclean.c" (find-files "." "\\.o$"))
- ;; patclean is not built here as there is an undeclared
- ;; variable in main().
- (for-each
- (lambda (program)
- (display (string-append "Building " program "\n"))
- (invoke "gcc" "-L." "-lavalontoolkit" "-lm" "-O2"
- (string-append "-Wl,-rpath=" #$output "/lib")
- "-DMAIN" (string-append program ".c") "-o" program))
- programs)))
- (replace 'install
- (lambda _
- ;; Executables
+ #~(modify-phases %standard-phases
+ (delete 'configure)
+ (replace 'build
+ (lambda* (#:key parallel-build? #:allow-other-keys)
+ (mkdir "build")
+ (mkdir-p "target/executables")
+ (mkdir-p "target/libraries")
+ (invoke "make" "programs" "-j"
+ (if parallel-build?
+ (number->string (parallel-job-count))
+ "1"))))
+ (replace 'install
+ (lambda _
+ ;; Executables
+ (let ((programs '("canonizer" "matchtest" "smi2mol" "struchk")))
(for-each
(lambda (program)
- (install-file program (string-append #$output "/bin")))
- programs)
- (for-each
- (lambda (name)
- (symlink (string-append #$output "/bin/smi2mol")
- (string-append #$output "/bin/" name)))
- '("mol2smi" "rdf2smi" "mol2tbl" "mol2sma" "smi2rdf"))
- ;; Library
- (install-file "libavalontoolkit.so"
- (string-append #$output "/lib"))
- (for-each
- (lambda (file)
- (install-file file (string-append #$output
- "/include/avalontoolkit")))
- (find-files "." "\\.h$"))
- (install-file "../license.txt"
- (string-append #$output "/share/doc/"
- #$name "-" #$version "/"))))))))
+ (install-file (string-append "target/executables/" program)
+ (string-append #$output "/bin")))
+ programs))
+ (for-each
+ (lambda (name)
+ (symlink (string-append #$output "/bin/smi2mol")
+ (string-append #$output "/bin/" name)))
+ '("mol2smi" "rdf2smi" "mol2tbl" "mol2sma" "smi2rdf"))
+ ;; Library
+ (install-file "target/libraries/libavalon_tools.a"
+ (string-append #$output "/lib"))
+ (install-file "target/libraries/libavalon4rdkit.a"
+ (string-append #$output "/lib"))
+ (for-each
+ (lambda (file)
+ (install-file file (string-append #$output
+ "/include/avalontoolkit")))
+ (find-files "src/main/C/include" "\\.h$"))
+ (install-file "license.txt"
+ (string-append #$output "/share/doc/"
+ #$name "-" #$version "/")))))))
(home-page "https://sourceforge.net/projects/avalontoolkit/")
(synopsis "Tools for SMILES and MOL files and for structure fingerprinting")
(description "This package contains a library and programs for
diff --git a/gnu/packages/patches/avalon-toolkit-rdkit-fixes.patch b/gnu/packages/patches/avalon-toolkit-rdkit-fixes.patch
new file mode 100644
index 0000000000..c93a9869ed
--- /dev/null
+++ b/gnu/packages/patches/avalon-toolkit-rdkit-fixes.patch
@@ -0,0 +1,110 @@
+Patches taken from the rdkit fork at this commit (there version
+AvalonToolkit_2.0.6-pre.2):
+https://github.com/rdkit/ava-formake/commit/d05bee0382b8f4696b2b4b05b0038fb7d559520a
+
+diff -ur a/src/main/C/common/reaccsio.c b/src/main/C/common/reaccsio.c
+--- a/src/main/C/common/reaccsio.c
++++ b/src/main/C/common/reaccsio.c
+@@ -322,34 +322,49 @@
+ fprintf(fp,"\n");
+ }
+
++#define MAX_BONDLINE_FIELDS 7
++#define BONDLINE_FIELD_LEN 3
++
+ int ReadREACCSBond(Fortran_FILE *fp, struct reaccs_bond_t *bp)
+ {
+- int nitems, i;
+- char buffer[MAX_BUFFER+1];
++ int nitems, i, j, k;
++ int bond_line_len, n_chars, pos;
++ int *ptrarray[MAX_BONDLINE_FIELDS];
++ char c;
++ char buffer[BONDLINE_FIELD_LEN+1];
+
+ if (fp->status != FORTRAN_NORMAL) return(fp->status);
+
+- strncpy(buffer,fp->buffer,MAX_BUFFER);
+- /* zero pad only atom numbers! */
+- for (i=0; i<6; i++) if (buffer[i] == ' ') buffer[i] = '0';
+-
+ bp->stereo_symbol = 0;
+ bp->dummy = 0;
+ bp->topography = 0;
+ bp->reaction_mark = NONE;
+- // make sure spaces are interpreted the Fortran-way
+- for (i=9; i<strlen(buffer) && i<21; i+=3)
+- {
+- if ((i+1)<strlen(buffer) && buffer[i+1]==' ') buffer[i+1] = '0';
+- if ((i+2)<strlen(buffer) && buffer[i+2]==' ') buffer[i+2] = '0';
++ ptrarray[0] = &bp->atoms[0];
++ ptrarray[1] = &bp->atoms[1];
++ ptrarray[2] = &bp->bond_type;
++ ptrarray[3] = &bp->stereo_symbol;
++ ptrarray[4] = &bp->dummy;
++ ptrarray[5] = &bp->topography;
++ ptrarray[6] = &bp->reaction_mark;
++ bond_line_len = strlen(fp->buffer);
++ nitems = bond_line_len ? (bond_line_len - 1) / BONDLINE_FIELD_LEN + 1 : 0;
++ if (nitems > MAX_BONDLINE_FIELDS)
++ nitems = MAX_BONDLINE_FIELDS;
++ for (i = 0; i < nitems; ++i)
++ {
++ pos = i * BONDLINE_FIELD_LEN;
++ memset(buffer, 0, BONDLINE_FIELD_LEN + 1);
++ n_chars = bond_line_len - pos;
++ if (n_chars > BONDLINE_FIELD_LEN)
++ n_chars = BONDLINE_FIELD_LEN;
++ for (j = 0, k = 0; j < n_chars; ++j)
++ {
++ c = fp->buffer[pos + j];
++ if (c != ' ')
++ buffer[k++] = c;
++ }
++ sscanf(buffer, "%3d", ptrarray[i]);
+ }
+- nitems = sscanf(buffer,
+- "%3d%3d%3d%3d%3d%3d%3d",
+- &bp->atoms[0], &bp->atoms[1],
+- &bp->bond_type, &bp->stereo_symbol,
+- &bp->dummy,
+- &bp->topography, &bp->reaction_mark);
+-
+ if (nitems >= 3)
+ {
+ GetBuffer(fp);
+@@ -1582,6 +1597,8 @@
+
+ PrintREACCSMolecule(fp, mp,"");
+
++ fputc('\0', fp);
++ fflush(fp);
+ rewind(fp);
+
+ MolStr = _ReadFile(fp);
+diff -ur a/src/main/C/programs/struchk.c b/src/main/C/programs/struchk.c
+--- a/src/main/C/programs/struchk.c
++++ b/src/main/C/programs/struchk.c
+@@ -1581,6 +1581,22 @@
+
+ if ((result & SIZE_CHECK_FAILED) == 0)
+ {
++ for (i = 0; i < mp->n_bonds; ++i) {
++ for (j = 0; j < 2; ++j) {
++ if (mp->bond_array[i].atoms[j] < 1 || mp->bond_array[i].atoms[j] > mp->n_atoms)
++ {
++ snprintf(msg_buffer, MAXMSG,
++ "%10s : illegal atom # (%d, max allowed is %d) in bond %d",
++ mp->name, mp->bond_array[i].atoms[j], mp->n_atoms, i + 1);
++ AddMsgToList(msg_buffer);
++ result |= SIZE_CHECK_FAILED;
++ }
++ }
++ }
++ }
++
++ if ((result & SIZE_CHECK_FAILED) == 0)
++ {
+ if (convert_atom_texts)
+ {
+ tmp = ConvertAtomAliases(mp);