def _copy_go_binary_impl(ctx): output = ctx.actions.declare_file(ctx.label.name) for f in ctx.attr.src.files.to_list(): # go_binary rules have two outputs, a library and the binary itself. # The following is a horrible hack to avoid copying the library. if f.path.endswith(".a"): continue ctx.actions.run_shell( inputs = [f], outputs = [output], mnemonic = "CopyGoBinary", command = "mkdir -p %s && cp %s %s" % (output.dirname, f.path, output.path), ) return [DefaultInfo(executable = output)] copy_go_binary = rule( implementation = _copy_go_binary_impl, attrs = { "src": attr.label(mandatory = True, allow_files = True), }, executable = True, )