diff --git a/platformio/builder/main.py b/platformio/builder/main.py index 302d14f3..1adf0589 100644 --- a/platformio/builder/main.py +++ b/platformio/builder/main.py @@ -89,6 +89,13 @@ if "BOARD" in env: if "UPLOAD_SPEED" not in env: env.Replace( UPLOAD_SPEED="${BOARD_OPTIONS['upload'].get('speed', None)}") + if "ldscript" in env.get("BOARD_OPTIONS", {}).get("build", {}): + env.Replace( + LDSCRIPT_PATH=join( + "$PIOHOME_DIR", "packages", "ldscripts", + "${BOARD_OPTIONS['build']['ldscript']}" + ) + ) if "IGNORE_LIBS" in env: env['IGNORE_LIBS'] = [l.strip() for l in env['IGNORE_LIBS'].split(",")] diff --git a/platformio/builder/scripts/frameworks/opencm3.py b/platformio/builder/scripts/frameworks/opencm3.py index 7b755342..324e2c32 100644 --- a/platformio/builder/scripts/frameworks/opencm3.py +++ b/platformio/builder/scripts/frameworks/opencm3.py @@ -154,8 +154,10 @@ merge_ld_scripts(ldscript_path) generate_nvic_files() # override ldscript by opencm3 -assert "-T" in env['LINKFLAGS'] -env['LINKFLAGS'][env['LINKFLAGS'].index("-T") + 1] = ldscript_path +assert "LDSCRIPT_PATH" in env +env.Replace( + LDSCRIPT_PATH=ldscript_path +) libs = [] env.VariantDir( diff --git a/platformio/builder/tools/platformio.py b/platformio/builder/tools/platformio.py index 351fe3ca..6955a252 100644 --- a/platformio/builder/tools/platformio.py +++ b/platformio/builder/tools/platformio.py @@ -15,20 +15,13 @@ from platformio.util import get_serialports def ProcessGeneral(env): - corelibs = [] - # specific linker script - if "ldscript" in env.get("BOARD_OPTIONS", {}).get("build", {}): - env.Append( - LINKFLAGS=["-T", join( - "$PIOHOME_DIR", "packages", "ldscripts", - "${BOARD_OPTIONS['build']['ldscript']}")] - ) if "extra_flags" in env.get("BOARD_OPTIONS", {}).get("build", {}): env.MergeFlags(env.subst("${BOARD_OPTIONS['build']['extra_flags']}")) if "BUILD_FLAGS" in env: env.MergeFlags(env['BUILD_FLAGS']) + corelibs = [] if "FRAMEWORK" in env: if env['FRAMEWORK'] in ("arduino", "energia"): env.ConvertInoToCpp() @@ -49,20 +42,27 @@ def BuildFirmware(env, corelibs): # build dependent libs deplibs = firmenv.BuildDependentLibraries(join("$PROJECT_DIR", "src")) - if deplibs: - firmenv.Prepend( - _LIBFLAGS="-Wl,--start-group " - ) + + # append specified LD_SCRIPT + if "LDSCRIPT_PATH" in firmenv: firmenv.Append( - _LIBFLAGS=" -Wl,--end-group " + LINKFLAGS=["-T", "$LDSCRIPT_PATH"] ) + # enable "cyclic reference" for linker + firmenv.Prepend( + _LIBFLAGS="-Wl,--start-group ", + ) + firmenv.Append( + _LIBFLAGS=" -Wl,--end-group" + ) + firmenv.MergeFlags(getenv("PIOSRCBUILD_FLAGS", "$SRCBUILD_FLAGS")) return firmenv.Program( join("$BUILD_DIR", "firmware"), [firmenv.GlobCXXFiles(vdir) for vdir in vdirs], - LIBS=deplibs + corelibs, + LIBS=corelibs + deplibs, LIBPATH="$BUILD_DIR", PROGSUFFIX=".elf" )