def scons_patched_match_splitext(path, suffixes=None): """ Patch SCons Builder, append $OBJSUFFIX to the end of each target """ tokens = Util.splitext(path) if suffixes and tokens[1] and tokens[1] in suffixes: return (path, tokens[1]) return tokens
def MSRPCStubs_buildEmitter(target,source,env): base,ext=Util.splitext(str(target[0] if len(target)>0 else source[0])) newTargets=['%s.h'%base] if not env['MSRPCStubs_noServer']: newTargets.append('%s_S.c'%base) if not env['MSRPCStubs_noClient']: newTargets.append('%s_C.c'%base) return (newTargets,source)
def expand_dict(d, env): """Takes a dictionary and returns a copy of it with values expanded from the envronment, env""" d = d.copy() # copy it for (k,v) in d.items(): if callable(v): d[k] = env.subst(v()) elif Util.is_String(v): d[k]=env.subst(v) return d
def ProcessFlags(env, flags): # pylint: disable=too-many-branches if not flags: return if isinstance(flags, list): flags = " ".join(flags) parsed_flags = env.ParseFlags(str(flags)) for flag in parsed_flags.pop("CPPDEFINES"): if not Util.is_Sequence(flag): env.Append(CPPDEFINES=flag) continue _key, _value = flag[:2] if '\"' in _value: _value = _value.replace('\"', '\\\"') elif _value.isdigit(): _value = int(_value) elif _value.replace(".", "", 1).isdigit(): _value = float(_value) env.Append(CPPDEFINES=(_key, _value)) env.Append(**parsed_flags) # fix relative CPPPATH & LIBPATH for k in ("CPPPATH", "LIBPATH"): for i, p in enumerate(env.get(k, [])): if isdir(p): env[k][i] = realpath(p) # fix relative path for "-include" for i, f in enumerate(env.get("CCFLAGS", [])): if isinstance(f, tuple) and f[0] == "-include": env['CCFLAGS'][i] = (f[0], env.File(realpath(f[1].get_path()))) # Cancel any previous definition of name, either built in or # provided with a -D option // Issue #191 undefines = [ u for u in env.get("CCFLAGS", []) if isinstance(u, basestring) and u.startswith("-U") ] if undefines: for undef in undefines: env['CCFLAGS'].remove(undef) env.Append(_CPPDEFFLAGS=" %s" % " ".join(undefines))
def ParseFlagsExtended(env, flags): # pylint: disable=too-many-branches if not isinstance(flags, list): flags = [flags] result = {} for raw in flags: for key, value in env.ParseFlags(str(raw)).items(): if key not in result: result[key] = [] result[key].extend(value) cppdefines = [] for item in result["CPPDEFINES"]: if not Util.is_Sequence(item): cppdefines.append(item) continue name, value = item[:2] if '"' in value: value = value.replace('"', '\\"') elif value.isdigit(): value = int(value) elif value.replace(".", "", 1).isdigit(): value = float(value) cppdefines.append((name, value)) result["CPPDEFINES"] = cppdefines # fix relative CPPPATH & LIBPATH for k in ("CPPPATH", "LIBPATH"): for i, p in enumerate(result.get(k, [])): if os.path.isdir(p): result[k][i] = os.path.realpath(p) # fix relative path for "-include" for i, f in enumerate(result.get("CCFLAGS", [])): if isinstance(f, tuple) and f[0] == "-include": result["CCFLAGS"][i] = (f[0], env.File(os.path.realpath( f[1].get_path()))) return result
def ParseFlagsExtended(env, flags): # pylint: disable=too-many-branches if not isinstance(flags, list): flags = [flags] result = {} for raw in flags: for key, value in env.ParseFlags(str(raw)).items(): if key not in result: result[key] = [] result[key].extend(value) cppdefines = [] for item in result['CPPDEFINES']: if not Util.is_Sequence(item): cppdefines.append(item) continue name, value = item[:2] if '\"' in value: value = value.replace('\"', '\\\"') elif value.isdigit(): value = int(value) elif value.replace(".", "", 1).isdigit(): value = float(value) cppdefines.append((name, value)) result['CPPDEFINES'] = cppdefines # fix relative CPPPATH & LIBPATH for k in ("CPPPATH", "LIBPATH"): for i, p in enumerate(result.get(k, [])): if isdir(p): result[k][i] = realpath(p) # fix relative path for "-include" for i, f in enumerate(result.get("CCFLAGS", [])): if isinstance(f, tuple) and f[0] == "-include": result['CCFLAGS'][i] = (f[0], env.File(realpath(f[1].get_path()))) return result
def ProcessProgramDeps(env): def _append_pio_macros(): env.AppendUnique( CPPDEFINES=[ ( "PLATFORMIO", int("{0:02d}{1:02d}{2:02d}".format(*pioversion_to_intstr())), ) ] ) _append_pio_macros() env.PrintConfiguration() # fix ASM handling under non case-sensitive OS if not Util.case_sensitive_suffixes(".s", ".S"): env.Replace(AS="$CC", ASCOM="$ASPPCOM") # 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")) # process framework scripts env.BuildFrameworks(env.get("PIOFRAMEWORK")) if env.GetBuildType() == "debug": env.ConfigureDebugFlags() # remove specified flags env.ProcessUnFlags(env.get("BUILD_UNFLAGS")) if "__test" in COMMAND_LINE_TARGETS: env.ConfigureTestTarget()
def scons_patched_match_splitext(path, suffixes=None): """Patch SCons Builder, append $OBJSUFFIX to the end of each target""" tokens = Util.splitext(path) if suffixes and tokens[1] and tokens[1] in suffixes: return (path, tokens[1]) return tokens
def BuildProgram(env): def _append_pio_macros(): env.AppendUnique(CPPDEFINES=[("PLATFORMIO", int("{0:02d}{1:02d}{2:02d}".format( *pioversion_to_intstr())))]) _append_pio_macros() env.PrintConfiguration() # fix ASM handling under non case-sensitive OS if not Util.case_sensitive_suffixes(".s", ".S"): env.Replace(AS="$CC", ASCOM="$ASPPCOM") if ("debug" in COMMAND_LINE_TARGETS or env.GetProjectOption("build_type") == "debug"): env.ProcessDebug() # 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")) # process framework scripts env.BuildFrameworks(env.get("PIOFRAMEWORK")) # restore PIO macros if it was deleted by framework _append_pio_macros() # remove specified flags env.ProcessUnFlags(env.get("BUILD_UNFLAGS")) if "__test" in COMMAND_LINE_TARGETS: env.ProcessTest() # build project with dependencies _build_project_deps(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.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") program = env.Program(join("$BUILD_DIR", env.subst("$PROGNAME")), env['PIOBUILDFILES']) env.Replace(PIOMAINPROG=program) AlwaysBuild( env.Alias( "checkprogsize", program, env.VerboseAction(env.CheckUploadSize, "Checking size $PIOMAINPROG"))) return program
def BuildProgram(env): def _append_pio_macros(): env.AppendUnique(CPPDEFINES=[( "PLATFORMIO", int("{0:02d}{1:02d}{2:02d}".format(*pioversion_to_intstr())))]) _append_pio_macros() env.PrintConfiguration() # fix ASM handling under non case-sensitive OS if not Util.case_sensitive_suffixes(".s", ".S"): env.Replace(AS="$CC", ASCOM="$ASPPCOM") if set(["__debug", "debug"]) & set(COMMAND_LINE_TARGETS): env.ProcessDebug() # 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")) # process framework scripts env.BuildFrameworks(env.get("PIOFRAMEWORK")) # restore PIO macros if it was deleted by framework _append_pio_macros() # remove specified flags env.ProcessUnFlags(env.get("BUILD_UNFLAGS")) if "__test" in COMMAND_LINE_TARGETS: env.ProcessTest() # build project with dependencies _build_project_deps(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.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") program = env.Program( join("$BUILD_DIR", env.subst("$PROGNAME")), env['PIOBUILDFILES']) env.Replace(PIOMAINPROG=program) AlwaysBuild( env.Alias( "checkprogsize", program, env.VerboseAction(env.CheckUploadSize, "Checking size $PIOMAINPROG"))) return program
def relevantPathDefs (mapping): for (k,v) in mapping.items(): if (k.startswith('src') or k.startswith('build') or k.startswith('install')) and Util.is_String(v): v = v.strip() if not v.endswith('/'): v += '/' yield (k,v)
def BuildProgram(env): def _append_pio_macros(): env.AppendUnique(CPPDEFINES=[("PLATFORMIO", int("{0:02d}{1:02d}{2:02d}".format( *pioversion_to_intstr())))]) _append_pio_macros() env.PrintConfiguration() # fix ASM handling under non case-sensitive OS if not Util.case_sensitive_suffixes(".s", ".S"): env.Replace(AS="$CC", ASCOM="$ASPPCOM") if "__debug" in COMMAND_LINE_TARGETS: env.ProcessDebug() # process extra flags from board if "BOARD" in env and "build.extra_flags" in env.BoardConfig(): env.ProcessFlags(env.BoardConfig().get("build.extra_flags")) # remove base flags env.ProcessUnFlags(env.get("BUILD_UNFLAGS")) # apply user flags env.ProcessFlags(env.get("BUILD_FLAGS")) # process framework scripts env.BuildFrameworks(env.get("PIOFRAMEWORK")) # restore PIO macros if it was deleted by framework _append_pio_macros() # build dependent libs; place them before built-in libs env.Prepend(LIBS=env.BuildProjectLibraries()) # append specified LD_SCRIPT 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 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")) env.Append(LIBPATH=["$BUILD_DIR"], PIOBUILDFILES=env.CollectBuildFiles( "$BUILDSRC_DIR", "$PROJECTSRC_DIR", src_filter=env.get("SRC_FILTER"), duplicate=False)) if "__test" in COMMAND_LINE_TARGETS: env.Append(PIOBUILDFILES=env.ProcessTest()) 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']) checksize_action = Action.Action(env.CheckUploadSize, "Checking program size") AlwaysBuild(env.Alias("checkprogsize", program, checksize_action)) if set(["upload", "program"]) & set(COMMAND_LINE_TARGETS): env.AddPostAction(program, checksize_action) return program
def BuildProgram(env): def _append_pio_macros(): env.AppendUnique(CPPDEFINES=[( "PLATFORMIO", int("{0:02d}{1:02d}{2:02d}".format(*pioversion_to_intstr())))]) _append_pio_macros() env.PrintConfiguration() # fix ASM handling under non case-sensitive OS if not Util.case_sensitive_suffixes(".s", ".S"): env.Replace(AS="$CC", ASCOM="$ASPPCOM") if "__debug" in COMMAND_LINE_TARGETS: env.ProcessDebug() # process extra flags from board if "BOARD" in env and "build.extra_flags" in env.BoardConfig(): env.ProcessFlags(env.BoardConfig().get("build.extra_flags")) # remove base flags env.ProcessUnFlags(env.get("BUILD_UNFLAGS")) # apply user flags env.ProcessFlags(env.get("BUILD_FLAGS")) # process framework scripts env.BuildFrameworks(env.get("PIOFRAMEWORK")) # restore PIO macros if it was deleted by framework _append_pio_macros() # build dependent libs; place them before built-in libs env.Prepend(LIBS=env.BuildProjectLibraries()) # append specified LD_SCRIPT 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 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")) env.Append( LIBPATH=["$BUILD_DIR"], PIOBUILDFILES=env.CollectBuildFiles( "$BUILDSRC_DIR", "$PROJECTSRC_DIR", src_filter=env.get("SRC_FILTER"), duplicate=False)) if "__test" in COMMAND_LINE_TARGETS: env.Append(PIOBUILDFILES=env.ProcessTest()) 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']) checksize_action = Action.Action(env.CheckUploadSize, "Checking program size") AlwaysBuild(env.Alias("checkprogsize", program, checksize_action)) if set(["upload", "program"]) & set(COMMAND_LINE_TARGETS): env.AddPostAction(program, checksize_action) return program
def _GetServiceNames(file_path): r = Util.MatchOnePattern( file_path, r'^service\s+(\S+)(\s+extends\s+\S+)?\s+({)?(\s*})?$') return r