crosscc.py 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. from SCons.Errors import StopError
  2. from SCons.Tool import asm
  3. from SCons.Tool import gcc
  4. from SCons.Tool import gxx
  5. from SCons.Tool import ar
  6. from SCons.Tool import gnulink
  7. import strip
  8. import gdb
  9. import objdump
  10. from SCons.Action import _subproc
  11. import subprocess
  12. def prefix_commands(env, command_prefix, cmd_list):
  13. for command in cmd_list:
  14. if command in env:
  15. env[command] = command_prefix + env[command]
  16. def _get_tool_version(env, tool):
  17. verstr = "version unknown"
  18. proc = _subproc(
  19. env,
  20. env.subst("${%s} --version" % tool),
  21. stdout=subprocess.PIPE,
  22. stderr="devnull",
  23. stdin="devnull",
  24. universal_newlines=True,
  25. error="raise",
  26. shell=True,
  27. )
  28. if proc:
  29. verstr = proc.stdout.readline()
  30. proc.communicate()
  31. return verstr
  32. def generate(env, **kw):
  33. if not env.get("VERBOSE", False):
  34. env.SetDefault(
  35. CCCOMSTR="\tCC\t${SOURCE}",
  36. CXXCOMSTR="\tCPP\t${SOURCE}",
  37. ASCOMSTR="\tASM\t${SOURCE}",
  38. ARCOMSTR="\tAR\t${TARGET}",
  39. RANLIBCOMSTR="\tRANLIB\t${TARGET}",
  40. LINKCOMSTR="\tLINK\t${TARGET}",
  41. INSTALLSTR="\tINSTALL\t${TARGET}",
  42. APPSCOMSTR="\tAPPS\t${TARGET}",
  43. VERSIONCOMSTR="\tVERSION\t${TARGET}",
  44. STRIPCOMSTR="\tSTRIP\t${TARGET}",
  45. OBJDUMPCOMSTR="\tOBJDUMP\t${TARGET}",
  46. )
  47. for orig_tool in (asm, gcc, gxx, ar, gnulink, strip, gdb, objdump):
  48. orig_tool.generate(env)
  49. env.SetDefault(
  50. TOOLCHAIN_PREFIX=kw.get("toolchain_prefix"),
  51. )
  52. prefix_commands(
  53. env,
  54. env.subst("$TOOLCHAIN_PREFIX"),
  55. [
  56. "AR",
  57. "AS",
  58. "CC",
  59. "CXX",
  60. "OBJCOPY",
  61. "RANLIB",
  62. "STRIP",
  63. "GDB",
  64. "GDBPY",
  65. "OBJDUMP",
  66. ],
  67. )
  68. # Call CC to check version
  69. if whitelisted_versions := kw.get("versions", ()):
  70. cc_version = _get_tool_version(env, "CC")
  71. # print("CC version =", cc_version)
  72. # print(list(filter(lambda v: v in cc_version, whitelisted_versions)))
  73. if not any(filter(lambda v: v in cc_version, whitelisted_versions)):
  74. raise StopError(
  75. f"Toolchain version is not supported. Allowed: {whitelisted_versions}, toolchain: {cc_version} "
  76. )
  77. def exists(env):
  78. return True