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