diff --git a/platformio/builder/scripts/frameworks/arduino.py b/platformio/builder/scripts/frameworks/arduino.py index fc7b6bbd..345b5a30 100644 --- a/platformio/builder/scripts/frameworks/arduino.py +++ b/platformio/builder/scripts/frameworks/arduino.py @@ -23,6 +23,7 @@ ARDUINO_FLAGS = [ "-DARDUINO=%d" % ARDUINO_VERSION, "-DARDUINO_%s" % BOARD_OPTIONS['build.board'] ] + # usb flags if "build.usb_product" in BOARD_OPTIONS: ARDUINO_FLAGS += [ @@ -32,12 +33,18 @@ if "build.usb_product" in BOARD_OPTIONS: '"', "") ] +# include board variant +env.VariantDir( + join("$BUILD_DIR", "variant"), + join("$PLATFORMFW_DIR", "variants", BOARD_OPTIONS['build.variant']) +) + env.Append( ASFLAGS=ARDUINO_FLAGS, CCFLAGS=ARDUINO_FLAGS, CPPPATH=[ join("$BUILD_DIR", "core"), - join("$PLATFORMFW_DIR", "variants", BOARD_OPTIONS['build.variant']) + join("$BUILD_DIR", "variant") ] ) diff --git a/platformio/builder/scripts/frameworks/energia.py b/platformio/builder/scripts/frameworks/energia.py index f69bed88..4169b084 100644 --- a/platformio/builder/scripts/frameworks/energia.py +++ b/platformio/builder/scripts/frameworks/energia.py @@ -24,12 +24,18 @@ ENERGIA_FLAGS = [ "-DENERGIA=%d" % ENERGIA_VERSION ] +# include board variant +env.VariantDir( + join("$BUILD_DIR", "variant"), + join("$PLATFORMFW_DIR", "variants", BOARD_OPTIONS['build.variant']) +) + env.Append( ASFLAGS=ENERGIA_FLAGS, CCFLAGS=ENERGIA_FLAGS, CPPPATH=[ join("$BUILD_DIR", "core"), - join("$PLATFORMFW_DIR", "variants", BOARD_OPTIONS['build.variant']) + join("$BUILD_DIR", "variant") ] ) diff --git a/platformio/builder/tools/platformio.py b/platformio/builder/tools/platformio.py index a9466ee0..fc8aa0b6 100644 --- a/platformio/builder/tools/platformio.py +++ b/platformio/builder/tools/platformio.py @@ -1,8 +1,9 @@ # Copyright (C) Ivan Kravets # See LICENSE for details. -from os import walk -from os.path import isfile, join +import re +from os import listdir, walk +from os.path import isdir, isfile, join from time import sleep from serial import Serial @@ -17,10 +18,34 @@ def BuildLibrary(env, variant_dir, library_dir): ) +def BuildDependentLibraries(env, src_dir): + libs = [] + for deplibfile in env.GetDependentLibraries(src_dir): + 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): + if not isfile(join(lsd_dir, libname, deplibfile)): + continue + _libbuild_dir = join("$BUILD_DIR", libname) + env.Append(CPPPATH=[_libbuild_dir]) + libs.append( + env.BuildLibrary(_libbuild_dir, join(lsd_dir, libname))) + return libs + + def BuildFirmware(env, libslist): src = env.Clone() - vdirs = src.VariantDirRecursive(join("$BUILD_DIR", "src"), - join("$PROJECT_DIR", "src")) + vdirs = src.VariantDirRecursive( + join("$BUILD_DIR", "src"), join("$PROJECT_DIR", "src")) + + # build source's dependent libs + for vdir in vdirs: + _libs = src.BuildDependentLibraries(vdir) + if _libs: + libslist += _libs + return src.Program( join("$BUILD_DIR", "firmware"), [src.GlobCXXFiles(vdir) for vdir in vdirs], @@ -38,6 +63,14 @@ def GlobCXXFiles(env, path): return files +def GetDependentLibraries(env, src_dir): + deplibs = [] + regexp = re.compile(r"^#include\s+<([^>]+)>", re.M) + for node in env.GlobCXXFiles(src_dir): + deplibs += regexp.findall(node.get_text_contents()) + return deplibs + + def VariantDirRecursive(env, variant_dir, src_dir, duplicate=True): # add root dir by default variants = [variant_dir] @@ -101,8 +134,10 @@ def exists(_): def generate(env): env.AddMethod(BuildLibrary) + env.AddMethod(BuildDependentLibraries) env.AddMethod(BuildFirmware) env.AddMethod(GlobCXXFiles) + env.AddMethod(GetDependentLibraries) env.AddMethod(VariantDirRecursive) env.AddMethod(ParseBoardOptions) env.AddMethod(ResetDevice)