aboutsummaryrefslogtreecommitdiff
path: root/pw_arduino_build
diff options
context:
space:
mode:
authorAnthony DiGirolamo <tonymd@google.com>2020-10-31 20:31:54 -0700
committerCQ Bot Account <pigweed-scoped@luci-project-accounts.iam.gserviceaccount.com>2020-11-03 21:37:54 +0000
commitefdd24002f9721400c4cd0aab70909c5595d1fe7 (patch)
tree784c07015c29801a923388641d2667af6d3b027a /pw_arduino_build
parent1502a40b68dc6dd161a792aee03f979d677c18f1 (diff)
downloadpigweed-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__.py29
-rwxr-xr-xpw_arduino_build/py/pw_arduino_build/builder.py18
-rwxr-xr-xpw_arduino_build/py/pw_arduino_build/unit_test_runner.py11
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,