scripts: rework edtlib warnings-turned-errors

Create a "global" gen_defines.py option and edtlib.EDT constructor
kwarg that turns edtlib-specific warnings into errors. This applies to
edtlib-specific warnings only. Warnings that are just dupes of dtc
warnings are not affected.

Use it from twister to increase DT testing coverage in upstream zephyr.

Signed-off-by: Martí Bolívar <marti.bolivar@nordicsemi.no>
This commit is contained in:
Martí Bolívar 2021-07-30 15:43:27 -07:00 committed by Kumar Gala
commit c4079e4be2
3 changed files with 20 additions and 14 deletions

View file

@ -69,8 +69,7 @@ def main():
"-Wno-simple_bus_reg" not in args.dtc_flags, "-Wno-simple_bus_reg" not in args.dtc_flags,
default_prop_types=True, default_prop_types=True,
infer_binding_for_paths=["/zephyr,user"], infer_binding_for_paths=["/zephyr,user"],
err_on_deprecated_properties= werror=args.edtlib_Werror,
args.err_on_deprecated_properties,
vendor_prefixes=vendor_prefixes) vendor_prefixes=vendor_prefixes)
except edtlib.EDTError as e: except edtlib.EDTError as e:
sys.exit(f"devicetree error: {e}") sys.exit(f"devicetree error: {e}")
@ -217,8 +216,10 @@ def parse_args():
help="path to write pickled edtlib.EDT object to") help="path to write pickled edtlib.EDT object to")
parser.add_argument("--vendor-prefixes", parser.add_argument("--vendor-prefixes",
help="vendor-prefixes.txt path; used for validation") help="vendor-prefixes.txt path; used for validation")
parser.add_argument("--err-on-deprecated-properties", action="store_true", parser.add_argument("--edtlib-Werror", action="store_true",
help="if set, deprecated property usage is an error") help="if set, edtlib-specific warnings become errors. "
"(this does not apply to warnings shared "
"with dtc.)")
return parser.parse_args() return parser.parse_args()

View file

@ -150,8 +150,8 @@ class EDT:
default_prop_types=True, default_prop_types=True,
support_fixed_partitions_on_any_bus=True, support_fixed_partitions_on_any_bus=True,
infer_binding_for_paths=None, infer_binding_for_paths=None,
err_on_deprecated_properties=False, vendor_prefixes=None,
vendor_prefixes=None): werror=False):
"""EDT constructor. """EDT constructor.
dts: dts:
@ -180,20 +180,22 @@ class EDT:
should be inferred from the node content. (Child nodes are not should be inferred from the node content. (Child nodes are not
processed.) Pass none if no nodes should support inferred bindings. processed.) Pass none if no nodes should support inferred bindings.
err_on_deprecated_properties (default: False):
If True and 'dts' has any deprecated properties set, raise an error.
vendor_prefixes (default: None): vendor_prefixes (default: None):
A dict mapping vendor prefixes in compatible properties to their A dict mapping vendor prefixes in compatible properties to their
descriptions. If given, compatibles in the form "manufacturer,device" descriptions. If given, compatibles in the form "manufacturer,device"
for which "manufacturer" is neither a key in the dict nor a specially for which "manufacturer" is neither a key in the dict nor a specially
exempt set of grandfathered-in cases will cause warnings. exempt set of grandfathered-in cases will cause warnings.
werror (default: False):
If True, some edtlib specific warnings become errors. This currently
errors out if 'dts' has any deprecated properties set, or an unknown
vendor prefix is used.
""" """
self._warn_reg_unit_address_mismatch = warn_reg_unit_address_mismatch self._warn_reg_unit_address_mismatch = warn_reg_unit_address_mismatch
self._default_prop_types = default_prop_types self._default_prop_types = default_prop_types
self._fixed_partitions_no_bus = support_fixed_partitions_on_any_bus self._fixed_partitions_no_bus = support_fixed_partitions_on_any_bus
self._infer_binding_for_paths = set(infer_binding_for_paths or []) self._infer_binding_for_paths = set(infer_binding_for_paths or [])
self._err_on_deprecated_properties = bool(err_on_deprecated_properties) self._werror = bool(werror)
self._vendor_prefixes = vendor_prefixes self._vendor_prefixes = vendor_prefixes
self.dts_path = dts self.dts_path = dts
@ -426,8 +428,7 @@ class EDT:
# they (either always or sometimes) reference other nodes, so we # they (either always or sometimes) reference other nodes, so we
# run them separately # run them separately
node._init_props(default_prop_types=self._default_prop_types, node._init_props(default_prop_types=self._default_prop_types,
err_on_deprecated= err_on_deprecated=self._werror)
self._err_on_deprecated_properties)
node._init_interrupts() node._init_interrupts()
node._init_pinctrls() node._init_pinctrls()
@ -519,7 +520,11 @@ class EDT:
vendor = compat.split(',', 1)[0] vendor = compat.split(',', 1)[0]
if vendor not in self._vendor_prefixes and \ if vendor not in self._vendor_prefixes and \
vendor not in _VENDOR_PREFIX_ALLOWED: vendor not in _VENDOR_PREFIX_ALLOWED:
_LOG.warning( if self._werror:
log_fn = _LOG.error
else:
log_fn = _LOG.warning
log_fn(
f"node '{node.path}' compatible '{compat}' " f"node '{node.path}' compatible '{compat}' "
f"has unknown vendor prefix '{vendor}'") f"has unknown vendor prefix '{vendor}'")

View file

@ -2008,7 +2008,7 @@ class CMake():
ldflags = "-Wl,--fatal-warnings" ldflags = "-Wl,--fatal-warnings"
cflags = "-Werror" cflags = "-Werror"
aflags = "-Wa,--fatal-warnings" aflags = "-Wa,--fatal-warnings"
gen_defines_args = "--err-on-deprecated-properties" gen_defines_args = "--edtlib-Werror"
else: else:
ldflags = cflags = aflags = "" ldflags = cflags = aflags = ""
gen_defines_args = "" gen_defines_args = ""