17db96d56Sopenharmony_ci"""distutils.command.bdist
27db96d56Sopenharmony_ci
37db96d56Sopenharmony_ciImplements the Distutils 'bdist' command (create a built [binary]
47db96d56Sopenharmony_cidistribution)."""
57db96d56Sopenharmony_ci
67db96d56Sopenharmony_ciimport os
77db96d56Sopenharmony_cifrom distutils.core import Command
87db96d56Sopenharmony_cifrom distutils.errors import *
97db96d56Sopenharmony_cifrom distutils.util import get_platform
107db96d56Sopenharmony_ci
117db96d56Sopenharmony_ci
127db96d56Sopenharmony_cidef show_formats():
137db96d56Sopenharmony_ci    """Print list of available formats (arguments to "--format" option).
147db96d56Sopenharmony_ci    """
157db96d56Sopenharmony_ci    from distutils.fancy_getopt import FancyGetopt
167db96d56Sopenharmony_ci    formats = []
177db96d56Sopenharmony_ci    for format in bdist.format_commands:
187db96d56Sopenharmony_ci        formats.append(("formats=" + format, None,
197db96d56Sopenharmony_ci                        bdist.format_command[format][1]))
207db96d56Sopenharmony_ci    pretty_printer = FancyGetopt(formats)
217db96d56Sopenharmony_ci    pretty_printer.print_help("List of available distribution formats:")
227db96d56Sopenharmony_ci
237db96d56Sopenharmony_ci
247db96d56Sopenharmony_ciclass bdist(Command):
257db96d56Sopenharmony_ci
267db96d56Sopenharmony_ci    description = "create a built (binary) distribution"
277db96d56Sopenharmony_ci
287db96d56Sopenharmony_ci    user_options = [('bdist-base=', 'b',
297db96d56Sopenharmony_ci                     "temporary directory for creating built distributions"),
307db96d56Sopenharmony_ci                    ('plat-name=', 'p',
317db96d56Sopenharmony_ci                     "platform name to embed in generated filenames "
327db96d56Sopenharmony_ci                     "(default: %s)" % get_platform()),
337db96d56Sopenharmony_ci                    ('formats=', None,
347db96d56Sopenharmony_ci                     "formats for distribution (comma-separated list)"),
357db96d56Sopenharmony_ci                    ('dist-dir=', 'd',
367db96d56Sopenharmony_ci                     "directory to put final built distributions in "
377db96d56Sopenharmony_ci                     "[default: dist]"),
387db96d56Sopenharmony_ci                    ('skip-build', None,
397db96d56Sopenharmony_ci                     "skip rebuilding everything (for testing/debugging)"),
407db96d56Sopenharmony_ci                    ('owner=', 'u',
417db96d56Sopenharmony_ci                     "Owner name used when creating a tar file"
427db96d56Sopenharmony_ci                     " [default: current user]"),
437db96d56Sopenharmony_ci                    ('group=', 'g',
447db96d56Sopenharmony_ci                     "Group name used when creating a tar file"
457db96d56Sopenharmony_ci                     " [default: current group]"),
467db96d56Sopenharmony_ci                   ]
477db96d56Sopenharmony_ci
487db96d56Sopenharmony_ci    boolean_options = ['skip-build']
497db96d56Sopenharmony_ci
507db96d56Sopenharmony_ci    help_options = [
517db96d56Sopenharmony_ci        ('help-formats', None,
527db96d56Sopenharmony_ci         "lists available distribution formats", show_formats),
537db96d56Sopenharmony_ci        ]
547db96d56Sopenharmony_ci
557db96d56Sopenharmony_ci    # The following commands do not take a format option from bdist
567db96d56Sopenharmony_ci    no_format_option = ('bdist_rpm',)
577db96d56Sopenharmony_ci
587db96d56Sopenharmony_ci    # This won't do in reality: will need to distinguish RPM-ish Linux,
597db96d56Sopenharmony_ci    # Debian-ish Linux, Solaris, FreeBSD, ..., Windows, Mac OS.
607db96d56Sopenharmony_ci    default_format = {'posix': 'gztar',
617db96d56Sopenharmony_ci                      'nt': 'zip'}
627db96d56Sopenharmony_ci
637db96d56Sopenharmony_ci    # Establish the preferred order (for the --help-formats option).
647db96d56Sopenharmony_ci    format_commands = ['rpm', 'gztar', 'bztar', 'xztar', 'ztar', 'tar', 'zip']
657db96d56Sopenharmony_ci
667db96d56Sopenharmony_ci    # And the real information.
677db96d56Sopenharmony_ci    format_command = {'rpm':   ('bdist_rpm',  "RPM distribution"),
687db96d56Sopenharmony_ci                      'gztar': ('bdist_dumb', "gzip'ed tar file"),
697db96d56Sopenharmony_ci                      'bztar': ('bdist_dumb', "bzip2'ed tar file"),
707db96d56Sopenharmony_ci                      'xztar': ('bdist_dumb', "xz'ed tar file"),
717db96d56Sopenharmony_ci                      'ztar':  ('bdist_dumb', "compressed tar file"),
727db96d56Sopenharmony_ci                      'tar':   ('bdist_dumb', "tar file"),
737db96d56Sopenharmony_ci                      'zip':   ('bdist_dumb', "ZIP file"),
747db96d56Sopenharmony_ci                      }
757db96d56Sopenharmony_ci
767db96d56Sopenharmony_ci    def initialize_options(self):
777db96d56Sopenharmony_ci        self.bdist_base = None
787db96d56Sopenharmony_ci        self.plat_name = None
797db96d56Sopenharmony_ci        self.formats = None
807db96d56Sopenharmony_ci        self.dist_dir = None
817db96d56Sopenharmony_ci        self.skip_build = 0
827db96d56Sopenharmony_ci        self.group = None
837db96d56Sopenharmony_ci        self.owner = None
847db96d56Sopenharmony_ci
857db96d56Sopenharmony_ci    def finalize_options(self):
867db96d56Sopenharmony_ci        # have to finalize 'plat_name' before 'bdist_base'
877db96d56Sopenharmony_ci        if self.plat_name is None:
887db96d56Sopenharmony_ci            if self.skip_build:
897db96d56Sopenharmony_ci                self.plat_name = get_platform()
907db96d56Sopenharmony_ci            else:
917db96d56Sopenharmony_ci                self.plat_name = self.get_finalized_command('build').plat_name
927db96d56Sopenharmony_ci
937db96d56Sopenharmony_ci        # 'bdist_base' -- parent of per-built-distribution-format
947db96d56Sopenharmony_ci        # temporary directories (eg. we'll probably have
957db96d56Sopenharmony_ci        # "build/bdist.<plat>/dumb", "build/bdist.<plat>/rpm", etc.)
967db96d56Sopenharmony_ci        if self.bdist_base is None:
977db96d56Sopenharmony_ci            build_base = self.get_finalized_command('build').build_base
987db96d56Sopenharmony_ci            self.bdist_base = os.path.join(build_base,
997db96d56Sopenharmony_ci                                           'bdist.' + self.plat_name)
1007db96d56Sopenharmony_ci
1017db96d56Sopenharmony_ci        self.ensure_string_list('formats')
1027db96d56Sopenharmony_ci        if self.formats is None:
1037db96d56Sopenharmony_ci            try:
1047db96d56Sopenharmony_ci                self.formats = [self.default_format[os.name]]
1057db96d56Sopenharmony_ci            except KeyError:
1067db96d56Sopenharmony_ci                raise DistutilsPlatformError(
1077db96d56Sopenharmony_ci                      "don't know how to create built distributions "
1087db96d56Sopenharmony_ci                      "on platform %s" % os.name)
1097db96d56Sopenharmony_ci
1107db96d56Sopenharmony_ci        if self.dist_dir is None:
1117db96d56Sopenharmony_ci            self.dist_dir = "dist"
1127db96d56Sopenharmony_ci
1137db96d56Sopenharmony_ci    def run(self):
1147db96d56Sopenharmony_ci        # Figure out which sub-commands we need to run.
1157db96d56Sopenharmony_ci        commands = []
1167db96d56Sopenharmony_ci        for format in self.formats:
1177db96d56Sopenharmony_ci            try:
1187db96d56Sopenharmony_ci                commands.append(self.format_command[format][0])
1197db96d56Sopenharmony_ci            except KeyError:
1207db96d56Sopenharmony_ci                raise DistutilsOptionError("invalid format '%s'" % format)
1217db96d56Sopenharmony_ci
1227db96d56Sopenharmony_ci        # Reinitialize and run each command.
1237db96d56Sopenharmony_ci        for i in range(len(self.formats)):
1247db96d56Sopenharmony_ci            cmd_name = commands[i]
1257db96d56Sopenharmony_ci            sub_cmd = self.reinitialize_command(cmd_name)
1267db96d56Sopenharmony_ci            if cmd_name not in self.no_format_option:
1277db96d56Sopenharmony_ci                sub_cmd.format = self.formats[i]
1287db96d56Sopenharmony_ci
1297db96d56Sopenharmony_ci            # passing the owner and group names for tar archiving
1307db96d56Sopenharmony_ci            if cmd_name == 'bdist_dumb':
1317db96d56Sopenharmony_ci                sub_cmd.owner = self.owner
1327db96d56Sopenharmony_ci                sub_cmd.group = self.group
1337db96d56Sopenharmony_ci
1347db96d56Sopenharmony_ci            # If we're going to need to run this command again, tell it to
1357db96d56Sopenharmony_ci            # keep its temporary files around so subsequent runs go faster.
1367db96d56Sopenharmony_ci            if cmd_name in commands[i+1:]:
1377db96d56Sopenharmony_ci                sub_cmd.keep_temp = 1
1387db96d56Sopenharmony_ci            self.run_command(cmd_name)
139