183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh"""distutils.command.build 283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew HsiehImplements the Distutils 'build' command.""" 483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh__revision__ = "$Id$" 683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehimport sys, os 883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehfrom distutils.util import get_platform 1083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehfrom distutils.core import Command 1183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehfrom distutils.errors import DistutilsOptionError 1283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 1383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehdef show_compilers(): 1483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh from distutils.ccompiler import show_compilers 1583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh show_compilers() 1683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 1783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehclass build(Command): 1883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 1983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh description = "build everything needed to install" 2083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 2183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh user_options = [ 2283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh ('build-base=', 'b', 2383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh "base directory for build library"), 2483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh ('build-purelib=', None, 2583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh "build directory for platform-neutral distributions"), 2683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh ('build-platlib=', None, 2783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh "build directory for platform-specific distributions"), 2883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh ('build-lib=', None, 2983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh "build directory for all distribution (defaults to either " + 3083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh "build-purelib or build-platlib"), 3183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh ('build-scripts=', None, 3283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh "build directory for scripts"), 3383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh ('build-temp=', 't', 3483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh "temporary build directory"), 3583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh ('plat-name=', 'p', 3683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh "platform name to build for, if supported " 3783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh "(default: %s)" % get_platform()), 3883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh ('compiler=', 'c', 3983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh "specify the compiler type"), 4083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh ('debug', 'g', 4183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh "compile extensions and libraries with debugging information"), 4283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh ('force', 'f', 4383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh "forcibly build everything (ignore file timestamps)"), 4483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh ('executable=', 'e', 4583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh "specify final destination interpreter path (build.py)"), 4683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh ] 4783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 4883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh boolean_options = ['debug', 'force'] 4983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 5083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh help_options = [ 5183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh ('help-compiler', None, 5283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh "list available compilers", show_compilers), 5383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh ] 5483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 5583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def initialize_options(self): 5683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self.build_base = 'build' 5783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # these are decided only after 'build_base' has its final value 5883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # (unless overridden by the user or client) 5983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self.build_purelib = None 6083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self.build_platlib = None 6183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self.build_lib = None 6283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self.build_temp = None 6383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self.build_scripts = None 6483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self.compiler = None 6583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self.plat_name = None 6683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self.debug = None 6783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self.force = 0 6883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self.executable = None 6983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 7083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def finalize_options(self): 7183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if self.plat_name is None: 7283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self.plat_name = get_platform() 7383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh else: 7483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # plat-name only supported for windows (other platforms are 7583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # supported via ./configure flags, if at all). Avoid misleading 7683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # other platforms. 7783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if os.name != 'nt': 7883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise DistutilsOptionError( 7983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh "--plat-name only supported on Windows (try " 8083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh "using './configure --help' on your platform)") 8183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 8283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh plat_specifier = ".%s-%s" % (self.plat_name, sys.version[0:3]) 8383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 8483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # Make it so Python 2.x and Python 2.x with --with-pydebug don't 8583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # share the same build directories. Doing so confuses the build 8683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # process for C modules 8783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if hasattr(sys, 'gettotalrefcount'): 8883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh plat_specifier += '-pydebug' 8983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 9083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # 'build_purelib' and 'build_platlib' just default to 'lib' and 9183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # 'lib.<plat>' under the base build directory. We only use one of 9283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # them for a given distribution, though -- 9383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if self.build_purelib is None: 9483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self.build_purelib = os.path.join(self.build_base, 'lib') 9583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if self.build_platlib is None: 9683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self.build_platlib = os.path.join(self.build_base, 9783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 'lib' + plat_specifier) 9883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 9983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # 'build_lib' is the actual directory that we will use for this 10083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # particular module distribution -- if user didn't supply it, pick 10183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # one of 'build_purelib' or 'build_platlib'. 10283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if self.build_lib is None: 10383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if self.distribution.ext_modules: 10483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self.build_lib = self.build_platlib 10583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh else: 10683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self.build_lib = self.build_purelib 10783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 10883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # 'build_temp' -- temporary directory for compiler turds, 10983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # "build/temp.<plat>" 11083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if self.build_temp is None: 11183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self.build_temp = os.path.join(self.build_base, 11283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 'temp' + plat_specifier) 11383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if self.build_scripts is None: 11483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self.build_scripts = os.path.join(self.build_base, 11583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 'scripts-' + sys.version[0:3]) 11683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 11783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if self.executable is None: 11883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self.executable = os.path.normpath(sys.executable) 11983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 12083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def run(self): 12183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # Run all relevant sub-commands. This will be some subset of: 12283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # - build_py - pure Python modules 12383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # - build_clib - standalone C libraries 12483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # - build_ext - Python extensions 12583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # - build_scripts - (Python) scripts 12683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh for cmd_name in self.get_sub_commands(): 12783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self.run_command(cmd_name) 12883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 12983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # -- Predicates for the sub-command list --------------------------- 13083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 13183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def has_pure_modules (self): 13283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return self.distribution.has_pure_modules() 13383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 13483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def has_c_libraries (self): 13583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return self.distribution.has_c_libraries() 13683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 13783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def has_ext_modules (self): 13883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return self.distribution.has_ext_modules() 13983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 14083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def has_scripts (self): 14183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return self.distribution.has_scripts() 14283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 14383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh sub_commands = [('build_py', has_pure_modules), 14483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh ('build_clib', has_c_libraries), 14583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh ('build_ext', has_ext_modules), 14683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh ('build_scripts', has_scripts), 14783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh ] 148