diff --git a/Arduino.mk b/Arduino.mk index 951b855..414ef31 100644 --- a/Arduino.mk +++ b/Arduino.mk @@ -767,12 +767,12 @@ endif # Automatically find the libraries needed to compile the sketch ifndef MAIN_LIBS - MAIN_LIBS = $(shell $(ARDMK_DIR)/bin/auto-lib.py $(USER_LIB_PATH) | \ + MAIN_LIBS = $(shell $(ARDMK_DIR)/bin/auto-lib $(USER_LIB_PATH) | \ sed -ne 's/MAIN_LIBS \(.*\) /\1/p') endif ifndef LIBS_DEPS - LIBS_DEPS = $(shell $(ARDMK_DIR)/bin/auto-lib.py $(USER_LIB_PATH) | \ + LIBS_DEPS = $(shell $(ARDMK_DIR)/bin/auto-lib $(USER_LIB_PATH) | \ sed -ne 's/LIBS_DEPS \(.*\) /\1/p') endif diff --git a/bin/auto-lib b/bin/auto-lib new file mode 100755 index 0000000..30a1bd9 --- /dev/null +++ b/bin/auto-lib @@ -0,0 +1,90 @@ +#!/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) diff --git a/bin/auto-lib.py b/bin/auto-lib.py deleted file mode 100755 index 77d69f6..0000000 --- a/bin/auto-lib.py +++ /dev/null @@ -1,87 +0,0 @@ -#!/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)