blob: cd9441680823541a5546cf2b308e410a8c9688c9 [file] [log] [blame]
#!/usr/bin/env python
# Copyright 2018 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
### runs rustfmt on a Rust target
import argparse
import os
import platform
import subprocess
import sys
import lib.rust
from lib.rust import ROOT_PATH, CONFIG_PATH
sys.path += [os.path.join(ROOT_PATH, "third_party", "pytoml")]
import pytoml as toml
def main():
parser = argparse.ArgumentParser("Format a rust target")
parser.add_argument("gn_target",
type=lib.rust.GnTarget,
help="GN target to format. \
Use '.[:target]' to discover the cargo target \
for the current directory or use the \
absolute path to the target \
(relative to $FUCHSIA_DIR). \
For example: //garnet/bin/foo/bar:baz.")
parser.add_argument("-v", "--verbose",
action='store_true',
help="Show verbose output")
parser.add_argument("-s", "--print-sources",
action='store_true',
help="Only print sources; do not format")
args = parser.parse_args()
out_dir = lib.rust.find_out_dir()
if args.print_sources and not os.path.exists(args.gn_target.manifest_path(out_dir)):
return 0
with open(args.gn_target.manifest_path(out_dir), "r") as fin:
cargo_toml = toml.load(fin)
main_file = None
if 'bin' in cargo_toml:
bins = cargo_toml['bin']
if len(bins) != 1:
print("Expected a single bin target for {gn_target}, found {n}".format(
gn_target = args.gn_target,
n = len(bins)))
return 1
main_file = bins[0]['path']
elif 'lib' in cargo_toml:
main_file = cargo_toml['lib']['path']
if args.print_sources:
if main_file:
print(main_file)
return 0
if not main_file or not os.path.exists(main_file):
print("No source root (typically lib.rs or main.rs) found for this gn target")
return 1
host_platform = "%s-%s" % (
platform.system().lower().replace("darwin", "mac"),
{
"x86_64": "x64",
"aarch64": "arm64",
}[platform.machine()],
)
buildtools_dir = os.path.join(ROOT_PATH, "buildtools", host_platform)
rustfmt = os.path.join(buildtools_dir, "rust", "bin", "rustfmt")
call_args = [
rustfmt,
main_file,
]
if args.verbose:
call_args.append("-v")
return subprocess.call(call_args)
if __name__ == '__main__':
sys.exit(main())