from SCons.Tool import asm from SCons.Tool import gcc from SCons.Tool import gxx from SCons.Tool import ar from SCons.Tool import gnulink import strip import gdb import objdump import size from SCons.Action import _subproc import subprocess def prefix_commands(env, command_prefix, cmd_list): for command in cmd_list: if command in env: env[command] = command_prefix + env[command] def _get_tool_version(env, tool): verstr = "version unknown" proc = _subproc( env, env.subst("${%s} --version" % tool), stdout=subprocess.PIPE, stderr="devnull", stdin="devnull", universal_newlines=True, error="raise", shell=True, ) if proc: verstr = proc.stdout.readline() proc.communicate() return verstr def generate(env, **kw): for orig_tool in (asm, gcc, gxx, ar, gnulink, strip, gdb, objdump, size): orig_tool.generate(env) env.SetDefault( TOOLCHAIN_PREFIX=kw.get("toolchain_prefix"), ) prefix_commands( env, env.subst("$TOOLCHAIN_PREFIX"), [ "AR", "AS", "CC", "CXX", "OBJCOPY", "RANLIB", "STRIP", "GDB", "GDBPY", "OBJDUMP", "SIZE", ], ) # Call CC to check version if whitelisted_versions := kw.get("versions", ()): cc_version = _get_tool_version(env, "CC") # print("CC version =", cc_version) # print(list(filter(lambda v: v in cc_version, whitelisted_versions))) if not any(filter(lambda v: v in cc_version, whitelisted_versions)): raise Exception( f"Toolchain version is not supported. Allowed: {whitelisted_versions}, toolchain: {cc_version} " ) def exists(env): return True