Hi,
many GNU/Linux distributions discourage to bundle other software like matplotlib
does with PyCXX.
It is understandable you may not want additionally support each new version
of the bundled software.
But you should give the distribution package maintainers an easy way to use
the version available in the system should they wish to do so.

With the current build system this is not possible without rather large 
modifications.
To allow maintainers to use the system files the bundled CXX must be moved from 
the
matplotlib root to a subfolder, e.g. CXX -> external/CXX, so gcc will not 
unintentionally use the bundled headers.

Attached patch makes use of this move and modifies setupext.py to search for 
the PyCXX
sources in a list of possible folder pairs. The first folder where files are 
found is chosen.
The found sources and include path have been added to all CXX uses I found.

To prefer the system installed version put the paths to the front of the lists 
and
it will fall back to the bundled version if they are unavailable.
E.g. for debian:
_pycxx_src_paths = ["/usr/share/python{0}.{1}/".format(*sys.version_info[:2]), 
"external/"]
_pycxx_h_paths = ["/usr/include/python{0}.{1}/".format(*sys.version_info[:2]), 
"external/"]


Btw, I also saw you patched CXX for sparc
http://sourceforge.net/tracker/?func=detail&aid=3022815&group_id=80706&atid=560720
has this bug and patch been forwarded to pycxx?
It is not been applied to trunk yet, was it rejected?

PS: please CC me I'm not subscribed to the list.

Best Regards,
Julian Taylor

Index: setupext.py
===================================================================
--- setupext.py	(revision 8988)
+++ setupext.py	(working copy)
@@ -136,6 +136,21 @@
         ('PY_ARRAY_UNIQUE_SYMBOL', 'MPL_ARRAY_API'),
         ('PYCXX_ISO_CPP_LIB', '1')]
 
+# list of search paths for the CXX headers and sources
+# first folder where the files are found sets
+# pycxx_inc_path, pycxx_sources and pycxx_headers
+_pycxx_src_paths = ["external/"]
+_pycxx_h_paths = ["external/"]
+for s, h in zip(_pycxx_src_paths, _pycxx_h_paths):
+  if os.path.isdir(h) and os.path.isdir(s):
+    pycxx_sources = glob.glob(os.path.join(s, "CXX", "*.c"))
+    pycxx_sources.extend(glob.glob(os.path.join(s, "CXX", "*.cxx")))
+    pycxx_headers = glob.glob(os.path.join(h, "CXX", "*.h"))
+    pycxx_headers.extend(glob.glob(os.path.join(h, "CXX", "*.hxx")))
+    if len(pycxx_sources) > 0 and len(pycxx_headers) > 0:
+      pycxx_inc_path = h
+      break
+
 setup_cfg = os.environ.get('MPLSETUPCFG', 'setup.cfg')
 # Based on the contents of setup.cfg, determine the build options
 if os.path.exists(setup_cfg):
@@ -1038,11 +1053,10 @@
     global BUILT_FT2FONT
     if BUILT_FT2FONT: return # only build it if you you haven't already
     deps = ['src/ft2font.cpp', 'src/mplutils.cpp']
-    deps.extend(glob.glob('CXX/*.cxx'))
-    deps.extend(glob.glob('CXX/*.c'))
+    deps.extend(pycxx_sources)
 
     module = Extension('matplotlib.ft2font', deps,
-                       define_macros=defines)
+                       define_macros=defines, include_dirs=[pycxx_inc_path])
     add_ft2font_flags(module)
     ext_modules.append(module)
     BUILT_FT2FONT = True
@@ -1065,12 +1079,12 @@
     global BUILT_GTKAGG
     if BUILT_GTKAGG: return # only build it if you you haven't already
     deps = ['src/agg_py_transforms.cpp', 'src/_gtkagg.cpp', 'src/mplutils.cpp']
-    deps.extend(glob.glob('CXX/*.cxx'))
-    deps.extend(glob.glob('CXX/*.c'))
+    deps.extend(pycxx_sources)
 
     module = Extension('matplotlib.backends._gtkagg',
                        deps,
-                       define_macros=defines
+                       define_macros=defines,
+                       include_dirs=[pycxx_inc_path]
                        )
 
     # add agg flags before pygtk because agg only supports freetype1
@@ -1088,12 +1102,12 @@
     global BUILT_TKAGG
     if BUILT_TKAGG: return # only build it if you you haven't already
     deps = ['src/agg_py_transforms.cpp', 'src/_tkagg.cpp']
-    deps.extend(glob.glob('CXX/*.cxx'))
-    deps.extend(glob.glob('CXX/*.c'))
+    deps.extend(pycxx_sources)
 
     module = Extension('matplotlib.backends._tkagg',
                        deps,
-                       define_macros=defines
+                       define_macros=defines,
+                       include_dirs=[pycxx_inc_path]
                        )
 
     add_tk_flags(module) # do this first
