diff --git a/HISTORY.rst b/HISTORY.rst index 5a2a955f..72aa6086 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -15,6 +15,13 @@ PlatformIO 3.0 - Check maximum allowed "program" and "data" sizes before uploading/programming (`issue #1412 `_) +3.5.4 (2018-??-??) +~~~~~~~~~~~~~~~~~~ + +* Don't export ``CPPPATH`` of project dependent libraries to frameworks + (`issue #1665 `_) +* Fixed issue with invalid LD script if path contains space + 3.5.3 (2018-06-01) ~~~~~~~~~~~~~~~~~~ diff --git a/docs b/docs index 4941b955..63bb3e44 160000 --- a/docs +++ b/docs @@ -1 +1 @@ -Subproject commit 4941b95550efc76fb3ed6e88aa5a66e7e2d80a44 +Subproject commit 63bb3e4420cc99de452ee94f91989600eb12d304 diff --git a/platformio/builder/tools/piolib.py b/platformio/builder/tools/piolib.py index 3570e232..76798b8e 100644 --- a/platformio/builder/tools/piolib.py +++ b/platformio/builder/tools/piolib.py @@ -821,7 +821,7 @@ def BuildProjectLibraries(env): title = "<%s>" % lb.name vcs_info = lb.vcs_info if lb.version: - title += " v%s" % lb.version + title += " %s" % lb.version if vcs_info and vcs_info.get("version"): title += " #%s" % vcs_info.get("version") sys.stdout.write("%s|-- %s" % (margin, title)) @@ -836,7 +836,6 @@ def BuildProjectLibraries(env): print_deps_tree(lb, level + 1) project = ProjectAsLibBuilder(env, "$PROJECT_DIR") - project.env = env ldf_mode = LibBuilderBase.lib_ldf_mode.fget(project) print "Library Dependency Finder -> http://bit.ly/configure-pio-ldf" @@ -858,7 +857,8 @@ def BuildProjectLibraries(env): else: print "No dependencies" - return project.build() + libs = project.build() + return dict(LIBS=libs, CPPPATH=project.env.get("CPPPATH")) def exists(_): diff --git a/platformio/builder/tools/piomisc.py b/platformio/builder/tools/piomisc.py index 87331f5d..4ac533cf 100644 --- a/platformio/builder/tools/piomisc.py +++ b/platformio/builder/tools/piomisc.py @@ -231,14 +231,25 @@ def GetActualLDScript(env): return None script = None + script_in_next = False for f in env.get("LINKFLAGS", []): - if f.startswith("-Wl,-T"): - script = env.subst(f[6:].replace('"', "").strip()) - if isfile(script): - return script - path = _lookup_in_ldpath(script) - if path: - return path + raw_script = None + if f == "-T": + script_in_next = True + continue + elif script_in_next: + script_in_next = False + raw_script = f + elif f.startswith("-Wl,-T"): + raw_script = f[6:] + else: + continue + script = env.subst(raw_script.replace('"', "").strip()) + if isfile(script): + return script + path = _lookup_in_ldpath(script) + if path: + return path if script: sys.stderr.write( @@ -295,9 +306,6 @@ def ProcessTest(env): src_filter.append("+<%s%s>" % (env['PIOTEST'], sep)) env.Replace(PIOTEST_SRC_FILTER=src_filter) - return env.CollectBuildFiles("$BUILDTEST_DIR", "$PROJECTTEST_DIR", - "$PIOTEST_SRC_FILTER") - def GetExtraScripts(env, scope): items = [] diff --git a/platformio/builder/tools/platformio.py b/platformio/builder/tools/platformio.py index 491d7418..07d4ad8f 100644 --- a/platformio/builder/tools/platformio.py +++ b/platformio/builder/tools/platformio.py @@ -22,7 +22,7 @@ from os.path import basename, dirname, isdir, join, realpath from SCons import Builder, Util from SCons.Script import (COMMAND_LINE_TARGETS, AlwaysBuild, - DefaultEnvironment, SConscript) + DefaultEnvironment, Export, SConscript) from platformio.util import glob_escape, pioversion_to_intstr @@ -41,6 +41,35 @@ def scons_patched_match_splitext(path, suffixes=None): return tokens +def _build_project_deps(env): + deps = env.BuildProjectLibraries() + # prepend dependent libs before built-in + env.Prepend(LIBS=deps['LIBS']) + + if "__test" in COMMAND_LINE_TARGETS: + env.ProcessTest() + projenv = env.Clone() + projenv.BuildSources("$BUILDTEST_DIR", "$PROJECTTEST_DIR", + "$PIOTEST_SRC_FILTER") + else: + projenv = env.Clone() + projenv.BuildSources("$BUILDSRC_DIR", "$PROJECTSRC_DIR", + env.get("SRC_FILTER")) + + # CPPPATH from dependencies + projenv.PrependUnique(CPPPATH=deps['CPPPATH']) + # extra build flags from `platformio.ini` + projenv.ProcessFlags(env.get("SRC_BUILD_FLAGS")) + + if not env.get("PIOBUILDFILES") and not COMMAND_LINE_TARGETS: + sys.stderr.write( + "Error: Nothing to build. Please put your source code files " + "to '%s' folder\n" % env.subst("$PROJECTSRC_DIR")) + env.Exit(1) + + Export("projenv") + + def BuildProgram(env): def _append_pio_macros(): @@ -62,6 +91,7 @@ def BuildProgram(env): # process extra flags from board if "BOARD" in env and "build.extra_flags" in env.BoardConfig(): env.ProcessFlags(env.BoardConfig().get("build.extra_flags")) + # apply user flags env.ProcessFlags(env.get("BUILD_FLAGS")) @@ -74,37 +104,19 @@ def BuildProgram(env): # remove specified flags env.ProcessUnFlags(env.get("BUILD_UNFLAGS")) - # build dependent libs; place them before built-in libs - env.Prepend(LIBS=env.BuildProjectLibraries()) + # build project with dependencies + _build_project_deps(env) - # append specified LD_SCRIPT - if ("LDSCRIPT_PATH" in env + # append into the beginning a main LD script + if (env.get("LDSCRIPT_PATH") and not any("-Wl,-T" in f for f in env['LINKFLAGS'])): - env.Append(LINKFLAGS=['-Wl,-T"$LDSCRIPT_PATH"']) + env.Prepend(LINKFLAGS=["-T", "$LDSCRIPT_PATH"]) # enable "cyclic reference" for linker if env.get("LIBS") and env.GetCompilerType() == "gcc": env.Prepend(_LIBFLAGS="-Wl,--start-group ") env.Append(_LIBFLAGS=" -Wl,--end-group") - # Handle SRC_BUILD_FLAGS - env.ProcessFlags(env.get("SRC_BUILD_FLAGS")) - - if "__test" in COMMAND_LINE_TARGETS: - env.Append(PIOBUILDFILES=env.ProcessTest()) - else: - env.Append( - PIOBUILDFILES=env.CollectBuildFiles( - "$BUILDSRC_DIR", - "$PROJECTSRC_DIR", - src_filter=env.get("SRC_FILTER"))) - - if not env['PIOBUILDFILES'] and not COMMAND_LINE_TARGETS: - sys.stderr.write( - "Error: Nothing to build. Please put your source code files " - "to '%s' folder\n" % env.subst("$PROJECTSRC_DIR")) - env.Exit(1) - program = env.Program( join("$BUILD_DIR", env.subst("$PROGNAME")), env['PIOBUILDFILES']) env.Replace(PIOMAINPROG=program) @@ -276,7 +288,7 @@ def BuildFrameworks(env, frameworks): env.ConvertInoToCpp() if f in board_frameworks: - SConscript(env.GetFrameworkScript(f)) + SConscript(env.GetFrameworkScript(f), exports="env") else: sys.stderr.write( "Error: This board doesn't support %s framework!\n" % f) @@ -290,8 +302,9 @@ def BuildLibrary(env, variant_dir, src_dir, src_filter=None): def BuildSources(env, variant_dir, src_dir, src_filter=None): + nodes = env.CollectBuildFiles(variant_dir, src_dir, src_filter) DefaultEnvironment().Append( - PIOBUILDFILES=env.CollectBuildFiles(variant_dir, src_dir, src_filter)) + PIOBUILDFILES=[env.Object(node) for node in nodes]) def exists(_): diff --git a/tests/test_builder.py b/tests/test_builder.py index cafd1cee..4048c065 100644 --- a/tests/test_builder.py +++ b/tests/test_builder.py @@ -29,8 +29,9 @@ build_flags = %s """ % " ".join([f[0] for f in build_flags])) tmpdir.join("extra.py").write(""" -Import("env") -env.Append(CPPDEFINES="POST_SCRIPT_MACRO") +Import("projenv") + +projenv.Append(CPPDEFINES="POST_SCRIPT_MACRO") """) tmpdir.mkdir("src").join("main.cpp").write("""