Created
August 18, 2014 16:36
-
-
Save ladislas/0a9929ec3b940b8eee89 to your computer and use it in GitHub Desktop.
Python script to auto-find libraries dependencies for gcc
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# !/usr/bin/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); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment