SConstruct 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. import os
  2. import sys
  3. import subprocess
  4. arguments = sys.argv[2]
  5. vdso_usr = arguments
  6. vdso_path = os.path.join(vdso_usr, '..', '..', '..')
  7. EXEC_PATH = os.getenv('RTT_EXEC_PATH') or '/usr/bin'
  8. PREFIX = os.getenv('RTT_CC_PREFIX') or 'riscv64-none-elf-'
  9. def get_riscv64_default_arch_abi(gcc_bin):
  10. try:
  11. result = subprocess.check_output(
  12. [gcc_bin, '-Q', '--help=target'],
  13. universal_newlines=True
  14. )
  15. arch = None
  16. abi = None
  17. for line in result.splitlines():
  18. if '-march=' in line:
  19. arch = line.strip().split()[1]
  20. arch = arch.split('_')[0] # Get the base architecture, e.g., rv64imafdc
  21. if '-mabi=' in line and 'option' not in line:
  22. abi = line.strip().split()[1]
  23. return arch, abi
  24. except Exception as e:
  25. print("Error getting arch/abi:", e)
  26. return None, None
  27. # get the gcc path
  28. CC_BIN = PREFIX + 'gcc'
  29. arch, abi = get_riscv64_default_arch_abi(CC_BIN)
  30. if arch and abi:
  31. DEVICE = f' -march={arch} -mabi={abi} '
  32. else:
  33. DEVICE = ' -march=rv64imafdc -mabi=lp64' # fallback
  34. CC = PREFIX + 'gcc'
  35. CPP = PREFIX + 'cpp'
  36. AS = PREFIX + 'gcc'
  37. AR = PREFIX + 'ar'
  38. LINK = PREFIX + 'gcc'
  39. AFLAGS = ' -x assembler-with-cpp'
  40. CFLAGS = DEVICE + ' -Wall -Wno-cpp -std=gnu99 -fdiagnostics-color=always -fPIC -O2'
  41. LFLAGS = DEVICE + ' -Bsymbolic -Wl,--gc-sections -T {path}/vdso.lds'.format(path=vdso_usr)
  42. CFLAGS += " -I . -I {vdso_path} ".format(vdso_path=vdso_path)
  43. src = Glob('*.c')
  44. env = Environment(tools=['gcc', 'link'],
  45. AS = AS, ASFLAGS = AFLAGS,
  46. CC = CC, CFLAGS = CFLAGS,
  47. CPP = CPP, AR = AR,
  48. LINK = LINK, LINKFLAGS = LFLAGS)
  49. env.PrependENVPath('PATH', EXEC_PATH)
  50. target = os.path.join(vdso_path, 'user', 'build', 'libvdso.so')
  51. shared_lib = env.SharedLibrary(target=target, source=src)
  52. Clean(shared_lib, '{vdso_usr}/vdso.lds'.format(vdso_usr=vdso_usr))
  53. Clean(shared_lib, '.sconsign.dblite')
  54. env.Default(shared_lib)