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 | ]
|
---|