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 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): 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", ], ) # 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