diff --git a/HISTORY.rst b/HISTORY.rst index 2372d1a5..ef8cb989 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -4,15 +4,18 @@ Release History 2.0.0 (2015-??-??) ------------------ +* PlatformIO as :ref:`ci` (CI) tool for embedded projects + (`issue #108 `_) +* Initialise PlatformIO project for the specified IDE + (`issue #151 `_) * PlatformIO CLI 2.0: "platform" related commands have been moved to ``platformio platforms`` subcommand (`issue #158 `_) -* PlatformIO as Continuous Integration (CI) tool for embedded projects - (`issue #108 `_) * Created `PlatformIO gitter.im `_ room (`issue #174 `_) * Global ``-f, --force`` option which will force to accept any - confirmation prompts (`issue #152 `_) + confirmation prompts + (`issue #152 `_) * Run project with `platformio run --project-dir `_ option without changing the current working directory (`issue #192 `_) @@ -33,6 +36,11 @@ Release History (`issue #168 `_) * Specify `platformio init --env-prefix `__ when initialise/update project (`issue #182 `_) +* Added new Armstrap boards + (`issue #204 `_) +* Updated SDK for `espressif `__ + development platform to v1.1 + (`issue #179 `_) * Disabled automatic updates by default for platforms, packages and libraries (`issue #171 `_) * Fixed bug with creating copies of source files diff --git a/docs/userguide/cmd_init.rst b/docs/userguide/cmd_init.rst index a84694ff..6ca15cec 100644 --- a/docs/userguide/cmd_init.rst +++ b/docs/userguide/cmd_init.rst @@ -49,6 +49,14 @@ pre-fill these data: The full list with pre-configured boards is available here :ref:`platforms`. +.. option:: + --ide + +Initialise PlatformIO project for the specified IDE which can be imported later +via "Import Project" functionality. + +A list with supported IDE is available within ``platformio init --help`` command. + .. option:: --disable-auto-uploading diff --git a/platformio/__init__.py b/platformio/__init__.py index 357f664d..3c73d16f 100644 --- a/platformio/__init__.py +++ b/platformio/__init__.py @@ -1,7 +1,7 @@ # Copyright (C) Ivan Kravets # See LICENSE for details. -VERSION = (2, 0, "0a2") +VERSION = (2, 0, "0rc1") __version__ = ".".join([str(s) for s in VERSION]) __title__ = "platformio" diff --git a/platformio/builder/scripts/frameworks/arduino.py b/platformio/builder/scripts/frameworks/arduino.py index c7bb20ce..1761e0e9 100644 --- a/platformio/builder/scripts/frameworks/arduino.py +++ b/platformio/builder/scripts/frameworks/arduino.py @@ -106,20 +106,20 @@ env.Append( # if env.subst("${PLATFORMFW_DIR}")[-3:] == "sam": - env.VariantDir( + env.VariantDirWrap( join("$BUILD_DIR", "FrameworkCMSISInc"), join("$PLATFORMFW_DIR", "system", "CMSIS", "CMSIS", "Include") ) - env.VariantDir( + env.VariantDirWrap( join("$BUILD_DIR", "FrameworkDeviceInc"), join("$PLATFORMFW_DIR", "system", "CMSIS", "Device", "ATMEL") ) - env.VariantDir( + env.VariantDirWrap( join("$BUILD_DIR", "FrameworkLibSam"), join("$PLATFORMFW_DIR", "system", "libsam") ) - env.VariantDir( + env.VariantDirWrap( join("$BUILD_DIR", "FrameworkArduinoInc"), join("$PLATFORMFW_DIR", "cores", "${BOARD_OPTIONS['build']['core']}") ) diff --git a/platformio/builder/scripts/frameworks/cmsis.py b/platformio/builder/scripts/frameworks/cmsis.py index 6410c10f..2d8d55c7 100644 --- a/platformio/builder/scripts/frameworks/cmsis.py +++ b/platformio/builder/scripts/frameworks/cmsis.py @@ -25,7 +25,7 @@ env.Replace( PLATFORMFW_DIR=join("$PIOPACKAGES_DIR", "framework-cmsis") ) -env.VariantDir( +env.VariantDirWrap( join("$BUILD_DIR", "FrameworkCMSIS"), join("$PLATFORMFW_DIR", "cores", "${BOARD_OPTIONS['build']['core']}") ) diff --git a/platformio/builder/scripts/frameworks/energia.py b/platformio/builder/scripts/frameworks/energia.py index 67b4cc10..69bdb8fa 100644 --- a/platformio/builder/scripts/frameworks/energia.py +++ b/platformio/builder/scripts/frameworks/energia.py @@ -28,7 +28,7 @@ ENERGIA_VERSION = int( "version.txt")).read().replace(".", "").strip()) # include board variant -env.VariantDir( +env.VariantDirWrap( join("$BUILD_DIR", "FrameworkEnergiaVariant"), join("$PLATFORMFW_DIR", "variants", "${BOARD_OPTIONS['build']['variant']}") ) diff --git a/platformio/builder/scripts/frameworks/libopencm3.py b/platformio/builder/scripts/frameworks/libopencm3.py index a0336e77..72a762c5 100644 --- a/platformio/builder/scripts/frameworks/libopencm3.py +++ b/platformio/builder/scripts/frameworks/libopencm3.py @@ -138,7 +138,7 @@ if BOARD_BUILDOPTS.get("core") == "lm4f": CPPDEFINES=["LM4F"] ) -env.VariantDir( +env.VariantDirWrap( join("$BUILD_DIR", "FrameworkLibOpenCM3Variant"), join("$PLATFORMFW_DIR", "include") ) @@ -166,7 +166,7 @@ env.Replace( ) libs = [] -env.VariantDir( +env.VariantDirWrap( join("$BUILD_DIR", "FrameworkLibOpenCM3"), "$PLATFORMFW_DIR" ) diff --git a/platformio/builder/scripts/frameworks/mbed.py b/platformio/builder/scripts/frameworks/mbed.py index 763b85c3..e9e57ad0 100644 --- a/platformio/builder/scripts/frameworks/mbed.py +++ b/platformio/builder/scripts/frameworks/mbed.py @@ -134,7 +134,7 @@ def add_mbedlib(libname, libar): (libname.upper(), crc32(root))) if var_dir in env.get("CPPPATH"): continue - env.VariantDir(var_dir, root) + env.VariantDirWrap(var_dir, root) env.Append(CPPPATH=[var_dir]) @@ -221,7 +221,7 @@ if board_type in ("frdm_k22f", "frdm_k64f"): for lib_path in eixdata.get("CPPPATH"): _vdir = join("$BUILD_DIR", "FrameworkMbedInc%d" % crc32(lib_path)) - env.VariantDir(_vdir, join(variant_dir, lib_path)) + env.VariantDirWrap(_vdir, join(variant_dir, lib_path)) env.Append(CPPPATH=[_vdir]) env.Append( diff --git a/platformio/builder/scripts/frameworks/spl.py b/platformio/builder/scripts/frameworks/spl.py index 229e803b..130d8bf2 100644 --- a/platformio/builder/scripts/frameworks/spl.py +++ b/platformio/builder/scripts/frameworks/spl.py @@ -22,7 +22,7 @@ env.Replace( PLATFORMFW_DIR=join("$PIOPACKAGES_DIR", "framework-spl") ) -env.VariantDir( +env.VariantDirWrap( join("$BUILD_DIR", "FrameworkSPLInc"), join("$PLATFORMFW_DIR", "${BOARD_OPTIONS['build']['core']}", "variants", "${BOARD_OPTIONS['build']['variant']}", "inc") diff --git a/platformio/builder/tools/platformio.py b/platformio/builder/tools/platformio.py index 0af57e92..656473b7 100644 --- a/platformio/builder/tools/platformio.py +++ b/platformio/builder/tools/platformio.py @@ -2,12 +2,13 @@ # See LICENSE for details. import atexit +import json import re from os import getenv, listdir, remove, sep, walk from os.path import basename, dirname, isdir, isfile, join, normpath -from SCons.Script import (COMMAND_LINE_TARGETS, Exit, SConscript, - SConscriptChdir) +from SCons.Script import (COMMAND_LINE_TARGETS, DefaultEnvironment, Exit, + SConscript, SConscriptChdir) from SCons.Util import case_sensitive_suffixes from platformio.util import pioversion_to_intstr @@ -60,6 +61,15 @@ def BuildFirmware(env): print env.Dump() Exit() + if "idedata" in COMMAND_LINE_TARGETS: + _data = {"defines": [], "includes": []} + for item in env.get("VARIANT_DIRS", []): + _data['includes'].append(env.subst(item[1])) + for item in env.get("CPPDEFINES", []): + _data['defines'].append(env.subst(item)) + print json.dumps(_data) + Exit() + return firmenv.Program( join("$BUILD_DIR", "firmware"), [firmenv.GlobCXXFiles(vdir) for vdir in vdirs], @@ -94,6 +104,11 @@ def GlobCXXFiles(env, path): return files +def VariantDirWrap(env, variant_dir, src_dir, duplicate=True): + DefaultEnvironment().Append(VARIANT_DIRS=[(variant_dir, src_dir)]) + env.VariantDir(variant_dir, src_dir, duplicate) + + def VariantDirRecursive(env, variant_dir, src_dir, duplicate=True, ignore_pattern=None): if not ignore_pattern: @@ -105,7 +120,7 @@ def VariantDirRecursive(env, variant_dir, src_dir, duplicate=True, _var_dir = variant_dir + root.replace(src_dir, "") if any([s in _var_dir.lower() for s in ignore_pattern]): continue - env.VariantDir(_var_dir, _src_dir, duplicate) + env.VariantDirWrap(_var_dir, _src_dir, duplicate) variants.append(_var_dir) return variants @@ -397,6 +412,7 @@ def generate(env): env.AddMethod(BuildFirmware) env.AddMethod(ProcessFlags) env.AddMethod(GlobCXXFiles) + env.AddMethod(VariantDirWrap) env.AddMethod(VariantDirRecursive) env.AddMethod(BuildFramework) env.AddMethod(BuildLibrary) diff --git a/platformio/ide/projectgenerator.py b/platformio/ide/projectgenerator.py index 3f09249c..c63cf843 100644 --- a/platformio/ide/projectgenerator.py +++ b/platformio/ide/projectgenerator.py @@ -1,6 +1,7 @@ # Copyright (C) Ivan Kravets # See LICENSE for details. +import json from glob import glob from os import listdir, walk from os.path import basename, isdir, join @@ -37,13 +38,30 @@ class ProjectGenerator(object): data[k] = v return data + @util.memoized + def get_project_build_data(self): + envdata = self.get_project_env() + if "env_name" not in envdata: + return None + result = util.exec_command( + ["platformio", "run", "-t", "idedata", "-e", envdata['env_name']] + ) + if result['returncode'] != 0 or '{"includes":' not in result['out']: + return None + + output = result['out'] + start_index = output.index('---\n{"includes":') + stop_index = output.index('}\n===') + try: + return json.loads(output[start_index+4:stop_index+1]) + except ValueError: + pass + + return None + def get_project_name(self): return basename(self.project_dir) - @staticmethod - def get_includes(): - return [] - @staticmethod def get_srcfiles(): result = [] @@ -52,10 +70,6 @@ class ProjectGenerator(object): result.append(join(root, f)) return result - @staticmethod - def get_defines(): - return [] - def get_tpls(self): tpls_dir = join(util.get_source_dir(), "ide", "tpls", self.ide) return glob(join(tpls_dir, ".*.tpl")) + glob(join(tpls_dir, "*.tpl")) @@ -75,10 +89,14 @@ class ProjectGenerator(object): def _gather_tplvars(self): self._tplvars.update(self.get_project_env()) + build_data = self.get_project_build_data() + self._tplvars.update({ "project_name": self.get_project_name(), - "includes": self.get_includes(), + "includes": (build_data['includes'] + if build_data and "includes" in build_data else []), + "defines": (build_data['defines'] + if build_data and "defines" in build_data else []), "srcfiles": self.get_srcfiles(), - "defines": self.get_defines(), "project_dir": self.project_dir })