diff --git a/sci-chemistry/pymol/files/pymol-3.0.0-SceneGetDrawFlag-indexing.patch b/sci-chemistry/pymol/files/pymol-3.0.0-SceneGetDrawFlag-indexing.patch new file mode 100644 index 0000000000000..c23bf79d6166d --- /dev/null +++ b/sci-chemistry/pymol/files/pymol-3.0.0-SceneGetDrawFlag-indexing.patch @@ -0,0 +1,22 @@ +From 50be59fb4bd6706c7939a659f4477041e2f0619e Mon Sep 17 00:00:00 2001 +From: Jarrett Johnson <36459667+JarrettSJohnson@users.noreply.github.com> +Date: Sat, 6 Apr 2024 22:49:41 -0400 +Subject: [PATCH] PYMOL-4849: Fix SceneGetDrawFlag slot indexing + +--- + layer1/Scene.cpp | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/layer1/Scene.cpp b/layer1/Scene.cpp +index e4888db6d..ed211bdd6 100644 +--- a/layer1/Scene.cpp ++++ b/layer1/Scene.cpp +@@ -4448,7 +4448,7 @@ int SceneGetDrawFlag(GridInfo * grid, int *slot_vla, int slot) + { + if(((slot < 0) && grid->slot) || + ((slot == 0) && (grid->slot == 0)) || +- (slot_vla && (slot_vla[slot] == grid->slot))) { ++ (slot_vla && (slot >= 0 && slot_vla[slot] == grid->slot))) { + draw_flag = true; + } + } diff --git a/sci-chemistry/pymol/files/pymol-3.0.0-distutils-py3.12.patch b/sci-chemistry/pymol/files/pymol-3.0.0-distutils-py3.12.patch new file mode 100644 index 0000000000000..3ab0384bd5f6c --- /dev/null +++ b/sci-chemistry/pymol/files/pymol-3.0.0-distutils-py3.12.patch @@ -0,0 +1,70 @@ +From 3d3c8963798d426e70675c3c40df146e12869b0a Mon Sep 17 00:00:00 2001 +From: Branch Vincent +Date: Fri, 10 May 2024 22:12:58 -0700 +Subject: [PATCH] replace distutils for python 3.12 (#362) + +Co-authored-by: Jarrett Johnson +--- + create_shadertext.py | 3 +-- + modules/pymol/plugins/installation.py | 7 +++---- + testing/tests/system/pymolwin.py | 1 - + 3 files changed, 4 insertions(+), 7 deletions(-) + +diff --git a/create_shadertext.py b/create_shadertext.py +index 7bae72180..f6857087e 100644 +--- a/create_shadertext.py ++++ b/create_shadertext.py +@@ -7,7 +7,6 @@ + from collections import defaultdict + from os.path import dirname + from subprocess import Popen, PIPE +-from distutils import dir_util + + def create_all(generated_dir, pymoldir="."): + ''' +@@ -30,7 +29,7 @@ def __init__(self, filename): + self.out = cStringIO.StringIO() + self.filename = filename + else: +- dir_util.mkpath(os.path.dirname(filename)) ++ os.makedirs(os.path.dirname(filename), exist_ok=True) + self.out = open(filename, "w") + self.filename = None + def close(self): +diff --git a/modules/pymol/plugins/installation.py b/modules/pymol/plugins/installation.py +index 3a980545b..2fb8f6f03 100644 +--- a/modules/pymol/plugins/installation.py ++++ b/modules/pymol/plugins/installation.py +@@ -45,8 +45,6 @@ def cmp_version(v1, v2): + ''' + Compares two version strings. An empty version string is always considered + smaller than a non-empty version string. +- +- Uses distutils.version.StrictVersion to evaluate non-empty version strings. + ''' + if v1 == v2: + return 0 +@@ -55,8 +53,9 @@ def cmp_version(v1, v2): + if v2 == '': + return 1 + try: +- from distutils.version import StrictVersion as Version +- return cmp(Version(v1), Version(v2)) ++ v1_parts = list(map(int, v1.split('.'))) ++ v2_parts = list(map(int, v2.split('.'))) ++ return (v1_parts > v2_parts) - (v1_parts < v2_parts) + except: + print(' Warning: Version parsing failed for', v1, 'and/or', v2) + return 0 +diff --git a/testing/tests/system/pymolwin.py b/testing/tests/system/pymolwin.py +index 429fd28aa..e7885bd38 100644 +--- a/testing/tests/system/pymolwin.py ++++ b/testing/tests/system/pymolwin.py +@@ -7,7 +7,6 @@ + import subprocess + import sys + import unittest +-from distutils.spawn import find_executable + from pymol import cmd, CmdException, testing, stored + + @unittest.skipIf(not sys.platform.startswith('win'), 'windows only') diff --git a/sci-chemistry/pymol/files/pymol-3.0.0-eof-maeffplugin.patch b/sci-chemistry/pymol/files/pymol-3.0.0-eof-maeffplugin.patch new file mode 100644 index 0000000000000..8eb8fbde318b4 --- /dev/null +++ b/sci-chemistry/pymol/files/pymol-3.0.0-eof-maeffplugin.patch @@ -0,0 +1,22 @@ +From f005dde377e3e50b6e3f405939435c5061fa8b63 Mon Sep 17 00:00:00 2001 +From: Jarrett Johnson <36459667+JarrettSJohnson@users.noreply.github.com> +Date: Mon, 22 Apr 2024 11:12:21 -0400 +Subject: [PATCH] PYMOL-4869: Only compare eof token in maeffplugin parser + +--- + contrib/uiuc/plugins/molfile_plugin/src/maeffplugin.cpp | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/contrib/uiuc/plugins/molfile_plugin/src/maeffplugin.cpp b/contrib/uiuc/plugins/molfile_plugin/src/maeffplugin.cpp +index efaede65b..0547ff91b 100644 +--- a/contrib/uiuc/plugins/molfile_plugin/src/maeffplugin.cpp ++++ b/contrib/uiuc/plugins/molfile_plugin/src/maeffplugin.cpp +@@ -248,7 +248,7 @@ const char * Tokenizer::token(bool ignore_single) { + char c = peek(); + bool good = false; + ssize_t diff; +- while(state != DONE && c >= 0) { ++ while(state != DONE && c != std::char_traits::eof()) { + // make sure we have space in m_token for 2 more characters + if ((diff = ptr-m_token) >= max_token_size-1) { + m_token = (char *)realloc( m_token, 2*max_token_size ); diff --git a/sci-chemistry/pymol/files/pymol-3.0.0-lto-molfile-plugin.patch b/sci-chemistry/pymol/files/pymol-3.0.0-lto-molfile-plugin.patch new file mode 100644 index 0000000000000..445fc6bc3a104 --- /dev/null +++ b/sci-chemistry/pymol/files/pymol-3.0.0-lto-molfile-plugin.patch @@ -0,0 +1,187 @@ +From 9d3061ca58d8b69d7dad74a68fc13fe81af0ff8e Mon Sep 17 00:00:00 2001 +From: Jarrett Johnson +Date: Thu, 5 Sep 2024 11:20:02 -0400 +Subject: [PATCH] Symbol renaming in molfile_plugin and internal linkage + +Fixes #395 +--- + contrib/uiuc/plugins/molfile_plugin/src/ReadPARM7.h | 10 +++++----- + .../uiuc/plugins/molfile_plugin/src/parm7plugin.cpp | 8 +++++--- + contrib/uiuc/plugins/molfile_plugin/src/parmplugin.cpp | 2 ++ + layer0/Isosurf.cpp | 6 ++++-- + layer0/Tetsurf.cpp | 6 ++++-- + ov/src/OVOneToAny.cpp | 2 ++ + ov/src/OVOneToOne.cpp | 2 ++ + 7 files changed, 24 insertions(+), 12 deletions(-) + +diff --git a/contrib/uiuc/plugins/molfile_plugin/src/ReadPARM7.h b/contrib/uiuc/plugins/molfile_plugin/src/ReadPARM7.h +index 21d967d79..6bd6ddb08 100644 +--- a/contrib/uiuc/plugins/molfile_plugin/src/ReadPARM7.h ++++ b/contrib/uiuc/plugins/molfile_plugin/src/ReadPARM7.h +@@ -59,7 +59,7 @@ + #endif + + +-typedef struct parm { ++typedef struct parm7 { + char title[85]; + char version[85]; + int IfBox, Nmxrs, IfCap, +@@ -70,7 +70,7 @@ typedef struct parm { + Ipatm, Natcap,Ifpert,Nbper,Ngper,Ndper,Mbper,Mgper,Mdper, + Numextra; + _REAL Box[3], Cutcap, Xcap, Ycap, Zcap; +-} parmstruct; ++} parm7struct; + + static int read_parm7_flag(FILE *file, const char *flag, const char *format) { + char buf[1024]; +@@ -359,10 +359,10 @@ static void close_parm7_file(FILE *fileptr, int popn) { + + static const char *parm7 = "%8d%8d%8d%8d%8d%8d%8d%8d%8d%8d\n"; + +-static parmstruct *read_parm7_header(FILE *file) { ++static parm7struct *read_parm7_header(FILE *file) { + char sdum[512]; +- parmstruct *prm; +- prm = new parmstruct; ++ parm7struct *prm; ++ prm = new parm7struct; + + /* READ VERSION */ + fgets(sdum, 512, file); +diff --git a/contrib/uiuc/plugins/molfile_plugin/src/parm7plugin.cpp b/contrib/uiuc/plugins/molfile_plugin/src/parm7plugin.cpp +index faf2717c6..2d46553b4 100644 +--- a/contrib/uiuc/plugins/molfile_plugin/src/parm7plugin.cpp ++++ b/contrib/uiuc/plugins/molfile_plugin/src/parm7plugin.cpp +@@ -24,13 +24,15 @@ + #include "molfile_plugin.h" + #include "ReadPARM7.h" + ++namespace { + typedef struct { +- parmstruct *prm; ++ parm7struct *prm; + int popn; + FILE *fd; + int nbonds; + int *from, *to; + } parmdata; ++} + + static void *open_parm7_read(const char *filename, const char *,int *natoms) { + FILE *fd; +@@ -39,7 +41,7 @@ static void *open_parm7_read(const char *filename, const char *,int *natoms) { + fprintf(stderr, "parm7plugin) Cannot open parm file '%s'\n", filename); + return NULL; + } +- parmstruct *prm = read_parm7_header(fd); ++ parm7struct *prm = read_parm7_header(fd); + if (!prm) { + close_parm7_file(fd, popn); + return NULL; +@@ -58,7 +60,7 @@ static void *open_parm7_read(const char *filename, const char *,int *natoms) { + + static int read_parm7_structure(void *mydata, int *optflags, molfile_atom_t *atoms) { + parmdata *p = (parmdata *)mydata; +- const parmstruct *prm = p->prm; ++ const parm7struct *prm = p->prm; + FILE *file = p->fd; + char buf[85]; + char field[85]; +diff --git a/contrib/uiuc/plugins/molfile_plugin/src/parmplugin.cpp b/contrib/uiuc/plugins/molfile_plugin/src/parmplugin.cpp +index acabcb1b5..4996383e1 100644 +--- a/contrib/uiuc/plugins/molfile_plugin/src/parmplugin.cpp ++++ b/contrib/uiuc/plugins/molfile_plugin/src/parmplugin.cpp +@@ -24,12 +24,14 @@ + #include "ReadPARM.h" + #include "molfile_plugin.h" + ++namespace { + typedef struct { + ReadPARM *rp; + FILE *parm; + int natoms; + int *from, *to; + } parmdata; ++} + + static void *open_parm_read(const char *filename, const char *, + int *natoms) { +diff --git a/layer0/Isosurf.cpp b/layer0/Isosurf.cpp +index 77cf42eeb..b2dfaedd7 100644 +--- a/layer0/Isosurf.cpp ++++ b/layer0/Isosurf.cpp +@@ -44,11 +44,13 @@ Z* ------------------------------------------------------------------- + + #define I4(field,P1,P2,P3,P4) ((field)->get(P1,P2,P3,P4)) + +-typedef struct PointType { ++namespace { ++struct PointType { + float Point[3]; + int NLink; + struct PointType* Link[4]; +-} PointType; ++}; ++} + + #define EdgePtPtr(field,P2,P3,P4,P5) ((field)->ptr(P2,P3,P4,P5)) + +diff --git a/layer0/Tetsurf.cpp b/layer0/Tetsurf.cpp +index 0d78b535e..cb2f5b37b 100644 +--- a/layer0/Tetsurf.cpp ++++ b/layer0/Tetsurf.cpp +@@ -38,12 +38,14 @@ Z* ------------------------------------------------------------------- + + #define I3(field,P1,P2,P3) ((field)->get(P1,P2,P3)) + +-typedef struct { ++namespace { ++struct PointType { + float Point[3]; + float Normal[3]; + int NormalFlag; + int Link; +-} PointType; ++}; ++} + + typedef struct { + PointType *p[3]; +diff --git a/ov/src/OVOneToAny.cpp b/ov/src/OVOneToAny.cpp +index 1a675a51b..5dbbc498c 100644 +--- a/ov/src/OVOneToAny.cpp ++++ b/ov/src/OVOneToAny.cpp +@@ -8,11 +8,13 @@ + + /* FYI: "up" stands for UniquePair -- a precursor to OneToAny */ + ++namespace { + typedef struct { + int active; + ov_word forward_value, reverse_value; + ov_size forward_next; + } up_element; ++} + + struct _OVOneToAny { + OVHeap *heap; +diff --git a/ov/src/OVOneToOne.cpp b/ov/src/OVOneToOne.cpp +index 6dfa8f457..4e9baf9c6 100644 +--- a/ov/src/OVOneToOne.cpp ++++ b/ov/src/OVOneToOne.cpp +@@ -8,11 +8,13 @@ + + /* FYI: "up" stands for UniquePair -- a precursor to OneToOne */ + ++namespace { + typedef struct { + int active; + ov_word forward_value, reverse_value; + ov_size forward_next, reverse_next; + } up_element; ++} + + struct _OVOneToOne { + OVHeap *heap; diff --git a/sci-chemistry/pymol/files/pymol-3.0.0-numpy2.patch b/sci-chemistry/pymol/files/pymol-3.0.0-numpy2.patch new file mode 100644 index 0000000000000..7cf2884ee201a --- /dev/null +++ b/sci-chemistry/pymol/files/pymol-3.0.0-numpy2.patch @@ -0,0 +1,35 @@ +From 758cec338057b23007ffd14c960634ff0ee24af1 Mon Sep 17 00:00:00 2001 +From: Jarrett Johnson +Date: Tue, 27 Aug 2024 20:06:57 -0400 +Subject: [PATCH] Make numpy2 compatible + +--- + layer2/ObjectMap.cpp | 1 + + modules/chempy/brick.py | 2 +- + 2 files changed, 2 insertions(+), 1 deletion(-) + +diff --git a/layer2/ObjectMap.cpp b/layer2/ObjectMap.cpp +index ada826f8a..62e3457a4 100644 +--- a/layer2/ObjectMap.cpp ++++ b/layer2/ObjectMap.cpp +@@ -5596,6 +5596,7 @@ static int ObjectMapNumPyArrayToMapState(PyMOLGlobals * G, ObjectMapState * ms, + void * ptr; + + #ifdef _PYMOL_NUMPY ++ import_array1(0); + PyArrayObject * pao = (PyArrayObject *) ary; + const int itemsize = PyArray_ITEMSIZE(pao); + #endif +diff --git a/modules/chempy/brick.py b/modules/chempy/brick.py +index fc514eb3a..e4c0f1bbb 100644 +--- a/modules/chempy/brick.py ++++ b/modules/chempy/brick.py +@@ -31,7 +31,7 @@ def from_numpy(cls, data, grid, origin=(0.0, 0.0, 0.0)): + @param range: 3f sequence + @param origin: 3f sequence + ''' +- data = numpy.asfarray(data) ++ data = numpy.asarray(data, dtype=numpy.float64) + assert len(data.shape) == 3 + + self = cls() diff --git a/sci-chemistry/pymol/files/pymol-3.0.0-py3.12-progress.patch b/sci-chemistry/pymol/files/pymol-3.0.0-py3.12-progress.patch new file mode 100644 index 0000000000000..b09f36048b203 --- /dev/null +++ b/sci-chemistry/pymol/files/pymol-3.0.0-py3.12-progress.patch @@ -0,0 +1,26 @@ +From 11325a6014565700be9673236c9b7b6c856ea6d9 Mon Sep 17 00:00:00 2001 +From: Jarrett Johnson +Date: Wed, 28 Aug 2024 22:07:15 -0400 +Subject: [PATCH] Python 3.12 TypeError: convert progress to int for progress + bar + +--- + modules/pmg_qt/pymol_qt_gui.py | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/modules/pmg_qt/pymol_qt_gui.py b/modules/pmg_qt/pymol_qt_gui.py +index f2d663204..6e935b0d6 100644 +--- a/modules/pmg_qt/pymol_qt_gui.py ++++ b/modules/pmg_qt/pymol_qt_gui.py +@@ -929,9 +929,9 @@ def command_set_cursor(self, i): + return self.lineedit.setCursorPosition(i) + + def update_progress(self): +- progress = self.cmd.get_progress() ++ progress = int(self.cmd.get_progress() * 100) + if progress >= 0: +- self.progressbar.setValue(progress * 100) ++ self.progressbar.setValue(progress) + self.progressbar.show() + self.abortbutton.show() + else: diff --git a/sci-chemistry/pymol/pymol-3.0.0-r1.ebuild b/sci-chemistry/pymol/pymol-3.0.0-r1.ebuild new file mode 100644 index 0000000000000..aeb6bc85c7e1f --- /dev/null +++ b/sci-chemistry/pymol/pymol-3.0.0-r1.ebuild @@ -0,0 +1,123 @@ +# Copyright 1999-2024 Gentoo Authors +# Distributed under the terms of the GNU General Public License v2 + +EAPI=8 + +PYTHON_COMPAT=( python3_{9..12} ) +DISTUTILS_USE_PEP517="setuptools" +DISTUTILS_EXT=1 + +inherit desktop flag-o-matic xdg distutils-r1 + +DESCRIPTION="A Python-extensible molecular graphics system" +HOMEPAGE="https://www.pymol.org/" +SRC_URI="https://github.com/schrodinger/pymol-open-source/archive/v${PV}.tar.gz -> ${P}.tar.gz" + +S="${WORKDIR}"/${PN}-open-source-${PV} + +LICENSE="BitstreamVera BSD freedist HPND OFL-1.0 public-domain UoI-NCSA" #844991 +SLOT="0" +KEYWORDS="~amd64 ~x86 ~amd64-linux ~x86-linux ~x64-macos" +IUSE="+netcdf web" + +DEPEND=" + dev-cpp/msgpack-cxx + dev-libs/mmtf-cpp + dev-python/numpy[${PYTHON_USEDEP}] + sys-libs/zlib + media-libs/freetype:2 + media-libs/glew:0= + media-libs/glm + media-libs/libpng:0= + netcdf? ( sci-libs/netcdf:0= ) +" +BDEPEND="test? ( >=dev-cpp/catch-2:0 )" +RDEPEND=" + ${DEPEND} + media-video/mpeg-tools + dev-python/pyopengl[${PYTHON_USEDEP}] + dev-python/PyQt5[opengl,${PYTHON_USEDEP}] + dev-python/pmw[${PYTHON_USEDEP}] + sci-chemistry/chemical-mime-data +" + +distutils_enable_tests pytest + +# FIXME: We need to still figure out about how to make all the tests pass +# https://bugs.gentoo.org/932127 +RESTRICT="test" + +PATCHES=( + "${FILESDIR}/${P}-distutils-py3.12.patch" + "${FILESDIR}/${P}-SceneGetDrawFlag-indexing.patch" + "${FILESDIR}/${P}-eof-maeffplugin.patch" + "${FILESDIR}/${P}-numpy2.patch" + "${FILESDIR}/${P}-py3.12-progress.patch" + "${FILESDIR}/${P}-lto-molfile-plugin.patch" +) + +python_prepare_all() { + sed \ + -e "s:\"/usr:\"${EPREFIX}/usr:g" \ + -e "/ext_comp_args.*+=/s:\[.*\]$:\[\]:g" \ + -i setup.py || die + + sed \ + -e "s:/opt/local:${EPREFIX}/usr:g" \ + -e '/ext_comp_args/s:\[.*\]:[]:g' \ + -i setup.py || die + sed \ + -e "s:\['msgpackc'\]:\['msgpack'\]:g" \ + -i setup.py || die + + append-cxxflags -std=c++17 + + distutils-r1_python_prepare_all +} + +python_configure_all() { + use !netcdf && DISTUTILS_ARGS=( --no-vmd-plugins ) +} + +python_install() { + distutils-r1_python_install \ + --pymol-path="${EPREFIX}/usr/share/pymol" + + sed \ + -e '1i#!/usr/bin/env python' \ + "${D}/$(python_get_sitedir)"/pymol/__init__.py > "${T}"/${PN} || die + python_doscript "${T}"/${PN} +} + +python_test() { + "${EPYTHON}" -m pymol -ckqy testing/testing.py --offline --no-mmlibs --no-undo --run all || die +} + +python_install_all() { + distutils-r1_python_install_all + + # Move data to correct location + dodir /usr/share/pymol + mv "${D}/$(python_get_sitedir)"/pymol/pymol_path/* "${ED}/usr/share/pymol" || die + + # These environment variables should not go in the wrapper script, or else + # it will be impossible to use the PyMOL libraries from Python. + cat >> "${T}"/20pymol <<- EOF || die + PYMOL_PATH="${EPREFIX}/usr/share/pymol" + PYMOL_DATA="${EPREFIX}/usr/share/pymol/data" + PYMOL_SCRIPTS="${EPREFIX}/usr/share/pymol/scripts" + EOF + + doenvd "${T}"/20pymol + + newicon "${S}"/data/pymol/icons/icon2.svg ${PN}.svg + make_desktop_entry "${PN} %u" PyMol ${PN} \ + "Graphics;Education;Science;Chemistry;" \ + "MimeType=chemical/x-pdb;chemical/pdby;chemical/x-mdl-sdfile;chemical/x-mdl-molfile;chemical/x-mol2;chemical/seq-aa-fasta;chemical/seq-na-fasta;chemical/x-xyz;chemical/x-mdl-sdf;chemical/x-macromodel-input;chemical/x-vmd;" + + if ! use web; then + rm -rf "${D}/$(python_get_sitedir)/web" || die + fi + + rm -f "${ED}"/usr/share/${PN}/LICENSE || die +}