Index: twisted/python/dist.py
===================================================================
--- twisted/python/dist.py	(revision 31665)
+++ twisted/python/dist.py	(working copy)
@@ -7,10 +7,11 @@
 """
 
 import sys, os
+from distutils.command import build
 from distutils.command import build_scripts, install_data, build_ext, build_py
 from distutils.errors import CompileError
 from distutils import core
-from distutils.core import Extension
+from distutils.core import Extension, Distribution
 
 twisted_subprojects = ["conch", "lore", "mail", "names",
                        "news", "pair", "runner", "web",
@@ -76,6 +77,7 @@
     if 'cmdclass' not in kw:
         kw['cmdclass'] = {
             'install_data': install_data_twisted,
+            'build': build_twisted,
             'build_scripts': build_scripts_twisted}
         if sys.version_info[:3] < (2, 3, 0):
             kw['cmdclass']['build_py'] = build_py_twisted
@@ -253,6 +255,12 @@
 
 ## Helpers and distutil tweaks
 
+# Global --no-speedups option to install Twisted without extensions - #3586
+
+Distribution.global_options.append(('no-speedups', None, 'skip C extensions'))
+Distribution.no_speedups = 0
+
+
 class build_py_twisted(build_py.build_py):
     """
     Changes behavior in Python 2.2 to support simultaneous specification of
@@ -301,6 +309,13 @@
     Allow subclasses to easily detect and customize Extensions to
     build at install-time.
     """
+    def finalize_options(self):
+        """
+        Clean extension list if global --no-speedups option is set.
+        """
+        build_ext.build_ext.finalize_options(self)
+        if self.distribution.no_speedups:
+            self.extensions = []
 
     def prepare_extensions(self):
         """
