"""Implementation of whl_filegroup rule.""" def _whl_filegroup_impl(ctx): out_dir = ctx.actions.declare_directory(ctx.attr.name) ctx.actions.run( outputs = [out_dir], inputs = [ctx.file.whl], arguments = [ ctx.file.whl.path, out_dir.path, ctx.attr.pattern, ], executable = ctx.executable._extract_wheel_files_tool, mnemonic = "PyExtractWheelFiles", progress_message = "Extracting %s files from %s" % (ctx.attr.pattern, ctx.file.whl.short_path), ) return [DefaultInfo( files = depset([out_dir]), runfiles = ctx.runfiles(files = [out_dir] if ctx.attr.runfiles else []), )] whl_filegroup = rule( _whl_filegroup_impl, doc = """Extract files matching a regular expression from a wheel file. An empty pattern will match all files. Example usage: ```starlark load("@rules_cc//cc:defs.bzl", "cc_library") load("@rules_python//python:pip.bzl", "whl_filegroup") whl_filegroup( name = "numpy_includes", pattern = "numpy/core/include/numpy", whl = "@pypi//numpy:whl", ) cc_library( name = "numpy_headers", hdrs = [":numpy_includes"], includes = ["numpy_includes/numpy/core/include"], deps = ["@rules_python//python/cc:current_py_cc_headers"], ) ``` """, attrs = { "pattern": attr.string(default = "", doc = "Only file paths matching this regex pattern will be extracted."), "runfiles": attr.bool(default = False, doc = "Whether to include the output TreeArtifact in this target's runfiles."), "whl": attr.label(mandatory = True, allow_single_file = True, doc = "The wheel to extract files from."), "_extract_wheel_files_tool": attr.label( default = Label("//python/private/whl_filegroup:extract_wheel_files"), cfg = "exec", executable = True, ), }, )