setup: ignore failures to build optional inotify extension stable
authorChristian Boos <cboos@neuf.fr>
Wed, 23 Jun 2010 13:44:07 +0200
branchstable
changeset 11468 1c1126b1d919
parent 11467 6b836d5c8c9e
child 11469 c37f35d7f2f5
setup: ignore failures to build optional inotify extension
setup.py
--- a/setup.py	Wed Jun 30 17:44:36 2010 -0500
+++ b/setup.py	Wed Jun 23 13:44:07 2010 +0200
@@ -35,12 +35,15 @@
 import os, subprocess, time
 import shutil
 import tempfile
+from distutils import log
 from distutils.core import setup, Extension
 from distutils.dist import Distribution
 from distutils.command.build import build
+from distutils.command.build_ext import build_ext
 from distutils.command.build_py import build_py
 from distutils.spawn import spawn, find_executable
 from distutils.ccompiler import new_compiler
+from distutils.errors import CCompilerError
 
 scripts = ['hg']
 if os.name == 'nt':
@@ -209,6 +212,17 @@
 Distribution.global_options.append(('pure', None, "use pure (slow) Python "
                                     "code instead of C extensions"))
 
+class hgbuildext(build_ext):
+
+    def build_extension(self, ext):
+        try:
+            build_ext.build_extension(self, ext)
+        except CCompilerError:
+            if not hasattr(ext, 'optional') or not ext.optional:
+                raise
+            log.warn("Failed to build optional extension '%s' (skipping)",
+                     ext.name)
+
 class hgbuildpy(build_py):
 
     def finalize_options(self):
@@ -232,6 +246,7 @@
                 yield module
 
 cmdclass = {'build_mo': hgbuildmo,
+            'build_ext': hgbuildext,
             'build_py': hgbuildpy}
 
 packages = ['mercurial', 'mercurial.hgweb', 'hgext', 'hgext.convert',
@@ -256,10 +271,13 @@
 if sys.platform == 'linux2' and os.uname()[2] > '2.6':
     # The inotify extension is only usable with Linux 2.6 kernels.
     # You also need a reasonably recent C library.
+    # In any case, if it fails to build the error will be skipped ('optional').
     cc = new_compiler()
     if hasfunction(cc, 'inotify_add_watch'):
-        extmodules.append(Extension('hgext.inotify.linux._inotify',
-                                     ['hgext/inotify/linux/_inotify.c']))
+        inotify = Extension('hgext.inotify.linux._inotify',
+                            ['hgext/inotify/linux/_inotify.c'])
+        inotify.optional = True
+        extmodules.append(inotify)
         packages.extend(['hgext.inotify', 'hgext.inotify.linux'])
 
 packagedata = {'mercurial': ['locale/*/LC_MESSAGES/hg.mo',