On Wed, May 20, 2026 at 09:50:50AM +0200, Theo Buehler wrote:
> Another incompatible pointer type error:
> 
> pygraphviz/graphviz_wrap.c:5480:50: error: incompatible pointer types passing 
> 'unsigned int *' to parameter of type 'size_t *' (aka 'unsigned long *') 
> [-Wincompatible-pointer-types]
>  5480 |   result = (int)gvRenderData(arg1,arg2,arg3,arg4,arg5);
>       |                                                  ^~~~
> 
> Fix is to pull in swig, fix the .i and to regenerate the .c file.
> The patch in
> 
> https://github.com/pygraphviz/pygraphviz/pull/573
> 
> doesn't apply to 1.14, so I hacked around until it worked.
> 
> Builds & passes regress on -current and with llvm22.

This now actually packages (removed the rm wrap_graphviz.c)

Index: Makefile
===================================================================
RCS file: /cvs/ports/math/py-pygraphviz/Makefile,v
diff -u -p -r1.2 Makefile
--- Makefile    17 Jun 2025 18:14:24 -0000      1.2
+++ Makefile    20 May 2026 09:20:50 -0000
@@ -4,7 +4,7 @@ MODPY_DISTV =   1.14
 DISTNAME =     pygraphviz-${MODPY_DISTV}
 PKGNAME =      py-${DISTNAME}
 CATEGORIES =   math
-REVISION =     0
+REVISION =     1
 
 HOMEPAGE =     https://pygraphviz.github.io/
 
@@ -19,9 +19,14 @@ MODPY_PI =   Yes
 MODPY_PYBUILD =        setuptools
 MODPY_TEST_LINK_SO =   Yes
 
+BUILD_DEPENDS += devel/swig
+
 LIB_DEPENDS += math/graphviz
 
 CFLAGS +=      -I${LOCALBASE}/include
 LDFLAGS +=     -L${LOCALBASE}/lib
+
+post-patch:
+       ${SUBST_CMD} ${WRKSRC}/setup.py
 
 .include <bsd.port.mk>
Index: patches/patch-pygraphviz_graphviz_i
===================================================================
RCS file: patches/patch-pygraphviz_graphviz_i
diff -N patches/patch-pygraphviz_graphviz_i
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ patches/patch-pygraphviz_graphviz_i 20 May 2026 09:22:43 -0000
@@ -0,0 +1,18 @@
+https://github.com/pygraphviz/pygraphviz/pull/573/
+
+Index: pygraphviz/graphviz.i
+--- pygraphviz/graphviz.i.orig
++++ pygraphviz/graphviz.i
+@@ -338,7 +338,12 @@ int gvRenderFilename(GVC_t *gvc, Agraph_t* g, char *fo
+ /* 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);
Index: patches/patch-setup_py
===================================================================
RCS file: patches/patch-setup_py
diff -N patches/patch-setup_py
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ patches/patch-setup_py      20 May 2026 09:22:43 -0000
@@ -0,0 +1,70 @@
+https://github.com/pygraphviz/pygraphviz/pull/573
+
+Index: setup.py
+--- setup.py.orig
++++ setup.py
+@@ -1,15 +1,55 @@
+ 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 = '${LOCALBASE}/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 str(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 str(int(maj_ver))
++
++    raise RuntimeError(
++            "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":
+         define_macros.append(("GVDLL", None))
+ 
++    # Get the target version number
++    gv_major_version = get_graphviz_version()
++
++    define_macros = []
++    swig_options = []
++
++    
swig_options.append("-DGRAPHVIZ_VERSION_MAJOR={}".format(gv_major_version))
++    print(f"Defining GRAPHVIZ_VERSION_MAJOR as: {gv_major_version}")
++
+     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 +60,7 @@ if __name__ == "__main__":
+             # undefined symbol errors. seen under PyPy on Linux.)
+             libraries=["cdt", "cgraph", "gvc"],
+             define_macros=define_macros,
++            swig_opts=swig_options,
+         )
+     ]
+ 

Reply via email to