gnu: avalon-toolkit: Update to 2.0.5a.

The bug freeing static memory and the makefile have been improved upstream, so
we don't have to work around them anymore. Now, two static libraries are built
instead.

* gnu/packages/chemistry.scm (avalon-toolkit): Update to 2.0.5a.
[source]: Switch to git reference from GitHub. Adjust snippet. Add patch from
the RDKit fork.
[arguments]: Remove 'dont-free-static-memory phase. Use provided
makefile. Adjust 'install phase.
* gnu/packages/patches/avalon-toolkit-rdkit-fixes.patch: New file.
* gnu/local.mk (dist_patch_DATA): Add it.

Signed-off-by: Christopher Baines <mail@cbaines.net>
This commit is contained in:
David Elsing 2024-01-28 23:02:00 +00:00 committed by Christopher Baines
parent baa711441a
commit 52cca41c6f
No known key found for this signature in database
GPG key ID: 5E28A33B0B84F577
3 changed files with 166 additions and 77 deletions

View file

@ -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 \

View file

@ -917,90 +917,67 @@ (define-public yaehmop
(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().
#~(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)
(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
(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

View file

@ -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);