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