[sdk_build_id] Fix hermeticity

... by writing debug files read to a depfile

Change-Id: I9b78dec740b421f20f352ffcf77eba32aba7876d
Reviewed-on: https://fuchsia-review.googlesource.com/c/fuchsia/+/514448
Reviewed-by: Shai Barack <shayba@google.com>
Commit-Queue: Jay Zhuang <jayzhuang@google.com>
diff --git a/build/zircon/sdk_build_id.py b/build/zircon/sdk_build_id.py
index b797bbb..772f4db 100755
--- a/build/zircon/sdk_build_id.py
+++ b/build/zircon/sdk_build_id.py
@@ -28,16 +28,34 @@
 
 def main():
     parser = argparse.ArgumentParser()
-    parser.add_argument('--input', help='Input JSON file', required=True)
-    parser.add_argument('--output', help='Output JSON file', required=True)
     parser.add_argument(
-        '--manifest', help='Output manifest file', required=True)
+        '--input',
+        type=argparse.FileType('r'),
+        help='Input JSON file',
+        required=True,
+    )
+    parser.add_argument(
+        '--output',
+        type=argparse.FileType('w'),
+        help='Output JSON file',
+        required=True,
+    )
+    parser.add_argument(
+        '--manifest',
+        type=argparse.FileType('w'),
+        help='Output manifest file',
+        required=True,
+    )
+    parser.add_argument(
+        '--depfile',
+        type=argparse.FileType('w'),
+        required=True,
+    )
     parser.add_argument('--location', help='JSON pointer', required=True)
     args = parser.parse_args()
 
     # Read in the original JSON tree.
-    with open(args.input) as f:
-        data = json.load(f)
+    data = json.load(args.input)
 
     # Poor man's JSON pointer: /foo/bar/baz looks up in dicts.
     ptr = args.location.split('/')
@@ -56,13 +74,21 @@
 
     # Write out the manifest collected while rewriting original debug files
     # names to .build-id/... names for publication.
-    with open(args.manifest, 'w') as f:
-        for dest, source in manifest.items():
-            f.write('%s=%s\n' % (dest, source))
+    #
+    # Original debug files are read during the rewrite above, so include them in
+    # a depfile.
+    mappings = []
+    deps = []
+    for dest, source in manifest.items():
+        mappings.append(f'{dest}={source}')
+        deps.append(source)
+    args.manifest.write('\n'.join(mappings))
+    args.depfile.write(
+        '{} {}: {}\n'.format(
+            args.manifest.name, args.output.name, ' '.join(deps)))
 
     # Write out the modified JSON tree.
-    with open(args.output, 'w') as f:
-        json.dump(data, f, indent=2, sort_keys=True)
+    json.dump(data, args.output, indent=2, sort_keys=True)
 
     return 0
 
diff --git a/zircon/public/sysroot/sdk/BUILD.gn b/zircon/public/sysroot/sdk/BUILD.gn
index 18922f3..e167ef3 100644
--- a/zircon/public/sysroot/sdk/BUILD.gn
+++ b/zircon/public/sysroot/sdk/BUILD.gn
@@ -115,7 +115,6 @@
 
 action("sysroot-meta") {
   visibility = [ ":*" ]
-  hermetic_deps = false
   script = "//build/zircon/sdk_build_id.py"
   sources = [ sysroot_meta_json_file ]
   inputs = [
@@ -126,10 +125,12 @@
     "$target_out_dir/sysroot.meta.out.json",
     "$target_out_dir/sysroot.debug.manifest",
   ]
+  depfile = "$target_out_dir/sysroot-meta.d"
   args = [
     "--input=" + rebase_path(sources[0], root_build_dir),
     "--output=" + rebase_path(outputs[0], root_build_dir),
     "--manifest=" + rebase_path(outputs[1], root_build_dir),
+    "--depfile=" + rebase_path(depfile, root_build_dir),
     "--location=/versions/$target_cpu/debug_libs",
   ]
   deps = [ ":sysroot-meta-json" ] + sysroot_sdk_deps