fixit: Make most tools/ work on Windows

- Turn run_buildtools_binary into a python script
  so it can be used on windows as well.
- Make tools/gen_all skip gen_{android,bazel}
  as it's too hard to make those generator work
  due to the different GN config (The rest works)
- Minor fix for \\ vs // and other small Windows-related
  issues.

Bug: 181047869
Test: python3 tools/gen_all out\win

Change-Id: I55ed1969a76cb35f1d94c849f24519aa9ac13010
diff --git a/tools/gen_binary_descriptors b/tools/gen_binary_descriptors
index d25d9bd..5388c48 100755
--- a/tools/gen_binary_descriptors
+++ b/tools/gen_binary_descriptors
@@ -25,14 +25,11 @@
 from compat import iteritems
 
 SOURCE_TARGET = [
-    (
-      'protos/perfetto/trace_processor/trace_processor.proto',
-      'src/trace_processor/python/perfetto/trace_processor/trace_processor.descriptor'
+    ('protos/perfetto/trace_processor/trace_processor.proto',
+     'src/trace_processor/python/perfetto/trace_processor/trace_processor.descriptor'
     ),
-    (
-      'protos/perfetto/metrics/metrics.proto',
-      'src/trace_processor/python/perfetto/trace_processor/metrics.descriptor'
-    ),
+    ('protos/perfetto/metrics/metrics.proto',
+     'src/trace_processor/python/perfetto/trace_processor/metrics.descriptor'),
 ]
 
 ROOT_DIR = os.path.dirname(os.path.dirname(os.path.realpath(__file__)))
@@ -54,7 +51,6 @@
   return None
 
 
-
 def check(source, target):
   assert os.path.exists(os.path.join(ROOT_DIR, target)), \
       'Output file {} does not exist and so cannot be checked'.format(target)
@@ -75,7 +71,9 @@
 
 
 def generate(source, target, protoc_path):
-  with tempfile.NamedTemporaryFile() as fdescriptor:
+  # delete=False + manual unlink is required for Windows. Otherwise the temp
+  # file is kept locked exclusively and unaccassible until it's destroyed.
+  with tempfile.NamedTemporaryFile(delete=False) as fdescriptor:
     subprocess.check_call([
         protoc_path,
         '--include_imports',
@@ -84,10 +82,11 @@
             os.path.join(ROOT_DIR, "buildtools", "protobuf", "src"),
         '--descriptor_set_out={}'.format(fdescriptor.name),
         source,
-    ],
-                          cwd=ROOT_DIR)
+    ], cwd=ROOT_DIR)
 
     s = fdescriptor.read()
+    fdescriptor.close()
+    os.remove(fdescriptor.name)
     with open(target, 'wb') as out:
       out.write(s)
 
@@ -105,6 +104,7 @@
           source_hash=hash_path(os.path.join(source)),
       ).encode())
 
+
 def main():
   parser = argparse.ArgumentParser()
   parser.add_argument('--check-only', action='store_true')