aboutsummaryrefslogtreecommitdiff
path: root/bin/auto-lib.py
diff options
context:
space:
mode:
Diffstat (limited to 'bin/auto-lib.py')
-rwxr-xr-xbin/auto-lib.py87
1 files changed, 87 insertions, 0 deletions
diff --git a/bin/auto-lib.py b/bin/auto-lib.py
new file mode 100755
index 0000000..77d69f6
--- /dev/null
+++ b/bin/auto-lib.py
@@ -0,0 +1,87 @@
+#!/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 = [] ;
+
+# Define functions
+def outputLibs(libArray):
+ for lib in libArray:
+ print(lib),
+ print("")
+
+# 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))
+
+LIBS_DEPS = sorted(set(LIBS_DEPS))
+
+# Output libraries for the Makefile
+print("MAIN_LIBS"),
+outputLibs(MAIN_LIBS)
+
+print("LIBS_DEPS"),
+outputLibs(LIBS_DEPS)