github.phpd.cn/thought-machine/please@v12.2.0+incompatible/build_defs/fpm.build_defs (about)

     1  """Contains build rules for using fpm to package files.
     2  
     3  See https://github.com/jordansissel/fpm for more details about the excellent fpm tool.
     4  """
     5  
     6  
     7  def fpm_package(name, version, package_type, files=None, dirs=None, links=None, package_name=None,
     8                  options='', post_cmds=None, srcs=None, deps=None, visibility=None,
     9                  labels=None, _apply_deb_deps=False):
    10      """Defines a rule to build a package using fpm.
    11  
    12      Args:
    13        name (str): Rule name
    14        files (dict): Dict of locations -> files to include, for example:
    15               {
    16                   '/usr/bin/plz': '//src:please',
    17                   '/usr/share/plz/junit_runner': '//src/build/java:junit_runner',
    18                   '/usr/share/plz/some_file': 'some_file',  # file in this package
    19               }
    20        dirs (dict): Dict of directories -> rules to move into that directory, for example:
    21               {
    22                   '/usr/bin': ['//src:please'],
    23                   '/usr/share/plz': ['//src/build/java:junit_runner', 'some_file'],
    24               }
    25        links (dict): Dict of locations -> file to link to, for example:
    26               {
    27                   '/usr/bin/plz': '/opt/please',
    28               }
    29        version (str): Version of the package.
    30        package_type (str): Type of package to build (deb, rpm, etc)
    31        package_name (str): Name of package. Defaults to rule name.
    32        options (str): Extra options to pass to fpm.
    33        post_cmds (list): Additional commands to run after the .deb is built.
    34        srcs (list): Extra sources (it's not necessary to mention entries in 'files' here)
    35        deps (list): Dependencies
    36        visibility (list): Visibility specification.
    37        labels (list): Labels associated with this rule.
    38      """
    39      package_name = package_name or name
    40      cmds = ['mkdir _tmp']
    41      srcs = srcs or []
    42      if files:
    43          cmds.extend(['mkdir -p _tmp/$(dirname %s) && cp -r $(location %s) _tmp/%s' %
    44                       (k.lstrip('/'), v, k.lstrip('/')) for k, v in sorted(files.items())])
    45          srcs.extend(sorted(files.values()))
    46      if dirs:
    47          cmds.extend(['mkdir -p _tmp/%s && cp -r %s _tmp/%s' %
    48                       (k, ' '.join(['$(locations %s)' % x for x in v]), k)
    49                       for k, v in sorted(dirs.items())])
    50          for v in sorted(dirs.values()):
    51              srcs.extend(v)
    52      cmds.append('cd _tmp')
    53      if links:
    54          cmds.extend(['mkdir -p $(dirname %s) && ln -s %s %s' %
    55                       (k.lstrip('/'), v, k.lstrip('/')) for k, v in sorted(links.items())])
    56      cmds.append('fpm -s dir -t %s -n "%s" -v "%s" %s -p $OUT .' % (package_type, package_name,
    57                                                                     version, options))
    58      if post_cmds:
    59          cmds.extend(post_cmds)
    60      cmd = ' && '.join(cmds)
    61      return build_rule(
    62          name=name,
    63          srcs=srcs,
    64          outs=['%s_%s_%s.deb' % (package_name, version, CONFIG.ARCH)],
    65          cmd=cmd,
    66          deps=deps,
    67          visibility=visibility,
    68          building_description='Packaging...',
    69          requires=['fpm'],
    70          labels=labels,
    71          pre_build=_deb_deps(cmd, package_name) if _apply_deb_deps else None,
    72          output_is_complete=True,
    73      )
    74  
    75  
    76  def fpm_deb(name, version, files=None, dirs=None, links=None, package_name=None, options='',
    77              post_cmds=None, srcs=None, deps=None, visibility=None, labels=None):
    78      """Convenience wrapper around fpm_package that always builds a .deb package.
    79  
    80      Args:
    81        name (str): Rule name
    82        files (dict): Dict of locations -> files to include, for example:
    83               {
    84                   '/usr/bin/plz': '//src:please',
    85                   '/usr/share/plz/junit_runner': '//src/build/java:junit_runner',
    86                   '/usr/share/plz/some_file': 'some_file',  # file in this package
    87               }
    88        dirs (dict): Dict of directories -> rules to move into that directory, for example:
    89               {
    90                   '/usr/bin': ['//src:please'],
    91                   '/usr/share/plz': ['//src/build/java:junit_runner', 'some_file'],
    92               }
    93        links (dict): Dict of locations -> file to link to, for example:
    94               {
    95                   '/usr/bin/plz': '/opt/please',
    96               }
    97        version (str): Version of the package.
    98        package_name (str): Name of package. Defaults to rule name.
    99        options (str): Extra options to pass to fpm.
   100        post_cmds (list): Additional commands to run after the .deb is built.
   101        srcs (list): Extra sources (it's not necessary to mention entries in 'files' here)
   102        deps (list): Dependencies
   103        visibility (list): Visibility specification.
   104        labels (list): Labels associated with this rule.
   105      """
   106      return fpm_package(
   107          name=name,
   108          files=files,
   109          dirs=dirs,
   110          version=version,
   111          package_type='deb',
   112          links=links,
   113          package_name=package_name,
   114          options=options,
   115          post_cmds=post_cmds,
   116          srcs=srcs,
   117          deps=deps,
   118          visibility=visibility,
   119          labels=(labels or []) + [
   120              'deb',
   121              'deb_pkg:%s' % (package_name or name),
   122          ],
   123          _apply_deb_deps=True,
   124      )
   125  
   126  
   127  def _deb_deps(cmd, current_label):
   128      """Returns a pre-build function that updates the fpm command to add .deb dependencies."""
   129      def _find_deb_deps(name):
   130          deps = ' '.join(['-d ' + label for label in get_labels(name, 'deb_pkg:')
   131                           if label != current_label])
   132          # Insert immediately after fpm, because it doesn't honour flags after positional arguments.
   133          set_command(name, cmd.replace(' && fpm ', ' && fpm %s ' % deps))
   134      return _find_deb_deps