Hi,

based on a problem description by Arc Riley, here's a simple patch that adds
dependency support to Cython's build_ext implementation (distutils).

It allows you to simply add all .pxd and .pxi files that your .pyx depends on
to the list of module sources, and have Cython rebuild your module when the
dependencies are updated.

It does, however, not deal with the case of multiple .pyx files with separate
dependencies that build a single module. But that could be added through a
convention in the source order.

Stefan
# HG changeset patch
# User Stefan Behnel <[EMAIL PROTECTED]>
# Date 1205487293 -3600
# Node ID 1abce3b0dd95220bb0b9b6a86dbe891c5923cc9c
# Parent  d49c041d08535698109742a2cc4fe9e78eede234
support adding pxd/pxi dependencies to Extension sources and force rebuild on dependency updates

diff -r d49c041d0853 -r 1abce3b0dd95 Distutils/build_ext.py
--- a/Distutils/build_ext.py	Sun Mar 09 00:40:34 2008 -0800
+++ b/Distutils/build_ext.py	Fri Mar 14 10:34:53 2008 +0100
@@ -155,6 +155,7 @@ class build_ext(_build_ext.build_ext):
         else:
             target_dir = None
 
+        newest_dependency = None
         for source in sources:
             (base, ext) = os.path.splitext(os.path.basename(source))
             if ext == ".pyx":			  # Cython source file
@@ -162,6 +163,10 @@ class build_ext(_build_ext.build_ext):
                 new_sources.append(os.path.join(output_dir, base + target_ext))
                 pyrex_sources.append(source)
                 pyrex_targets[source] = new_sources[-1]
+            elif ext == '.pxi' or ext == '.pxd':
+                if newest_dependency is None \
+                        or newer(source, newest_dependency):
+                    newest_dependency = source
             else:
                 new_sources.append(source)
 
@@ -172,7 +177,10 @@ class build_ext(_build_ext.build_ext):
 
         for source in pyrex_sources:
             target = pyrex_targets[source]
-            if self.force or newer(source, target):
+            rebuild = self.force or newer(source, target)
+            if not rebuild and newest_dependency is not None:
+                rebuild = newer(newest_dependency, target)
+            if rebuild:
                 log.info("cythoning %s to %s", source, target)
                 self.mkpath(os.path.dirname(target))
                 options = CompilationOptions(pyrex_default_options, 
_______________________________________________
Cython-dev mailing list
[email protected]
http://codespeak.net/mailman/listinfo/cython-dev

Reply via email to