From ca312309280c84f917f75f1c7fca030be4a3c641 Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Fri, 2 Jan 2015 23:14:45 +0200 Subject: [PATCH] Improve lib scanner --- platformio/builder/tools/platformio.py | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/platformio/builder/tools/platformio.py b/platformio/builder/tools/platformio.py index d76eea5f..732d71b8 100644 --- a/platformio/builder/tools/platformio.py +++ b/platformio/builder/tools/platformio.py @@ -35,9 +35,7 @@ def BuildFirmware(env, corelibs): join("$BUILD_DIR", "src"), join("$PROJECT_DIR", "src")) # build dependent libs - deplibs = [] - for vdir in vdirs: - deplibs += src.BuildDependentLibraries(vdir) + deplibs = src.BuildDependentLibraries(vdirs) src.MergeFlags(getenv("PIOSRCBUILD_FLAGS", "$SRCBUILD_FLAGS")) @@ -67,9 +65,9 @@ def BuildLibrary(env, variant_dir, library_dir): ) -def BuildDependentLibraries(env, src_dir): +def BuildDependentLibraries(env, src_dirs): libs = [] - deplibs = env.GetDependentLibraries(src_dir) + deplibs = env.GetDependentLibraries(src_dirs) env.Append(CPPPATH=[join("$BUILD_DIR", l) for (l, _) in deplibs]) for (libname, inc_dir) in deplibs: @@ -80,10 +78,15 @@ def BuildDependentLibraries(env, src_dir): return libs -def GetDependentLibraries(env, src_dir): +def GetDependentLibraries(env, src_dirs): includes = {} + nodes = [] regexp = re.compile(r"^\s*#include\s+(?:\<|\")([^\>\"\']+)(?:\>|\")", re.M) - nodes = env.GlobCXXFiles(src_dir) + env.Glob(join(src_dir, "*.h")) + + for item in src_dirs: + nodes += env.GlobCXXFiles(item) + nodes += env.Glob(join(item, "*.h")) + for node in nodes: env.ParseIncludesRecurive(regexp, node, includes) includes = sorted(includes.items(), key=lambda s: s[0]) @@ -108,10 +111,12 @@ def ParseIncludesRecurive(env, regexp, source_file, includes): for inc_fname in matches: if inc_fname in includes: continue + for lsd_dir in env['LIBSOURCE_DIRS']: lsd_dir = env.subst(lsd_dir) if not isdir(lsd_dir): continue + for libname in listdir(lsd_dir): inc_dir = join(lsd_dir, libname) inc_file = join(inc_dir, inc_fname) @@ -121,6 +126,7 @@ def ParseIncludesRecurive(env, regexp, source_file, includes): inc_file = join(inc_dir, inc_fname) if not isfile(inc_file): continue + includes[inc_fname] = (len(includes) + 1, libname, inc_dir) env.ParseIncludesRecurive(regexp, env.File(inc_file), includes)