17db96d56Sopenharmony_ci"""distutils.command.build
27db96d56Sopenharmony_ci
37db96d56Sopenharmony_ciImplements the Distutils 'build' command."""
47db96d56Sopenharmony_ci
57db96d56Sopenharmony_ciimport sys, os
67db96d56Sopenharmony_cifrom distutils.core import Command
77db96d56Sopenharmony_cifrom distutils.errors import DistutilsOptionError
87db96d56Sopenharmony_cifrom distutils.util import get_platform
97db96d56Sopenharmony_ci
107db96d56Sopenharmony_ci
117db96d56Sopenharmony_cidef show_compilers():
127db96d56Sopenharmony_ci    from distutils.ccompiler import show_compilers
137db96d56Sopenharmony_ci    show_compilers()
147db96d56Sopenharmony_ci
157db96d56Sopenharmony_ci
167db96d56Sopenharmony_ciclass build(Command):
177db96d56Sopenharmony_ci
187db96d56Sopenharmony_ci    description = "build everything needed to install"
197db96d56Sopenharmony_ci
207db96d56Sopenharmony_ci    user_options = [
217db96d56Sopenharmony_ci        ('build-base=', 'b',
227db96d56Sopenharmony_ci         "base directory for build library"),
237db96d56Sopenharmony_ci        ('build-purelib=', None,
247db96d56Sopenharmony_ci         "build directory for platform-neutral distributions"),
257db96d56Sopenharmony_ci        ('build-platlib=', None,
267db96d56Sopenharmony_ci         "build directory for platform-specific distributions"),
277db96d56Sopenharmony_ci        ('build-lib=', None,
287db96d56Sopenharmony_ci         "build directory for all distribution (defaults to either " +
297db96d56Sopenharmony_ci         "build-purelib or build-platlib"),
307db96d56Sopenharmony_ci        ('build-scripts=', None,
317db96d56Sopenharmony_ci         "build directory for scripts"),
327db96d56Sopenharmony_ci        ('build-temp=', 't',
337db96d56Sopenharmony_ci         "temporary build directory"),
347db96d56Sopenharmony_ci        ('plat-name=', 'p',
357db96d56Sopenharmony_ci         "platform name to build for, if supported "
367db96d56Sopenharmony_ci         "(default: %s)" % get_platform()),
377db96d56Sopenharmony_ci        ('compiler=', 'c',
387db96d56Sopenharmony_ci         "specify the compiler type"),
397db96d56Sopenharmony_ci        ('parallel=', 'j',
407db96d56Sopenharmony_ci         "number of parallel build jobs"),
417db96d56Sopenharmony_ci        ('debug', 'g',
427db96d56Sopenharmony_ci         "compile extensions and libraries with debugging information"),
437db96d56Sopenharmony_ci        ('force', 'f',
447db96d56Sopenharmony_ci         "forcibly build everything (ignore file timestamps)"),
457db96d56Sopenharmony_ci        ('executable=', 'e',
467db96d56Sopenharmony_ci         "specify final destination interpreter path (build.py)"),
477db96d56Sopenharmony_ci        ]
487db96d56Sopenharmony_ci
497db96d56Sopenharmony_ci    boolean_options = ['debug', 'force']
507db96d56Sopenharmony_ci
517db96d56Sopenharmony_ci    help_options = [
527db96d56Sopenharmony_ci        ('help-compiler', None,
537db96d56Sopenharmony_ci         "list available compilers", show_compilers),
547db96d56Sopenharmony_ci        ]
557db96d56Sopenharmony_ci
567db96d56Sopenharmony_ci    def initialize_options(self):
577db96d56Sopenharmony_ci        self.build_base = 'build'
587db96d56Sopenharmony_ci        # these are decided only after 'build_base' has its final value
597db96d56Sopenharmony_ci        # (unless overridden by the user or client)
607db96d56Sopenharmony_ci        self.build_purelib = None
617db96d56Sopenharmony_ci        self.build_platlib = None
627db96d56Sopenharmony_ci        self.build_lib = None
637db96d56Sopenharmony_ci        self.build_temp = None
647db96d56Sopenharmony_ci        self.build_scripts = None
657db96d56Sopenharmony_ci        self.compiler = None
667db96d56Sopenharmony_ci        self.plat_name = None
677db96d56Sopenharmony_ci        self.debug = None
687db96d56Sopenharmony_ci        self.force = 0
697db96d56Sopenharmony_ci        self.executable = None
707db96d56Sopenharmony_ci        self.parallel = None
717db96d56Sopenharmony_ci
727db96d56Sopenharmony_ci    def finalize_options(self):
737db96d56Sopenharmony_ci        if self.plat_name is None:
747db96d56Sopenharmony_ci            self.plat_name = get_platform()
757db96d56Sopenharmony_ci        else:
767db96d56Sopenharmony_ci            # plat-name only supported for windows (other platforms are
777db96d56Sopenharmony_ci            # supported via ./configure flags, if at all).  Avoid misleading
787db96d56Sopenharmony_ci            # other platforms.
797db96d56Sopenharmony_ci            if os.name != 'nt':
807db96d56Sopenharmony_ci                raise DistutilsOptionError(
817db96d56Sopenharmony_ci                            "--plat-name only supported on Windows (try "
827db96d56Sopenharmony_ci                            "using './configure --help' on your platform)")
837db96d56Sopenharmony_ci
847db96d56Sopenharmony_ci        plat_specifier = ".%s-%d.%d" % (self.plat_name, *sys.version_info[:2])
857db96d56Sopenharmony_ci
867db96d56Sopenharmony_ci        # Make it so Python 2.x and Python 2.x with --with-pydebug don't
877db96d56Sopenharmony_ci        # share the same build directories. Doing so confuses the build
887db96d56Sopenharmony_ci        # process for C modules
897db96d56Sopenharmony_ci        if hasattr(sys, 'gettotalrefcount'):
907db96d56Sopenharmony_ci            plat_specifier += '-pydebug'
917db96d56Sopenharmony_ci
927db96d56Sopenharmony_ci        # 'build_purelib' and 'build_platlib' just default to 'lib' and
937db96d56Sopenharmony_ci        # 'lib.<plat>' under the base build directory.  We only use one of
947db96d56Sopenharmony_ci        # them for a given distribution, though --
957db96d56Sopenharmony_ci        if self.build_purelib is None:
967db96d56Sopenharmony_ci            self.build_purelib = os.path.join(self.build_base, 'lib')
977db96d56Sopenharmony_ci        if self.build_platlib is None:
987db96d56Sopenharmony_ci            self.build_platlib = os.path.join(self.build_base,
997db96d56Sopenharmony_ci                                              'lib' + plat_specifier)
1007db96d56Sopenharmony_ci
1017db96d56Sopenharmony_ci        # 'build_lib' is the actual directory that we will use for this
1027db96d56Sopenharmony_ci        # particular module distribution -- if user didn't supply it, pick
1037db96d56Sopenharmony_ci        # one of 'build_purelib' or 'build_platlib'.
1047db96d56Sopenharmony_ci        if self.build_lib is None:
1057db96d56Sopenharmony_ci            if self.distribution.ext_modules:
1067db96d56Sopenharmony_ci                self.build_lib = self.build_platlib
1077db96d56Sopenharmony_ci            else:
1087db96d56Sopenharmony_ci                self.build_lib = self.build_purelib
1097db96d56Sopenharmony_ci
1107db96d56Sopenharmony_ci        # 'build_temp' -- temporary directory for compiler turds,
1117db96d56Sopenharmony_ci        # "build/temp.<plat>"
1127db96d56Sopenharmony_ci        if self.build_temp is None:
1137db96d56Sopenharmony_ci            self.build_temp = os.path.join(self.build_base,
1147db96d56Sopenharmony_ci                                           'temp' + plat_specifier)
1157db96d56Sopenharmony_ci        if self.build_scripts is None:
1167db96d56Sopenharmony_ci            self.build_scripts = os.path.join(self.build_base,
1177db96d56Sopenharmony_ci                                              'scripts-%d.%d' % sys.version_info[:2])
1187db96d56Sopenharmony_ci
1197db96d56Sopenharmony_ci        if self.executable is None and sys.executable:
1207db96d56Sopenharmony_ci            self.executable = os.path.normpath(sys.executable)
1217db96d56Sopenharmony_ci
1227db96d56Sopenharmony_ci        if isinstance(self.parallel, str):
1237db96d56Sopenharmony_ci            try:
1247db96d56Sopenharmony_ci                self.parallel = int(self.parallel)
1257db96d56Sopenharmony_ci            except ValueError:
1267db96d56Sopenharmony_ci                raise DistutilsOptionError("parallel should be an integer")
1277db96d56Sopenharmony_ci
1287db96d56Sopenharmony_ci    def run(self):
1297db96d56Sopenharmony_ci        # Run all relevant sub-commands.  This will be some subset of:
1307db96d56Sopenharmony_ci        #  - build_py      - pure Python modules
1317db96d56Sopenharmony_ci        #  - build_clib    - standalone C libraries
1327db96d56Sopenharmony_ci        #  - build_ext     - Python extensions
1337db96d56Sopenharmony_ci        #  - build_scripts - (Python) scripts
1347db96d56Sopenharmony_ci        for cmd_name in self.get_sub_commands():
1357db96d56Sopenharmony_ci            self.run_command(cmd_name)
1367db96d56Sopenharmony_ci
1377db96d56Sopenharmony_ci
1387db96d56Sopenharmony_ci    # -- Predicates for the sub-command list ---------------------------
1397db96d56Sopenharmony_ci
1407db96d56Sopenharmony_ci    def has_pure_modules(self):
1417db96d56Sopenharmony_ci        return self.distribution.has_pure_modules()
1427db96d56Sopenharmony_ci
1437db96d56Sopenharmony_ci    def has_c_libraries(self):
1447db96d56Sopenharmony_ci        return self.distribution.has_c_libraries()
1457db96d56Sopenharmony_ci
1467db96d56Sopenharmony_ci    def has_ext_modules(self):
1477db96d56Sopenharmony_ci        return self.distribution.has_ext_modules()
1487db96d56Sopenharmony_ci
1497db96d56Sopenharmony_ci    def has_scripts(self):
1507db96d56Sopenharmony_ci        return self.distribution.has_scripts()
1517db96d56Sopenharmony_ci
1527db96d56Sopenharmony_ci
1537db96d56Sopenharmony_ci    sub_commands = [('build_py',      has_pure_modules),
1547db96d56Sopenharmony_ci                    ('build_clib',    has_c_libraries),
1557db96d56Sopenharmony_ci                    ('build_ext',     has_ext_modules),
1567db96d56Sopenharmony_ci                    ('build_scripts', has_scripts),
1577db96d56Sopenharmony_ci                   ]
158