forked from platformio/platformio-core
Initial support for MBED Framework
This commit is contained in:
1 parent
4a8cd9914b
commit
d3b9322d3b
7 files changed
+326
-9
No files matched your search
@@ -0,0 +1,140 @@
|
||||
# Copyright (C) Ivan Kravets <me@ikravets.com>
|
||||
# See LICENSE for details.
|
||||
|
||||
"""
|
||||
Build script for Mbed Framework
|
||||
"""
|
||||
|
||||
import xml.etree.ElementTree as ElementTree
|
||||
from binascii import crc32
|
||||
from os.path import join, normpath
|
||||
|
||||
from SCons.Script import DefaultEnvironment
|
||||
|
||||
env = DefaultEnvironment()
|
||||
|
||||
BOARD_OPTS = env.get("BOARD_OPTIONS", {}).get("build", {})
|
||||
|
||||
env.Replace(
|
||||
PLATFORMFW_DIR=join("$PIOPACKAGES_DIR", "framework-mbed")
|
||||
)
|
||||
|
||||
MBED_VARIANTS = {
|
||||
"stm32f3discovery": "DISCO_F303VC",
|
||||
"stm32f4discovery": "DISCO_F407VG",
|
||||
"stm32f429discovery": "DISCO_F429ZI",
|
||||
"blueboard_lpc11u24": "LPC11U24",
|
||||
"dipcortexm0": "LPC11U24",
|
||||
"seeeduinoArchPro": "ARCH_PRO",
|
||||
"ubloxc027": "UBLOX_C027",
|
||||
"lpc1114fn28": "LPC1114",
|
||||
"lpc11u35": "LPC11U35_401",
|
||||
"mbuino": "LPC11U24",
|
||||
"nrf51_mkit": "NRF51822",
|
||||
"redBearLab": "NRF51822",
|
||||
"nrf51-dt": "NRF51_DK",
|
||||
"redBearLabBLENano": "NRF51822",
|
||||
"wallBotBLE": "NRF51822",
|
||||
"frdm_kl25z": "KL25Z",
|
||||
"frdm_kl46z": "KL46Z",
|
||||
"frdm_k64f": "K64F",
|
||||
"frdm_kl05z": "KL05Z",
|
||||
"frdm_k20d50m": "K20D50M",
|
||||
"frdm_k22f": "K22F"
|
||||
}
|
||||
|
||||
|
||||
def parse_eix_file(filename):
|
||||
result = {}
|
||||
paths = (
|
||||
("CFLAGS", "./Target/Source/CC/Switch"),
|
||||
("CXXFLAGS", "./Target/Source/CPPC/Switch"),
|
||||
("CPPDEFINES", "./Target/Source/Symbols/Symbol"),
|
||||
("FILES", "./Target/Files/File"),
|
||||
("LINKFLAGS", "./Target/Source/LD/Switch"),
|
||||
("STDLIBS", "./Target/Source/Syslibs/Library"),
|
||||
("LDSCRIPT_PATH", "./Target/Source/Scriptfile"),
|
||||
("CPPPATH", "./Target/Compiler/Includepaths/Includepath")
|
||||
)
|
||||
|
||||
tree = ElementTree.parse(filename)
|
||||
|
||||
for (key, path) in paths:
|
||||
if key not in result:
|
||||
result[key] = []
|
||||
|
||||
for node in tree.findall(path):
|
||||
_nkeys = node.keys()
|
||||
result[key].append(
|
||||
node.get(_nkeys[0]) if len(_nkeys) == 1 else node.attrib)
|
||||
|
||||
return result
|
||||
|
||||
|
||||
def get_source_files(flist):
|
||||
files = []
|
||||
for f in flist:
|
||||
if f['type'] == "h" or not f['name'].startswith("mbed"):
|
||||
continue
|
||||
files.append(join("$BUILD_DIR", "FrameworkMBED", f['name'][5:]))
|
||||
return files
|
||||
|
||||
|
||||
def get_build_flags(data):
|
||||
flags = {}
|
||||
cflags = set(data.get("CFLAGS", []))
|
||||
cxxflags = set(data.get("CXXFLAGS", []))
|
||||
cppflags = set(cflags & cxxflags)
|
||||
flags['CPPFLAGS'] = list(cppflags)
|
||||
flags['CXXFLAGS'] = list(cxxflags - cppflags)
|
||||
flags['CFLAGS'] = list(cflags - cppflags)
|
||||
return flags
|
||||
|
||||
board_type = env.subst("$BOARD")
|
||||
variant = MBED_VARIANTS[
|
||||
board_type] if board_type in MBED_VARIANTS else board_type.upper()
|
||||
eixdata = parse_eix_file(
|
||||
join(env.subst("$PLATFORMFW_DIR"), "variant", variant, "%s.eix" % variant))
|
||||
|
||||
build_flags = get_build_flags(eixdata)
|
||||
env.Replace(
|
||||
CPPFLAGS=build_flags.get("CPPFLAGS", []),
|
||||
CFLAGS=build_flags.get("CFLAGS", []),
|
||||
CXXFLAGS=build_flags.get("CXXFLAGS", []),
|
||||
LINKFLAGS=eixdata.get("LINKFLAGS", []),
|
||||
CPPDEFINES=[define for define in eixdata.get("CPPDEFINES", [])],
|
||||
LDSCRIPT_PATH=normpath(join(
|
||||
"$PLATFORMFW_DIR", "core", eixdata.get("LDSCRIPT_PATH")[0][5:]))
|
||||
)
|
||||
|
||||
# Hook for K64F and K22F
|
||||
if board_type in ("frdm_k22f", "frdm_k64f"):
|
||||
env.Append(
|
||||
LINKFLAGS=["-Wl,--start-group"]
|
||||
)
|
||||
|
||||
for lib_path in eixdata.get("CPPPATH"):
|
||||
_vdir = join("$BUILD_DIR", "FrameworkMbedInc%d" % crc32(lib_path))
|
||||
env.VariantDir(
|
||||
_vdir,
|
||||
join("$PLATFORMFW_DIR", "core", lib_path[5:])
|
||||
)
|
||||
env.Append(CPPPATH=[_vdir])
|
||||
|
||||
|
||||
#
|
||||
# Target: Build MBED Library
|
||||
#
|
||||
|
||||
libs = [l for l in eixdata.get("STDLIBS", []) if l not in env.get("LIBS")]
|
||||
|
||||
env.VariantDir(
|
||||
join("$BUILD_DIR", "FrameworkMBED"),
|
||||
join("$PLATFORMFW_DIR", "core")
|
||||
)
|
||||
libs.append(env.Library(
|
||||
join("$BUILD_DIR", "FrameworkMBED"),
|
||||
get_source_files(eixdata.get("FILES", []))
|
||||
))
|
||||
|
||||
env.Append(LIBS=libs)
|
||||
Reference in new issue
Block a user