dev-python/pygraphviz: Backport graphviz-14 fixes

Signed-off-by: Michał Górny <mgorny@gentoo.org>
This commit is contained in:
Michał Górny 2025-12-01 04:17:55 +01:00
parent 60548378fd
commit b3ae3157b4
No known key found for this signature in database
GPG Key ID: 8E32347AF4055AE8
2 changed files with 168 additions and 0 deletions

View File

@ -0,0 +1,115 @@
From ad6a9d0eaa0942be7ece6bb253eeea5f7dd2e9e7 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Mat=C4=9Bj=20Cepl?= <mcepl@cepl.eu>
Date: Wed, 22 Oct 2025 19:51:56 +0200
Subject: [PATCH] fix: correct signature of gvRenderData() function
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
For compatibility with graphviz 14.*
Fixes: https://github.com/pygraphviz/pygraphviz/issues/567
Replaces: https://github.com/pygraphviz/pygraphviz/pull/566
Signed-off-by: Matěj Cepl <mcepl@cepl.eu>
--- a/pygraphviz/graphviz.i
+++ b/pygraphviz/graphviz.i
@@ -338,7 +338,12 @@ int gvRenderFilename(GVC_t *gvc, Agraph_t* g, char *format, char *filename);
/* three lines are straight from the SWIG manual. */
%include <cstring.i>
%include <typemaps.i>
+#if GRAPHVIZ_VERSION_MAJOR >= 14
+%cstring_output_allocate_size(char **result, size_t* size, free(*$1));
+int gvRenderData(GVC_t *gvc, Agraph_t* g, char *format, char **result, size_t *size);
+#else
%cstring_output_allocate_size(char **result, unsigned int* size, free(*$1));
int gvRenderData(GVC_t *gvc, Agraph_t* g, char *format, char **result, unsigned int *size);
+#endif
/* Free memory allocated and pointed to by *result in gvRenderData */
extern void gvFreeRenderData (char* data);
--- a/setup.py
+++ b/setup.py
@@ -1,15 +1,72 @@
import sys
+import os
+import re
from setuptools import setup, Extension
+def get_graphviz_version():
+ """
+ Reads GRAPHVIZ_VERSION_MAJOR from the header file.
+ Assumes the header is available at a known path during setup.
+ """
+ # NOTE: You may need to adjust this path based on your environment
+ # or rely on the build system to have already installed it.
+ header_path = '/usr/include/graphviz/graphviz_version.h'
+
+ if not os.path.exists(header_path):
+ # Fallback/default if header file cannot be read during setup.
+ # This should match your expected target version.
+ raise RuntimeError(f"Graphviz header file not found at {header_path}.")
+
+ with open(header_path, 'r') as f:
+ content = f.read()
+ match = re.search(r'#define\s+GRAPHVIZ_VERSION_MAJOR\s+(\d+)', content)
+ if match:
+ return int(match.group(1))
+ else:
+ match = re.search(r'#define\s+PACKAGE_VERSION\s+"([0-9.]+)"', content)
+ if match:
+ maj_ver = match.group(1).split('.')[0]
+ return int(maj_ver)
+
+ raise RuntimeError(f"GRAPHVIZ_VERSION_MAJOR macro not found in the header file!")
+
if __name__ == "__main__":
- define_macros = [("SWIG_PYTHON_STRICT_BYTE_CHAR", None)]
- if sys.platform == "win32":
+ WINDOWS = sys.platform == "win32"
+
+ # Get the target version number
+ gv_major_version = get_graphviz_version()
+
+ define_macros = []
+ swig_options = []
+
+ if WINDOWS:
define_macros.append(("GVDLL", None))
+ swig_options.append("-DGRAPHVIZ_VERSION_MAJOR={}".format(str(gv_major_version)))
+ print(f"Defining GRAPHVIZ_VERSION_MAJOR as: {gv_major_version}")
+
+ # List of search paths for where graphviz libs may be installed.
+ # The graphviz library subdir contains the plugin libraries (e.g.
+ # gvplugin_*). The main graphviz libs (cgraph etc.) are in the
+ # parent dir
+ library_search_paths = [
+ "/usr/lib/x86_64-linux-gnu", # Ubuntu x86_64
+ "/usr/lib/x86_64-linux-gnu/graphviz",
+ "/opt/homebrew/lib", # Macos, homebrew aarch64
+ "/opt/homebrew/lib/graphviz",
+ "/usr/lib64", # Fedora
+ "/usr/lib64/graphviz",
+ "/usr/local/lib", # source install / macos homebrew x86_64
+ "/usr/local/lib/graphviz",
+ ]
+
+ # runtime_library_dirs must not be defined with windows else setup will fail
+ extra_kwargs = {} if WINDOWS else {"runtime_library_dirs": library_search_paths}
+
extension = [
Extension(
name="pygraphviz._graphviz",
- sources=["pygraphviz/graphviz_wrap.c"],
+ sources=["pygraphviz/graphviz.i"],
include_dirs=[],
library_dirs=[],
# cdt does not link to cgraph, whereas cgraph links to cdt.
@@ -20,6 +77,8 @@ if __name__ == "__main__":
# undefined symbol errors. seen under PyPy on Linux.)
libraries=["cdt", "cgraph", "gvc"],
define_macros=define_macros,
+ swig_opts=swig_options,
+ **extra_kwargs,
)
]

View File

@ -0,0 +1,53 @@
# Copyright 1999-2025 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2
EAPI=8
DISTUTILS_EXT=1
DISTUTILS_USE_PEP517=setuptools
PYTHON_COMPAT=( python3_{11..14} )
inherit distutils-r1 pypi
DESCRIPTION="Python wrapper for the Graphviz Agraph data structure"
HOMEPAGE="
https://pygraphviz.github.io/
https://github.com/pygraphviz/pygraphviz/
https://pypi.org/project/pygraphviz/
"
LICENSE="BSD"
SLOT="0"
KEYWORDS="~amd64 ~arm ~arm64 ~ppc64 ~riscv ~x86 ~x86-linux ~ppc-macos ~x64-macos"
# Note: only C API of graphviz is used, PYTHON_USEDEP unnecessary.
DEPEND="
media-gfx/graphviz:=
"
RDEPEND="
${DEPEND}
"
BDEPEND="
dev-lang/swig:0
"
EPYTEST_PLUGINS=()
distutils_enable_tests pytest
PATCHES=(
# https://github.com/pygraphviz/pygraphviz/pull/573
# (includes some setup.py changes from main due to rebase)
"${FILESDIR}"/pygraphviz-1.14-graphviz-14.patch
)
python_test() {
rm -rf pygraphviz || die
epytest --pyargs pygraphviz
}
python_install_all() {
dodoc -r examples
docompress -x /usr/share/doc/${PF}/examples
distutils-r1_python_install_all
}