Arduino-Makefile/bin/auto-lib
2014-09-01 11:05:46 +02:00

90 lines
2 KiB
Python
Executable file

#!/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
FILE_END = (".c", ".cpp", ".ino")
MAIN_SRCS = [f for f in os.listdir(os.curdir) if f.endswith(FILE_END)]
# 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)
for line in currentFile:
match = includeRegex.search(line)
if match is not None:
group = match.group(1)
if group in USER_LIBS:
MAIN_LIBS.append(group)
MAIN_LIBS = sorted(set(MAIN_LIBS))
# Find LIBS_DEPS includes in MAIN_LIBS
for lib in MAIN_LIBS:
if lib in USER_LIBS:
currentFile = open(os.path.join(USER_LIB_PATH, lib, lib + ".h"))
for line in currentFile:
match = includeRegex.search(line)
if match is not None:
group = match.group(1)
if group in USER_LIBS and group not in MAIN_LIBS:
LIBS_DEPS_STACK.append(group)
LIBS_DEPS_STACK = list(set(LIBS_DEPS_STACK))
# Recursively find all dependencies of every libraries in USER_LIB_PATH
while len(LIBS_DEPS_STACK) > 0:
for lib in LIBS_DEPS_STACK:
if lib in USER_LIBS:
currentFile = open(os.path.join(USER_LIB_PATH, lib, lib + ".h"))
for line in currentFile:
match = includeRegex.search(line)
if match is not None:
group = match.group(1)
if group in USER_LIBS and group not in LIBS_DEPS_STACK and group not in LIBS_DEPS and group not in MAIN_LIBS:
LIBS_DEPS_STACK.append(group)
else:
if lib not in LIBS_DEPS:
LIBS_DEPS.append(lib)
if lib in LIBS_DEPS_STACK:
LIBS_DEPS_STACK.remove(lib)
LIBS_DEPS.sort()
# Output libraries for the Makefile
print("MAIN_LIBS"),
outputLibs(MAIN_LIBS)
print("LIBS_DEPS"),
outputLibs(LIBS_DEPS)