Skip to content

Commit b45d44e

Browse files
[config] Fixed gn parser implementation
The make_gn_args.py read args.tmp and uses argparse that treats any line starting with - as an option, not as a positional value for --arg-cflags. When including only a single -D option, for example in TF-M builds that only export -DTF_PSA_CRYPTO_CONFIG_FILE=... on target_cflags, the parser fails with argument --arg-cflags: expected 2 arguments Signed-off-by: Kamil Kasperczyk <kamil.kasperczyk@nordicsemi.no>
1 parent 50a2175 commit b45d44e

1 file changed

Lines changed: 56 additions & 6 deletions

File tree

config/common/cmake/make_gn_args.py

Lines changed: 56 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,16 @@
2020
import argparse
2121
import sys
2222

23+
class _GnArgs(object):
24+
"""Parsed GN arguments for write_gn_args()."""
25+
26+
def __init__(self):
27+
self.module = None
28+
self.arg = []
29+
self.arg_string = []
30+
self.arg_cflags = []
31+
32+
2333
GN_SPECIAL_SEPARATOR = "+|+"
2434
GN_CFLAG_EXCLUDES = [
2535
'-fno-asynchronous-unwind-tables',
@@ -73,13 +83,53 @@ def write_gn_args(args):
7383
key, "{}-".format(GN_SPECIAL_SEPARATOR).join(filtered_value), GN_SPECIAL_SEPARATOR, cflag_excludes))
7484

7585

86+
def parse_args_tmp_file(path):
87+
"""Parse args.tmp (one token per line).
88+
89+
argparse treats lines starting with '-' as options when using @file, which
90+
breaks when a --arg-cflags value is a single compiler flag.
91+
"""
92+
args = _GnArgs()
93+
with open(path, encoding='utf-8') as args_file:
94+
lines = [line.rstrip('\n\r') for line in args_file]
95+
96+
i = 0
97+
while i < len(lines):
98+
line = lines[i]
99+
if not line:
100+
i += 1
101+
continue
102+
if line == '--module':
103+
i += 1
104+
args.module = lines[i]
105+
i += 1
106+
elif line == '--arg-cflags':
107+
i += 1
108+
args.arg_cflags.append([lines[i], lines[i + 1]])
109+
i += 2
110+
elif line == '--arg-string':
111+
i += 1
112+
args.arg_string.append([lines[i], lines[i + 1]])
113+
i += 2
114+
elif line == '--arg':
115+
i += 1
116+
args.arg.append([lines[i], lines[i + 1]])
117+
i += 2
118+
else:
119+
raise ValueError('Unexpected line in {}: {!r}'.format(path, line))
120+
return args
121+
122+
76123
def main():
77-
parser = argparse.ArgumentParser(fromfile_prefix_chars='@')
78-
parser.add_argument('--module', action='store')
79-
parser.add_argument('--arg', action='append', nargs=2, default=[])
80-
parser.add_argument('--arg-string', action='append', nargs=2, default=[])
81-
parser.add_argument('--arg-cflags', action='append', nargs=2, default=[])
82-
args = parser.parse_args()
124+
if len(sys.argv) == 2 and sys.argv[1].startswith('@'):
125+
args = parse_args_tmp_file(sys.argv[1][1:])
126+
else:
127+
parser = argparse.ArgumentParser(fromfile_prefix_chars='@')
128+
parser.add_argument('--module', action='store')
129+
parser.add_argument('--arg', action='append', nargs=2, default=[])
130+
parser.add_argument('--arg-string', action='append', nargs=2, default=[])
131+
parser.add_argument('--arg-cflags', action='append', nargs=2, default=[])
132+
args = parser.parse_args()
83133
write_gn_args(args)
84134

85135

0 commit comments

Comments
 (0)