mirror of
https://github.com/zephyrproject-rtos/zephyr
synced 2025-09-14 06:01:57 +00:00
Disables allowing the python argparse library from automatically shortening command line arguments, this prevents issues whereby a new command is added and code that wrongly uses the shortened command of an existing argument which is the same as the new command being added will silently change script behaviour. Signed-off-by: Jamie McCrae <jamie.mccrae@nordicsemi.no>
79 lines
2.5 KiB
Python
Executable File
79 lines
2.5 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
# Copyright (c) 2021 Intel Corporation
|
|
#
|
|
# SPDX-License-Identifier: Apache-2.0
|
|
|
|
# A script to diff between two ram or rom reports generated by
|
|
# size_report. When you call call the ram_report or rom_report targets you
|
|
# end up with a json file in the build directory that can be used as input
|
|
# for this script.
|
|
|
|
# The output shows which symbols increased and which decreased in size and
|
|
# also tracked added/remove symbols as well.
|
|
|
|
# Example:
|
|
# ./scripts/footprint/fpdiff.py ram1.json ram2.json
|
|
|
|
from anytree.importer import DictImporter
|
|
from anytree import PreOrderIter
|
|
from anytree.search import find
|
|
|
|
import colorama
|
|
from colorama import Fore
|
|
import json
|
|
import argparse
|
|
|
|
importer = DictImporter()
|
|
|
|
def parse_args():
|
|
parser = argparse.ArgumentParser(
|
|
description="Compare footprint sizes of two builds.", allow_abbrev=False)
|
|
parser.add_argument("file1", help="First file")
|
|
parser.add_argument("file2", help="Second file")
|
|
|
|
return parser.parse_args()
|
|
|
|
def main():
|
|
colorama.init()
|
|
|
|
args = parse_args()
|
|
|
|
with open(args.file1, "r") as f:
|
|
data1 = json.load(f)
|
|
|
|
with open(args.file2, "r") as f:
|
|
data2 = json.load(f)
|
|
|
|
for idx, ch in enumerate(data1['symbols']['children']):
|
|
root1 = importer.import_(ch)
|
|
root2 = importer.import_(data2['symbols']['children'][idx])
|
|
print(f"{root1.name}\n+++++++++++++++++++++")
|
|
|
|
for node in PreOrderIter(root1):
|
|
# pylint: disable=undefined-loop-variable
|
|
n = find(root2, lambda node2: node2.identifier == node.identifier)
|
|
if n:
|
|
if n.size != node.size:
|
|
diff = n.size - node.size
|
|
if diff == 0:
|
|
continue
|
|
if not n.children or not n.parent:
|
|
if diff < 0:
|
|
print(f"{n.identifier} -> {Fore.GREEN}{diff}{Fore.RESET}")
|
|
else:
|
|
print(f"{n.identifier} -> {Fore.RED}+{diff}{Fore.RESET}")
|
|
|
|
else:
|
|
if not node.children:
|
|
print(f"{node.identifier} ({Fore.GREEN}-{node.size}{Fore.RESET}) disappeared.")
|
|
|
|
for node in PreOrderIter(root2):
|
|
n = find(root1, lambda node2: node2.identifier == node.identifier)
|
|
if not n:
|
|
if not node.children and node.size != 0:
|
|
print(f"{node.identifier} ({Fore.RED}+{node.size}{Fore.RESET}) is new.")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|