From 829d5781a5ecaaa5740ba0365d863f4e32ed8045 Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Fri, 19 Jun 2015 15:29:22 +0300 Subject: [PATCH] Allow to launch own extra script before firmware building/uploading processes // Resolve #239 --- HISTORY.rst | 9 ++++-- docs/envvars.rst | 7 +++++ docs/projectconf.rst | 37 +++++++++++++++++++++++++ platformio/__init__.py | 2 +- platformio/builder/main.py | 18 ++++++++++-- platformio/builder/tools/platformio.py | 38 +++++++++----------------- 6 files changed, 80 insertions(+), 31 deletions(-) diff --git a/HISTORY.rst b/HISTORY.rst index 1a18015a..7c5e7152 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -4,10 +4,13 @@ Release History 2.2.0 (2015-??-??) ------------------ -* Allowed to specify own path to the linker script (ld) using - `build_flags `__ option +* Launch own extra script before firmware building/uploading processes + (`issue #239 `_) +* Specify own path to the linker script (ld) using + `build_flags `__ + option (`issue #233 `_) -* Allowed to specify library compatibility with the all platforms/frameworks +* Specify library compatibility with the all platforms/frameworks using ``*`` symbol in `library.json `__ * Fixed ``stk500v2_command(): command failed`` diff --git a/docs/envvars.rst b/docs/envvars.rst index 25414e27..95a441f5 100644 --- a/docs/envvars.rst +++ b/docs/envvars.rst @@ -84,6 +84,13 @@ PLATFORMIO_LDF_CYCLIC Allows to set :ref:`projectconf` option :ref:`projectconf_ldf_cyclic`. +.. _envvar_PLATFORMIO_EXTRA_SCRIPT: + +PLATFORMIO_EXTRA_SCRIPT +~~~~~~~~~~~~~~~~~~~~~~~ + +Allows to set :ref:`projectconf` option :ref:`projectconf_extra_script`. + Settings -------- diff --git a/docs/projectconf.rst b/docs/projectconf.rst index 6a39b887..1d8462c4 100644 --- a/docs/projectconf.rst +++ b/docs/projectconf.rst @@ -384,6 +384,43 @@ Example: [env:libs_with_enabled_ldf_cyclic] ldf_cyclic = True +.. _projectconf_extra_script: + +``extra_script`` +^^^^^^^^^^^^^^^^ + +Allows to launch extra script using `SCons `_ software +construction tool. For more details please follow to "Construction Environments" +section of +`SCons documentation `_. + +This option can be set by global environment variable +:ref:`envvar_PLATFORMIO_EXTRA_SCRIPT`. + +Example, specify own upload command for :ref:`platform_atmelavr`: + +``platformio.ini``: + +.. code-block:: ini + + [env:env_with_specific_extra_script] + platform = atmelavr + extra_script = /path/to/extra_script.py + +``extra_script.py``: + +.. code-block:: python + + from SCons.Script import DefaultEnvironment + + env = DefaultEnvironment() + + env.Replace(UPLOADHEXCMD='"$UPLOADER" --uploader --flags') + + # uncomment line below to see environment variables + # print env.Dump() + +See built-in examples of `PlatformIO build scripts `_. .. _projectconf_examples: diff --git a/platformio/__init__.py b/platformio/__init__.py index 77112693..6dbbfe25 100644 --- a/platformio/__init__.py +++ b/platformio/__init__.py @@ -1,7 +1,7 @@ # Copyright (C) Ivan Kravets # See LICENSE for details. -VERSION = (2, 2, "0.dev1") +VERSION = (2, 2, "0.dev2") __version__ = ".".join([str(s) for s in VERSION]) __title__ = "platformio" diff --git a/platformio/builder/main.py b/platformio/builder/main.py index a9f06099..073c7f71 100644 --- a/platformio/builder/main.py +++ b/platformio/builder/main.py @@ -11,11 +11,13 @@ except ImportError: break from platformio import util +import json +from os import getenv from os.path import isfile, join from time import time -from SCons.Script import (DefaultEnvironment, Exit, SConscript, - SConscriptChdir, Variables) +from SCons.Script import (COMMAND_LINE_TARGETS, DefaultEnvironment, Exit, + SConscript, SConscriptChdir, Variables) from platformio.exception import UnknownBoard @@ -25,6 +27,7 @@ from platformio.exception import UnknownBoard commonvars = Variables(None) commonvars.AddVariables( ("BUILD_SCRIPT",), + ("EXTRA_SCRIPT",), ("PIOENV",), ("PLATFORM",), @@ -123,3 +126,14 @@ env.PrependENVPath( SConscriptChdir(0) SConscript(env.subst("$BUILD_SCRIPT")) + +if getenv("PLATFORMIO_EXTRA_SCRIPT", env.get("EXTRA_SCRIPT", None)): + SConscript(getenv("PLATFORMIO_EXTRA_SCRIPT", env.get("EXTRA_SCRIPT"))) + +if "envdump" in COMMAND_LINE_TARGETS: + print env.Dump() + Exit() + +if "idedata" in COMMAND_LINE_TARGETS: + print json.dumps(env.DumpIDEData()) + Exit() diff --git a/platformio/builder/tools/platformio.py b/platformio/builder/tools/platformio.py index 79695742..5e373105 100644 --- a/platformio/builder/tools/platformio.py +++ b/platformio/builder/tools/platformio.py @@ -2,14 +2,12 @@ # See LICENSE for details. import atexit -import json import re from glob import glob 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, DefaultEnvironment, Exit, - SConscript, SConscriptChdir) +from SCons.Script import DefaultEnvironment, Exit, SConscript from SCons.Util import case_sensitive_suffixes from platformio.util import pioversion_to_intstr @@ -27,50 +25,41 @@ def BuildFirmware(env): env.ProcessFlags() env.BuildFramework() - firmenv = env.Clone() - vdirs = firmenv.VariantDirRecursive( + vdirs = env.VariantDirRecursive( join("$BUILD_DIR", "src"), "$PROJECTSRC_DIR", duplicate=False) # build dependent libs - deplibs = firmenv.BuildDependentLibraries("$PROJECTSRC_DIR") + deplibs = env.BuildDependentLibraries("$PROJECTSRC_DIR") # append specified LD_SCRIPT - if ("LDSCRIPT_PATH" in firmenv and - not any(["-Wl,-T" in f for f in firmenv['LINKFLAGS']])): - firmenv.Append( + if ("LDSCRIPT_PATH" in env and + not any(["-Wl,-T" in f for f in env['LINKFLAGS']])): + env.Append( LINKFLAGS=["-Wl,-T", "$LDSCRIPT_PATH"] ) # enable "cyclic reference" for linker - firmenv.Prepend( + env.Prepend( _LIBFLAGS="-Wl,--start-group " ) - firmenv.Append( + env.Append( _LIBFLAGS=" -Wl,--end-group" ) # Handle SRCBUILD_FLAGS if getenv("PLATFORMIO_SRCBUILD_FLAGS", None): - firmenv.MergeFlags(getenv("PLATFORMIO_SRCBUILD_FLAGS")) + env.MergeFlags(getenv("PLATFORMIO_SRCBUILD_FLAGS")) if "SRCBUILD_FLAGS" in env: - firmenv.MergeFlags(env['SRCBUILD_FLAGS']) + env.MergeFlags(env['SRCBUILD_FLAGS']) - firmenv.Append( + env.Append( CPPDEFINES=["PLATFORMIO={0:02d}{1:02d}{2:02d}".format( *pioversion_to_intstr())] ) - if "envdump" in COMMAND_LINE_TARGETS: - print env.Dump() - Exit() - - if "idedata" in COMMAND_LINE_TARGETS: - print json.dumps(env.DumpIDEData()) - Exit() - - return firmenv.Program( + return env.Program( join("$BUILD_DIR", "firmware"), - [firmenv.GlobCXXFiles(vdir) for vdir in vdirs], + [env.GlobCXXFiles(vdir) for vdir in vdirs], LIBS=env.get("LIBS", []) + deplibs, LIBPATH=env.get("LIBPATH", []) + ["$BUILD_DIR"], PROGSUFFIX=".elf" @@ -136,7 +125,6 @@ def BuildFramework(env): for f in env['FRAMEWORK'].split(","): framework = f.strip().lower() if framework in env.get("BOARD_OPTIONS", {}).get("frameworks"): - SConscriptChdir(0) SConscript( env.subst(join("$PIOBUILDER_DIR", "scripts", "frameworks", "%s.py" % framework))