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)
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)
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
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)
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