diff options
author | Anthony DiGirolamo <tonymd@google.com> | 2020-10-31 20:31:54 -0700 |
---|---|---|
committer | CQ Bot Account <pigweed-scoped@luci-project-accounts.iam.gserviceaccount.com> | 2020-11-03 21:37:54 +0000 |
commit | efdd24002f9721400c4cd0aab70909c5595d1fe7 (patch) | |
tree | 784c07015c29801a923388641d2667af6d3b027a /pw_arduino_build | |
parent | 1502a40b68dc6dd161a792aee03f979d677c18f1 (diff) | |
download | pigweed-efdd24002f9721400c4cd0aab70909c5595d1fe7.tar.gz |
pw_arduino_build: Remove duplicate c-flags from asm/cppflags
Teensy cores have cflags included in the asmflag and cppflag recipes.
This causes gn to effectively duplicate cflags when building asm and
cpp files. This CL adds --s-only-flags and --cpp-only-flags options
which remove cflags from each respectively.
Add --ld-lib-names option.
If --ld-libs returns: -larm_cortexM7lfsp_math -lm -lstdc++
Then --ld-lib-names returns: arm_cortexM7lfsp_math m stdc++
Add a --flash-only option to arduino_unit_test_runner.
Change-Id: I1906d6f846f12ceb8ca42c498a7b216e0e3ba7e2
Reviewed-on: https://pigweed-review.googlesource.com/c/pigweed/pigweed/+/23086
Reviewed-by: Armando Montanez <amontanez@google.com>
Commit-Queue: Anthony DiGirolamo <tonymd@google.com>
Diffstat (limited to 'pw_arduino_build')
-rw-r--r-- | pw_arduino_build/py/pw_arduino_build/__main__.py | 29 | ||||
-rwxr-xr-x | pw_arduino_build/py/pw_arduino_build/builder.py | 18 | ||||
-rwxr-xr-x | pw_arduino_build/py/pw_arduino_build/unit_test_runner.py | 11 |
3 files changed, 43 insertions, 15 deletions
diff --git a/pw_arduino_build/py/pw_arduino_build/__main__.py b/pw_arduino_build/py/pw_arduino_build/__main__.py index 16dfde796..503630a41 100644 --- a/pw_arduino_build/py/pw_arduino_build/__main__.py +++ b/pw_arduino_build/py/pw_arduino_build/__main__.py @@ -22,6 +22,7 @@ import pprint import shlex import subprocess import sys +from collections import OrderedDict from typing import List from pw_arduino_build import core_installer, log @@ -90,6 +91,15 @@ def show_command_print_flag_string(args, flag_string): print(flag_string) +def subtract_flags(flag_list_a: List[str], + flag_list_b: List[str]) -> List[str]: + """Given two sets of flags return flags in a that are not in b.""" + flag_counts = OrderedDict() # type: OrderedDict[str, int] + for flag in flag_list_a + flag_list_b: + flag_counts[flag] = flag_counts.get(flag, 0) + 1 + return [flag for flag in flag_list_a if flag_counts.get(flag, 0) == 1] + + def run_command_lines(args, command_lines: List[str]): for command_line in command_lines: if not args.quiet: @@ -185,16 +195,30 @@ def show_command(args, builder): sflags = builder.get_s_flags() show_command_print_flag_string(args, sflags) + elif args.s_only_flags: + s_only_flags = subtract_flags(shlex.split(builder.get_s_flags()), + shlex.split(builder.get_c_flags())) + show_command_print_flag_string(args, " ".join(s_only_flags)) + elif args.cpp_flags: cppflags = builder.get_cpp_flags() show_command_print_flag_string(args, cppflags) + elif args.cpp_only_flags: + cpp_only_flags = subtract_flags(shlex.split(builder.get_cpp_flags()), + shlex.split(builder.get_c_flags())) + show_command_print_flag_string(args, " ".join(cpp_only_flags)) + elif args.ld_flags: ldflags = builder.get_ld_flags() show_command_print_flag_string(args, ldflags) elif args.ld_libs: - print(builder.get_ld_libs()) + show_command_print_flag_string(args, builder.get_ld_libs()) + + elif args.ld_lib_names: + show_command_print_flag_string(args, + builder.get_ld_libs(name_only=True)) elif args.ar_flags: ar_flags = builder.get_ar_flags() @@ -464,10 +488,13 @@ def main(): output_group.add_argument("--link", action="store_true") output_group.add_argument("--c-flags", action="store_true") output_group.add_argument("--s-flags", action="store_true") + output_group.add_argument("--s-only-flags", action="store_true") output_group.add_argument("--cpp-flags", action="store_true") + output_group.add_argument("--cpp-only-flags", action="store_true") output_group.add_argument("--ld-flags", action="store_true") output_group.add_argument("--ar-flags", action="store_true") output_group.add_argument("--ld-libs", action="store_true") + output_group.add_argument("--ld-lib-names", action="store_true") output_group.add_argument("--objcopy", help="objcopy step for SUFFIX") output_group.add_argument("--objcopy-flags", help="objcopy flags for SUFFIX") diff --git a/pw_arduino_build/py/pw_arduino_build/builder.py b/pw_arduino_build/py/pw_arduino_build/builder.py index a59babe99..43b5ac3f7 100755 --- a/pw_arduino_build/py/pw_arduino_build/builder.py +++ b/pw_arduino_build/py/pw_arduino_build/builder.py @@ -941,19 +941,13 @@ class ArduinoBuilder: return compile_line.strip() - def get_ld_libs(self): + def get_ld_libs(self, name_only=False): compile_line = self.get_link_line() - _, compile_line = ArduinoBuilder.split_binary_from_arguments( - compile_line) - # TODO(tonymd): This replacement is teensy specific - compile_line = compile_line.replace( - "-o \"{build.path}/{build.project_name}.elf\" " - "{object_files} \"-L{build.path}\"", "", 1) - libs = re.findall(r'(-l[^ ]+ ?)', compile_line) - for lib in libs: - compile_line = compile_line.replace(lib, "", 1) - libs = [lib.strip() for lib in libs] - + libs = re.findall(r'(?P<arg>-l(?P<name>[^ ]+) ?)', compile_line) + if name_only: + libs = [lib_name.strip() for lib_arg, lib_name in libs] + else: + libs = [lib_arg.strip() for lib_arg, lib_name in libs] return " ".join(libs) def library_folders(self): diff --git a/pw_arduino_build/py/pw_arduino_build/unit_test_runner.py b/pw_arduino_build/py/pw_arduino_build/unit_test_runner.py index 8463f5864..0ef5d8fb3 100755 --- a/pw_arduino_build/py/pw_arduino_build/unit_test_runner.py +++ b/pw_arduino_build/py/pw_arduino_build/unit_test_runner.py @@ -79,9 +79,13 @@ def parse_args(): parser.add_argument('--verbose', '-v', dest='verbose', - action="store_true", + action='store_true', help='Output additional logs as the script runs') + parser.add_argument('--flash-only', + action='store_true', + help="Don't check for test output after flashing.") + # arduino_builder arguments # TODO(tonymd): Get these args from __main__.py or elsewhere. parser.add_argument("-c", @@ -212,7 +216,7 @@ def handle_test_results(test_output): _LOG.info('Test passed!') -def run_device_test(binary, port, baud, test_timeout, upload_tool, +def run_device_test(binary, flash_only, port, baud, test_timeout, upload_tool, arduino_package_path, test_runner_args) -> bool: """Flashes, runs, and checks an on-device test binary. @@ -258,6 +262,8 @@ def run_device_test(binary, port, baud, test_timeout, upload_tool, # this serial port. flash_device(test_runner_args, upload_tool) wait_for_port(port) + if flash_only: + return True result.append(read_serial(port, baud, test_timeout)) if result: handle_test_results(result[0]) @@ -337,6 +343,7 @@ def main(): arduino_builder_args += ["--set-variable", var] if run_device_test(binary.as_posix(), + args.flash_only, args.port, args.baud, args.test_timeout, |