Greg Ward | 13ae1c8 | 1999-03-22 14:55:25 +0000 | [diff] [blame] | 1 | """distutils.command.build |
| 2 | |
| 3 | Implements the Distutils 'build' command.""" |
| 4 | |
Greg Ward | 3ce77fd | 2000-03-02 01:49:45 +0000 | [diff] [blame] | 5 | __revision__ = "$Id$" |
Greg Ward | 13ae1c8 | 1999-03-22 14:55:25 +0000 | [diff] [blame] | 6 | |
Greg Ward | 42a3bf5 | 2000-03-01 01:26:45 +0000 | [diff] [blame] | 7 | import sys, os |
Tarek Ziadé | edacea3 | 2010-01-29 11:41:03 +0000 | [diff] [blame] | 8 | |
Tarek Ziadé | 8b441d0 | 2010-01-29 11:46:31 +0000 | [diff] [blame] | 9 | from distutils.util import get_platform |
Greg Ward | 13ae1c8 | 1999-03-22 14:55:25 +0000 | [diff] [blame] | 10 | from distutils.core import Command |
Christian Heimes | 5e69685 | 2008-04-09 08:37:03 +0000 | [diff] [blame] | 11 | from distutils.errors import DistutilsOptionError |
Greg Ward | 3459381 | 2000-06-24 01:23:37 +0000 | [diff] [blame] | 12 | |
Collin Winter | 5b7e9d7 | 2007-08-30 03:52:21 +0000 | [diff] [blame] | 13 | def show_compilers(): |
Greg Ward | 3459381 | 2000-06-24 01:23:37 +0000 | [diff] [blame] | 14 | from distutils.ccompiler import show_compilers |
| 15 | show_compilers() |
| 16 | |
Collin Winter | 5b7e9d7 | 2007-08-30 03:52:21 +0000 | [diff] [blame] | 17 | class build(Command): |
Greg Ward | 13ae1c8 | 1999-03-22 14:55:25 +0000 | [diff] [blame] | 18 | |
Greg Ward | 37bc815 | 2000-01-30 18:34:15 +0000 | [diff] [blame] | 19 | description = "build everything needed to install" |
| 20 | |
Greg Ward | bbeceea | 2000-02-18 00:25:39 +0000 | [diff] [blame] | 21 | user_options = [ |
| 22 | ('build-base=', 'b', |
| 23 | "base directory for build library"), |
Greg Ward | 42a3bf5 | 2000-03-01 01:26:45 +0000 | [diff] [blame] | 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"), |
Greg Ward | 8d5881a | 2000-05-25 01:19:18 +0000 | [diff] [blame] | 31 | ('build-scripts=', None, |
| 32 | "build directory for scripts"), |
Greg Ward | 42a3bf5 | 2000-03-01 01:26:45 +0000 | [diff] [blame] | 33 | ('build-temp=', 't', |
| 34 | "temporary build directory"), |
Christian Heimes | 5e69685 | 2008-04-09 08:37:03 +0000 | [diff] [blame] | 35 | ('plat-name=', 'p', |
| 36 | "platform name to build for, if supported " |
| 37 | "(default: %s)" % get_platform()), |
Gregory P. Smith | 9668b78 | 2000-05-12 00:33:14 +0000 | [diff] [blame] | 38 | ('compiler=', 'c', |
| 39 | "specify the compiler type"), |
Greg Ward | bbeceea | 2000-02-18 00:25:39 +0000 | [diff] [blame] | 40 | ('debug', 'g', |
| 41 | "compile extensions and libraries with debugging information"), |
Greg Ward | c41d6b3 | 2000-04-10 00:19:42 +0000 | [diff] [blame] | 42 | ('force', 'f', |
Gregory P. Smith | 9668b78 | 2000-05-12 00:33:14 +0000 | [diff] [blame] | 43 | "forcibly build everything (ignore file timestamps)"), |
Martin v. Löwis | 9f5c0c4 | 2004-08-25 11:37:43 +0000 | [diff] [blame] | 44 | ('executable=', 'e', |
| 45 | "specify final destination interpreter path (build.py)"), |
Greg Ward | bbeceea | 2000-02-18 00:25:39 +0000 | [diff] [blame] | 46 | ] |
Greg Ward | 2ff7887 | 2000-06-24 00:23:20 +0000 | [diff] [blame] | 47 | |
Greg Ward | 99b032e | 2000-09-25 01:41:15 +0000 | [diff] [blame] | 48 | boolean_options = ['debug', 'force'] |
| 49 | |
Greg Ward | 9d17a7a | 2000-06-07 03:00:06 +0000 | [diff] [blame] | 50 | help_options = [ |
| 51 | ('help-compiler', None, |
Greg Ward | 2ff7887 | 2000-06-24 00:23:20 +0000 | [diff] [blame] | 52 | "list available compilers", show_compilers), |
Greg Ward | fa9ff76 | 2000-10-14 04:06:40 +0000 | [diff] [blame] | 53 | ] |
Greg Ward | 13ae1c8 | 1999-03-22 14:55:25 +0000 | [diff] [blame] | 54 | |
Collin Winter | 5b7e9d7 | 2007-08-30 03:52:21 +0000 | [diff] [blame] | 55 | def initialize_options(self): |
Greg Ward | e6ac2fc | 1999-09-29 12:38:18 +0000 | [diff] [blame] | 56 | self.build_base = 'build' |
| 57 | # these are decided only after 'build_base' has its final value |
Greg Ward | 13ae1c8 | 1999-03-22 14:55:25 +0000 | [diff] [blame] | 58 | # (unless overridden by the user or client) |
Greg Ward | 42a3bf5 | 2000-03-01 01:26:45 +0000 | [diff] [blame] | 59 | self.build_purelib = None |
Greg Ward | e6ac2fc | 1999-09-29 12:38:18 +0000 | [diff] [blame] | 60 | self.build_platlib = None |
Greg Ward | 42a3bf5 | 2000-03-01 01:26:45 +0000 | [diff] [blame] | 61 | self.build_lib = None |
| 62 | self.build_temp = None |
Greg Ward | 8d5881a | 2000-05-25 01:19:18 +0000 | [diff] [blame] | 63 | self.build_scripts = None |
Gregory P. Smith | 9668b78 | 2000-05-12 00:33:14 +0000 | [diff] [blame] | 64 | self.compiler = None |
Christian Heimes | 5e69685 | 2008-04-09 08:37:03 +0000 | [diff] [blame] | 65 | self.plat_name = None |
Greg Ward | 3246200 | 2000-02-09 02:19:49 +0000 | [diff] [blame] | 66 | self.debug = None |
Greg Ward | c41d6b3 | 2000-04-10 00:19:42 +0000 | [diff] [blame] | 67 | self.force = 0 |
Martin v. Löwis | 9f5c0c4 | 2004-08-25 11:37:43 +0000 | [diff] [blame] | 68 | self.executable = None |
Greg Ward | 13ae1c8 | 1999-03-22 14:55:25 +0000 | [diff] [blame] | 69 | |
Collin Winter | 5b7e9d7 | 2007-08-30 03:52:21 +0000 | [diff] [blame] | 70 | def finalize_options(self): |
Christian Heimes | 5e69685 | 2008-04-09 08:37:03 +0000 | [diff] [blame] | 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]) |
Greg Ward | 4290094 | 2000-09-16 01:54:46 +0000 | [diff] [blame] | 83 | |
Georg Brandl | 86def6c | 2008-01-21 20:36:10 +0000 | [diff] [blame] | 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 | |
Greg Ward | 42a3bf5 | 2000-03-01 01:26:45 +0000 | [diff] [blame] | 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: |
Greg Ward | cb1f4c4 | 2000-09-30 18:27:54 +0000 | [diff] [blame] | 94 | self.build_purelib = os.path.join(self.build_base, 'lib') |
Greg Ward | e6ac2fc | 1999-09-29 12:38:18 +0000 | [diff] [blame] | 95 | if self.build_platlib is None: |
Greg Ward | cb1f4c4 | 2000-09-30 18:27:54 +0000 | [diff] [blame] | 96 | self.build_platlib = os.path.join(self.build_base, |
| 97 | 'lib' + plat_specifier) |
Greg Ward | 42a3bf5 | 2000-03-01 01:26:45 +0000 | [diff] [blame] | 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: |
Greg Ward | cb1f4c4 | 2000-09-30 18:27:54 +0000 | [diff] [blame] | 111 | self.build_temp = os.path.join(self.build_base, |
| 112 | 'temp' + plat_specifier) |
Greg Ward | 8d5881a | 2000-05-25 01:19:18 +0000 | [diff] [blame] | 113 | if self.build_scripts is None: |
Michael W. Hudson | 49bdaed | 2001-12-10 15:28:30 +0000 | [diff] [blame] | 114 | self.build_scripts = os.path.join(self.build_base, |
| 115 | 'scripts-' + sys.version[0:3]) |
Greg Ward | 53db815 | 2000-09-16 02:06:45 +0000 | [diff] [blame] | 116 | |
Martin v. Löwis | 9f5c0c4 | 2004-08-25 11:37:43 +0000 | [diff] [blame] | 117 | if self.executable is None: |
| 118 | self.executable = os.path.normpath(sys.executable) |
Greg Ward | 13ae1c8 | 1999-03-22 14:55:25 +0000 | [diff] [blame] | 119 | |
Collin Winter | 5b7e9d7 | 2007-08-30 03:52:21 +0000 | [diff] [blame] | 120 | def run(self): |
Greg Ward | 64d855a | 2000-09-30 17:08:12 +0000 | [diff] [blame] | 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) |
Greg Ward | 13ae1c8 | 1999-03-22 14:55:25 +0000 | [diff] [blame] | 128 | |
Greg Ward | 64d855a | 2000-09-30 17:08:12 +0000 | [diff] [blame] | 129 | # -- Predicates for the sub-command list --------------------------- |
Greg Ward | 5f7c18e | 2000-02-05 02:24:16 +0000 | [diff] [blame] | 130 | |
Collin Winter | 5b7e9d7 | 2007-08-30 03:52:21 +0000 | [diff] [blame] | 131 | def has_pure_modules(self): |
Greg Ward | 64d855a | 2000-09-30 17:08:12 +0000 | [diff] [blame] | 132 | return self.distribution.has_pure_modules() |
Greg Ward | 13ae1c8 | 1999-03-22 14:55:25 +0000 | [diff] [blame] | 133 | |
Collin Winter | 5b7e9d7 | 2007-08-30 03:52:21 +0000 | [diff] [blame] | 134 | def has_c_libraries(self): |
Greg Ward | 64d855a | 2000-09-30 17:08:12 +0000 | [diff] [blame] | 135 | return self.distribution.has_c_libraries() |
| 136 | |
Collin Winter | 5b7e9d7 | 2007-08-30 03:52:21 +0000 | [diff] [blame] | 137 | def has_ext_modules(self): |
Greg Ward | 64d855a | 2000-09-30 17:08:12 +0000 | [diff] [blame] | 138 | return self.distribution.has_ext_modules() |
| 139 | |
Collin Winter | 5b7e9d7 | 2007-08-30 03:52:21 +0000 | [diff] [blame] | 140 | def has_scripts(self): |
Greg Ward | 64d855a | 2000-09-30 17:08:12 +0000 | [diff] [blame] | 141 | return self.distribution.has_scripts() |
| 142 | |
Greg Ward | 64d855a | 2000-09-30 17:08:12 +0000 | [diff] [blame] | 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 | ] |