@@ -1108,16 +1122,14 @@
     global BUILT_MACOSX
     if BUILT_MACOSX: return # only build it if you you haven't already
     deps = ['src/_macosx.m',
-            'CXX/cxx_extensions.cxx',
-            'CXX/cxxextensions.c',
-            'CXX/cxxsupport.cxx',
-            'CXX/IndirectPythonInterface.cxx',
             'src/agg_py_transforms.cpp',
             'src/path_cleanup.cpp']
+    deps.extend(pycxx_sources)
     module = Extension('matplotlib.backends._macosx',
                        deps,
                        extra_link_args = ['-framework','Cocoa'],
-                       define_macros=defines
+                       define_macros=defines,
+                       include_dirs=[pycxx_inc_path]
                       )
     add_numpy_flags(module)
     add_agg_flags(module)
@@ -1129,13 +1141,12 @@
     if BUILT_PNG: return # only build it if you you haven't already
 
     deps = ['src/_png.cpp', 'src/mplutils.cpp']
-    deps.extend(glob.glob('CXX/*.cxx'))
-    deps.extend(glob.glob('CXX/*.c'))
+    deps.extend(pycxx_sources)
 
     module = Extension(
         'matplotlib._png',
         deps,
-        include_dirs=numpy_inc_dirs,
+        include_dirs=numpy_inc_dirs + [pycxx_inc_path],
         define_macros=defines
         )
 
@@ -1160,14 +1171,13 @@
 
     deps = ['%s/src/%s'%(AGG_VERSION, name) for name in agg]
     deps.extend(['src/mplutils.cpp', 'src/agg_py_transforms.cpp'])
-    deps.extend(glob.glob('CXX/*.cxx'))
-    deps.extend(glob.glob('CXX/*.c'))
+    deps.extend(pycxx_sources)
     temp_copy('src/_backend_agg.cpp', 'src/backend_agg.cpp')
     deps.append('src/backend_agg.cpp')
     module = Extension(
         'matplotlib.backends._backend_agg',
         deps,
-        include_dirs=numpy_inc_dirs,
+        include_dirs=numpy_inc_dirs + [pycxx_inc_path],
         define_macros=defines
         )
 
@@ -1190,8 +1200,7 @@
            )
 
     deps = ['%s/src/%s'%(AGG_VERSION, name) for name in agg]
-    deps.extend(glob.glob('CXX/*.cxx'))
-    deps.extend(glob.glob('CXX/*.c'))
+    deps.extend(pycxx_sources)
 
     temp_copy('src/_path.cpp', 'src/path.cpp')
     deps.extend(['src/agg_py_transforms.cpp',
@@ -1200,7 +1209,7 @@
     module = Extension(
         'matplotlib._path',
         deps,
-        include_dirs=numpy_inc_dirs,
+        include_dirs=numpy_inc_dirs + [pycxx_inc_path],
         define_macros=defines
         )
 
@@ -1223,13 +1232,12 @@
     temp_copy('src/_image.cpp', 'src/image.cpp')
     deps = ['src/image.cpp', 'src/mplutils.cpp']
     deps.extend(['%s/src/%s'%(AGG_VERSION,name) for name in agg])
-    deps.extend(glob.glob('CXX/*.cxx'))
-    deps.extend(glob.glob('CXX/*.c'))
+    deps.extend(pycxx_sources)
 
     module = Extension(
         'matplotlib._image',
         deps,
-        include_dirs=numpy_inc_dirs,
+        include_dirs=numpy_inc_dirs + [pycxx_inc_path],
         define_macros=defines
         )
 
@@ -1319,11 +1327,10 @@
     if BUILT_TRI: return # only build it if you you haven't already
 
     deps = ['lib/matplotlib/tri/_tri.cpp', 'src/mplutils.cpp']
-    deps.extend(glob.glob('CXX/*.cxx'))
-    deps.extend(glob.glob('CXX/*.c'))
+    deps.extend(pycxx_sources)
 
     module = Extension('matplotlib._tri', deps,
-                       define_macros=defines)
+                       define_macros=defines, include_dirs=[pycxx_inc_path])
     add_numpy_flags(module)
     add_base_flags(module)
     ext_modules.append(module)

Attachment: signature.asc
Description: OpenPGP digital signature

------------------------------------------------------------------------------
WhatsUp Gold - Download Free Network Management Software
The most intuitive, comprehensive, and cost-effective network 
management toolset available today.  Delivers lowest initial 
acquisition cost and overall TCO of any competing solution.
http://p.sf.net/sfu/whatsupgold-sd
_______________________________________________
Matplotlib-devel mailing list
Matplotlib-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-devel

Reply via email to