示例#1
0
def _get_itest_target_body(bazel_path, target, use_implicit_output):
    if not use_implicit_output:
        return _get_itest_target_body_by_bazel_query(bazel_path, target)
    workspace = bazel_utils.find_workspace()

    rel_target_path = bazel_utils.executable_for_label(target)
    potential_target_path = os.path.join(workspace, rel_target_path)
    if not os.path.exists(potential_target_path):
        # if the expected binary does not exist, this may be a glob or an alias.
        # use bazel query to be sure.
        return _get_itest_target_body_by_bazel_query(bazel_path, target)

    # check if this target has services
    service_defs = os.path.join(
        potential_target_path + ".runfiles/__main__",
        os.path.relpath(rel_target_path, "bazel-bin") + ".service_defs",
    )
    if not os.path.exists(service_defs):
        # most likely doesn't have services. but just to be safe and very correct,
        # use bazel query
        # TODO(naphat) the only thing this bazel query protects against is some internal runfiles
        # structure in svc.bzl changing without this code being updated. do we need it?
        return _get_itest_target_body_by_bazel_query(bazel_path, target)
    # now that we know the given target is of a specific format (no aliases),
    # we can safely normalize the target name
    target = bazel_utils.BazelTarget(target).label
    return ITestTarget(name=target, has_services=True)
示例#2
0
def test_normalize_target_rel_path():
    for label, normalized_label, cwd in [
        ("services/metaserver", "//services/metaserver:metaserver",
         "/<WORKSPACE>"),
        (
            "services/metaserver:metaserver",
            "//services/metaserver:metaserver",
            "/<WORKSPACE>",
        ),
        ("metaserver", "//services/metaserver:metaserver",
         "/<WORKSPACE>/services"),
        (
            "metaserver:metaserver",
            "//services/metaserver:metaserver",
            "/<WORKSPACE>/services",
        ),
        (
            ":metaserver",
            "//services/metaserver:metaserver",
            "/<WORKSPACE>/services/metaserver",
        ),
    ]:
        assert (bazel_utils.BazelTarget(
            label, cwd=cwd,
            workspace="/<WORKSPACE>").label == normalized_label)
示例#3
0
def test_normalize_target_abs_path():
    for label, normalized_label in [
        ("//services/metaserver", "//services/metaserver:metaserver"),
        ("//services/metaserver:metaserver",
         "//services/metaserver:metaserver"),
    ]:
        assert bazel_utils.BazelTarget(label).label == normalized_label
示例#4
0
def cmd_pkg(args, bazel_args, mode_args):
    workspace_dir = bazel_utils.find_workspace()
    curdir = os.getcwd()
    os.chdir(workspace_dir)
    # Each target must be of type dbx_pkg_* just for sanity.
    for target_str in args.targets:
        target = bazel_utils.BazelTarget(target_str)
        try:
            bp = build_parser.BuildParser()
            bp.parse_file(os.path.join(workspace_dir, target.build_file))
            rule = bp.get_rule(target.name)
        except (IOError, KeyError) as e:
            sys.exit("No such target: " + target_str + " " + str(e))

        run_rule(args, bazel_args, mode_args, target, rule)

        outputs = bazel_utils.outputs_for_label(args.bazel_path, target.label)
        print("bzl target", target.label, "up-to-date:")
        for f in outputs:
            print("  " + f)
    os.chdir(curdir)
示例#5
0
def _build_targets(
    args,
    bazel_args,
    mode_args,
    pkg_target,
    pkg_prefix,
    name="",
    data=(),
    output_extension="tmp",
    file_map=None,
    preserve_symlinks=False,
    dedup_files=False,
):
    if not pkg_target.name.endswith(output_extension):
        raise bazel_utils.BazelError(
            "invalid target '%s' - must end with .%s" %
            (pkg_target.label, output_extension))
    # Treat data as our list of targets.
    targets = [bazel_utils.BazelTarget(x) for x in data]

    if targets:
        bazel_cmd = [args.bazel_path] + bazel_args + ["build"
                                                      ] + mode_args + data
        subprocess.check_call(bazel_cmd)

    # ask bazel where bazel-bin and bazel-genfiles are, instead of relying on
    # the symlinks, to support read-only workspaces
    pkg_dir_root = bazel_utils.check_output_silently(
        [args.bazel_path] + bazel_args + ["info"] + mode_args +
        ["bazel-genfiles"]).strip()
    out_dir_root = bazel_utils.check_output_silently([args.bazel_path] +
                                                     bazel_args + ["info"] +
                                                     mode_args +
                                                     ["bazel-bin"]).strip()

    pkg_dir = os.path.join(pkg_dir_root, pkg_target.package,
                           pkg_target.name + "-tmp")
    out_file = os.path.join(out_dir_root, pkg_target.package, pkg_target.name)

    out_dir = pkg_dir
    if pkg_prefix:
        out_dir = os.path.join(pkg_dir, pkg_prefix.strip("/"))
    # Prep and move things into the pkg_dir so they get squashed.
    if os.path.exists(out_file):
        os.remove(out_file)
    if os.path.exists(pkg_dir):
        shutil.rmtree(pkg_dir)
    os.makedirs(pkg_dir)
    if pkg_dir != out_dir:
        if os.path.exists(out_dir):
            shutil.rmtree(out_dir)
        os.makedirs(out_dir)

    if file_map:
        for dst, src in six.iteritems(file_map):
            if src:
                pkg_dst = os.path.join(pkg_dir, dst.strip("/"))
                pkg_dst_dir = os.path.dirname(pkg_dst)
                if not os.path.exists(pkg_dst_dir):
                    os.makedirs(pkg_dst_dir)
                shutil.copy2(os.path.join(pkg_target.package, src), pkg_dst)
            else:
                # If there is no source, assume it's a directory.
                pkg_dst_dir = os.path.join(pkg_dir, dst.strip("/"))
                if not os.path.exists(pkg_dst_dir):
                    os.makedirs(pkg_dst_dir)
    if targets:
        copy_labels(
            [t.label for t in targets],
            out_dir,
            preserve_symlinks=preserve_symlinks,
            _dedup_files=dedup_files,
            bazel_args=bazel_args,
            bazel_build_args=mode_args,
        )
    return pkg_dir, out_file