Allows for an arbitrary path to be applied to kernel_all.c in case the build is not happening in the current working directory
59 lines
1.4 KiB
Python
Executable file
59 lines
1.4 KiB
Python
Executable file
#!/usr/bin/env python
|
|
"""
|
|
Script for reporting circular #includes in pre-processed sel4 source.
|
|
Exits with a status of 0 if no circular dependencies are found, otherwise
|
|
prints circular dependency and exits with a status of -1.
|
|
"""
|
|
|
|
import sys
|
|
import re
|
|
|
|
def main():
|
|
"""
|
|
Reads pre-processed sel4 source from standard input.
|
|
If a circular dependency is found, the chain of includes
|
|
resulting in the loop is printed out.
|
|
"""
|
|
|
|
kernel_all_re = re.compile(r'^# 1 ".*kernel_all\.c"')
|
|
header_re = re.compile(r'^# (\d+) "(.*\..)"')
|
|
|
|
file_stack = []
|
|
|
|
for line in sys.stdin:
|
|
|
|
if kernel_all_re.match(line):
|
|
continue
|
|
|
|
match = header_re.match(line)
|
|
|
|
if match is None:
|
|
continue
|
|
|
|
depth = int(match.group(1))
|
|
header = match.group(2)
|
|
|
|
if depth == 1:
|
|
# found a new header
|
|
if header in file_stack:
|
|
print("Circular includes found:")
|
|
print("\n".join(file_stack))
|
|
print(header)
|
|
return -1
|
|
else:
|
|
file_stack.append(header)
|
|
else:
|
|
# popped back up to an earlier header
|
|
while file_stack[-1] != header:
|
|
file_stack.pop()
|
|
|
|
return 0
|
|
|
|
if __name__ == "__main__":
|
|
|
|
if len(sys.argv) != 1:
|
|
print("Usage: %s < path/to/kernel_all.c_pp" % sys.argv[0])
|
|
print(__doc__)
|
|
sys.exit(-1)
|
|
|
|
sys.exit(main())
|