Resolved issue #1"Build referred libraries"

This commit is contained in:
Ivan Kravets
2014-06-15 20:44:34 +03:00
parent 2fea0377d3
commit 52ca2426fa
3 changed files with 54 additions and 6 deletions

View File

@@ -23,6 +23,7 @@ ARDUINO_FLAGS = [
"-DARDUINO=%d" % ARDUINO_VERSION, "-DARDUINO=%d" % ARDUINO_VERSION,
"-DARDUINO_%s" % BOARD_OPTIONS['build.board'] "-DARDUINO_%s" % BOARD_OPTIONS['build.board']
] ]
# usb flags # usb flags
if "build.usb_product" in BOARD_OPTIONS: if "build.usb_product" in BOARD_OPTIONS:
ARDUINO_FLAGS += [ 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( env.Append(
ASFLAGS=ARDUINO_FLAGS, ASFLAGS=ARDUINO_FLAGS,
CCFLAGS=ARDUINO_FLAGS, CCFLAGS=ARDUINO_FLAGS,
CPPPATH=[ CPPPATH=[
join("$BUILD_DIR", "core"), join("$BUILD_DIR", "core"),
join("$PLATFORMFW_DIR", "variants", BOARD_OPTIONS['build.variant']) join("$BUILD_DIR", "variant")
] ]
) )

View File

@@ -24,12 +24,18 @@ ENERGIA_FLAGS = [
"-DENERGIA=%d" % ENERGIA_VERSION "-DENERGIA=%d" % ENERGIA_VERSION
] ]
# include board variant
env.VariantDir(
join("$BUILD_DIR", "variant"),
join("$PLATFORMFW_DIR", "variants", BOARD_OPTIONS['build.variant'])
)
env.Append( env.Append(
ASFLAGS=ENERGIA_FLAGS, ASFLAGS=ENERGIA_FLAGS,
CCFLAGS=ENERGIA_FLAGS, CCFLAGS=ENERGIA_FLAGS,
CPPPATH=[ CPPPATH=[
join("$BUILD_DIR", "core"), join("$BUILD_DIR", "core"),
join("$PLATFORMFW_DIR", "variants", BOARD_OPTIONS['build.variant']) join("$BUILD_DIR", "variant")
] ]
) )

View File

@@ -1,8 +1,9 @@
# Copyright (C) Ivan Kravets <me@ikravets.com> # Copyright (C) Ivan Kravets <me@ikravets.com>
# See LICENSE for details. # See LICENSE for details.
from os import walk import re
from os.path import isfile, join from os import listdir, walk
from os.path import isdir, isfile, join
from time import sleep from time import sleep
from serial import Serial 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): def BuildFirmware(env, libslist):
src = env.Clone() src = env.Clone()
vdirs = src.VariantDirRecursive(join("$BUILD_DIR", "src"), vdirs = src.VariantDirRecursive(
join("$PROJECT_DIR", "src")) 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( return src.Program(
join("$BUILD_DIR", "firmware"), join("$BUILD_DIR", "firmware"),
[src.GlobCXXFiles(vdir) for vdir in vdirs], [src.GlobCXXFiles(vdir) for vdir in vdirs],
@@ -38,6 +63,14 @@ def GlobCXXFiles(env, path):
return files 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): def VariantDirRecursive(env, variant_dir, src_dir, duplicate=True):
# add root dir by default # add root dir by default
variants = [variant_dir] variants = [variant_dir]
@@ -101,8 +134,10 @@ def exists(_):
def generate(env): def generate(env):
env.AddMethod(BuildLibrary) env.AddMethod(BuildLibrary)
env.AddMethod(BuildDependentLibraries)
env.AddMethod(BuildFirmware) env.AddMethod(BuildFirmware)
env.AddMethod(GlobCXXFiles) env.AddMethod(GlobCXXFiles)
env.AddMethod(GetDependentLibraries)
env.AddMethod(VariantDirRecursive) env.AddMethod(VariantDirRecursive)
env.AddMethod(ParseBoardOptions) env.AddMethod(ParseBoardOptions)
env.AddMethod(ResetDevice) env.AddMethod(ResetDevice)