1 """distutils.command.build 2 3 Implements the Distutils 'build' command.""" 4 5 __revision__ = "$Id$" 6 7 import sys, os 8 9 from distutils.util import get_platform 10 from distutils.core import Command 11 from distutils.errors import DistutilsOptionError 12 13 def show_compilers(): 14 from distutils.ccompiler import show_compilers 15 show_compilers() 16 17 class build(Command): 18 19 description = "build everything needed to install" 20 21 user_options = [ 22 ('build-base=', 'b', 23 "base directory for build library"), 24 ('build-purelib=', None, 25 "build directory for platform-neutral distributions"), 26 ('build-platlib=', None, 27 "build directory for platform-specific distributions"), 28 ('build-lib=', None, 29 "build directory for all distribution (defaults to either " + 30 "build-purelib or build-platlib"), 31 ('build-scripts=', None, 32 "build directory for scripts"), 33 ('build-temp=', 't', 34 "temporary build directory"), 35 ('plat-name=', 'p', 36 "platform name to build for, if supported " 37 "(default: %s)" % get_platform()), 38 ('compiler=', 'c', 39 "specify the compiler type"), 40 ('debug', 'g', 41 "compile extensions and libraries with debugging information"), 42 ('force', 'f', 43 "forcibly build everything (ignore file timestamps)"), 44 ('executable=', 'e', 45 "specify final destination interpreter path (build.py)"), 46 ] 47 48 boolean_options = ['debug', 'force'] 49 50 help_options = [ 51 ('help-compiler', None, 52 "list available compilers", show_compilers), 53 ] 54 55 def initialize_options(self): 56 self.build_base = 'build' 57 # these are decided only after 'build_base' has its final value 58 # (unless overridden by the user or client) 59 self.build_purelib = None 60 self.build_platlib = None 61 self.build_lib = None 62 self.build_temp = None 63 self.build_scripts = None 64 self.compiler = None 65 self.plat_name = None 66 self.debug = None 67 self.force = 0 68 self.executable = None 69 70 def finalize_options(self): 71 if self.plat_name is None: 72 self.plat_name = get_platform() 73 else: 74 # plat-name only supported for windows (other platforms are 75 # supported via ./configure flags, if at all). Avoid misleading 76 # other platforms. 77 if os.name != 'nt': 78 raise DistutilsOptionError( 79 "--plat-name only supported on Windows (try " 80 "using './configure --help' on your platform)") 81 82 plat_specifier = ".%s-%s" % (self.plat_name, sys.version[0:3]) 83 84 # Make it so Python 2.x and Python 2.x with --with-pydebug don't 85 # share the same build directories. Doing so confuses the build 86 # process for C modules 87 if hasattr(sys, 'gettotalrefcount'): 88 plat_specifier += '-pydebug' 89 90 # 'build_purelib' and 'build_platlib' just default to 'lib' and 91 # 'lib.<plat>' under the base build directory. We only use one of 92 # them for a given distribution, though -- 93 if self.build_purelib is None: 94 self.build_purelib = os.path.join(self.build_base, 'lib') 95 if self.build_platlib is None: 96 self.build_platlib = os.path.join(self.build_base, 97 'lib' + plat_specifier) 98 99 # 'build_lib' is the actual directory that we will use for this 100 # particular module distribution -- if user didn't supply it, pick 101 # one of 'build_purelib' or 'build_platlib'. 102 if self.build_lib is None: 103 if self.distribution.ext_modules: 104 self.build_lib = self.build_platlib 105 else: 106 self.build_lib = self.build_purelib 107 108 # 'build_temp' -- temporary directory for compiler turds, 109 # "build/temp.<plat>" 110 if self.build_temp is None: 111 self.build_temp = os.path.join(self.build_base, 112 'temp' + plat_specifier) 113 if self.build_scripts is None: 114 self.build_scripts = os.path.join(self.build_base, 115 'scripts-' + sys.version[0:3]) 116 117 if self.executable is None: 118 self.executable = os.path.normpath(sys.executable) 119 120 def run(self): 121 # Run all relevant sub-commands. This will be some subset of: 122 # - build_py - pure Python modules 123 # - build_clib - standalone C libraries 124 # - build_ext - Python extensions 125 # - build_scripts - (Python) scripts 126 for cmd_name in self.get_sub_commands(): 127 self.run_command(cmd_name) 128 129 # -- Predicates for the sub-command list --------------------------- 130 131 def has_pure_modules (self): 132 return self.distribution.has_pure_modules() 133 134 def has_c_libraries (self): 135 return self.distribution.has_c_libraries() 136 137 def has_ext_modules (self): 138 return self.distribution.has_ext_modules() 139 140 def has_scripts (self): 141 return self.distribution.has_scripts() 142 143 sub_commands = [('build_py', has_pure_modules), 144 ('build_clib', has_c_libraries), 145 ('build_ext', has_ext_modules), 146 ('build_scripts', has_scripts), 147 ] 148