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 # Copyright © 2023 Herman Rimm # Copyright © 2023 Troy Figiel +# Copyright © 2024 David Elsing # # 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 @@ (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 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; iatoms[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);