aboutsummaryrefslogtreecommitdiff
path: root/bin/auto-lib.py
blob: a0a1d4a26944567e5b62be1d811701ea934338a7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#!/usr/bin/env python

import os
import re
import sys

# Set variables
USER_LIB_PATH = sys.argv[1]
USER_LIBS = [] ;

includeRegex = re.compile("(?<=^\#include\s[\<\"])(.*)(?=\.h[\>\"])", re.DOTALL|re.M)

MAIN_SRCS = [] ;
MAIN_LIBS = [] ;

LIBS_DEPS = [] ;
LIBS_DEPS_STACK = [] ;

# Find local sources .ino, .c or .cpp
for file in os.listdir(os.curdir):
	if file.endswith((".c", ".cpp", ".ino")):
		MAIN_SRCS.append(file)

# Find all USER_LIBS
for path, dirs, files in os.walk(USER_LIB_PATH):
	for d in dirs:
		USER_LIBS.append(d)

# Find MAIN_LIBS included in MAIN_SRCS
for src in MAIN_SRCS:
	currentFile = open(src)
	includes = []

	for line in currentFile:
		match = includeRegex.search(line)
		if match:
			if match.group(1) in USER_LIBS:
				MAIN_LIBS.append(match.group(1))

MAIN_LIBS = list(sorted(MAIN_LIBS))

# Find LIBS_DEPS includes in MAIN_LIBS
for lib in MAIN_LIBS:
	if lib in USER_LIBS:
		currentFile = open(USER_LIB_PATH + "/" + lib + "/" + lib + ".h")

		for line in currentFile:
			match = includeRegex.search(line)
			if match:
				if match.group(1) in USER_LIBS and match.group(1) not in MAIN_LIBS:
					LIBS_DEPS_STACK.append(match.group(1))

LIBS_DEPS_STACK = sorted(set(LIBS_DEPS_STACK))

# Recursively find all dependencies of every libraries in USER_LIB_PATH
while LIBS_DEPS_STACK:
	for lib in LIBS_DEPS_STACK:
		if lib in USER_LIBS:
			currentFile = open(USER_LIB_PATH + "/" + lib + "/" + lib + ".h")

			for line in currentFile:
				match = includeRegex.search(line)
				if match:
					if match.group(1) in USER_LIBS and match.group(1) not in LIBS_DEPS_STACK or match.group(1) in LIBS_DEPS and match.group(1) not in MAIN_LIBS:
						LIBS_DEPS_STACK.append(match.group(1))

				else:
					LIBS_DEPS.append(lib)
					if lib in LIBS_DEPS_STACK:
						LIBS_DEPS_STACK.remove(lib)

	LIBS_DEPS_STACK = sorted(set(LIBS_DEPS_STACK))
	# print(LIBS_DEPS_STACK)

LIBS_DEPS = sorted(set(LIBS_DEPS))

# print("Main libraries: ")
# print(MAIN_LIBS);
# print("")
# print("Dependencies stack: ")
# print(LIBS_DEPS_STACK)
# print("")
# print("Libraries dependencies: ")
# print(LIBS_DEPS);

def outputLibs(libArray):
	for lib in libArray:
		print(lib),
	print("")

print("MAIN_LIBS"),
outputLibs(MAIN_LIBS)

print("LIBS_DEPS"),
outputLibs(LIBS_DEPS)