#!/usr/bin/env python3 # Copyright 2023 The Chromium Authors # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. '''Is used to find all rust files in a crate, and write the result to a depfile. Then, used again to read the same depfile and pull out just the source files. Lastly, it is also used to write a stamp file at the same location as the depfile.''' import argparse import re import subprocess import sys FILE_REGEX = re.compile('^(.*):') def main(): parser = argparse.ArgumentParser( description='Collect Rust sources for a crate') parser.add_argument('--stamp', action='store_true', help='Generate a stamp file') parser.add_argument('--generate-depfile', action='store_true', help='Generate a depfile') parser.add_argument('--read-depfile', action='store_true', help='Read the previously generated depfile') args, rest = parser.parse_known_args() if (args.stamp): stampfile = rest[0] with open(stampfile, "w") as f: f.write("stamp") elif (args.generate_depfile): rustc = rest[0] crate_root = rest[1] depfile = rest[2] rustflags = rest[3:] rustc_args = [ "--emit=dep-info=" + depfile, "-Zdep-info-omit-d-target", crate_root ] subprocess.check_call([rustc] + rustc_args + rustflags) elif (args.read_depfile): depfile = rest[0] try: with open(depfile, "r") as f: files = [FILE_REGEX.match(l) for l in f.readlines()] for f in files: if f: print(f.group(1)) except: pass else: print("ERROR: Unknown action") parser.print_help() return 1 return 0 if __name__ == '__main__': sys.exit(main())