SConstruct 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. import os
  2. import subprocess
  3. arch = ARGUMENTS.get('RTT_VDSO_ARCH') or os.getenv('RTT_VDSO_ARCH')
  4. user_dir = os.path.normpath(Dir('.').abspath)
  5. vdso_root = os.path.normpath(os.path.join(user_dir, '..'))
  6. arch_def_config = {
  7. 'aarch64': {
  8. 'prefix': 'aarch64-none-elf-',
  9. 'device': '-march=armv8-a -mtune=cortex-a53',
  10. 'linker': os.path.join(user_dir, 'arch', 'aarch64', 'vdso.lds.S'),
  11. },
  12. 'arm': {
  13. 'prefix': 'arm-none-eabi-',
  14. 'device': '-march=armv7-a -marm',
  15. 'linker': os.path.join(user_dir, 'arch', 'arm', 'vdso.lds.S'),
  16. },
  17. 'risc-v': {
  18. 'prefix': 'riscv64-none-elf-',
  19. 'device': '-march=rv64imafdc -mabi=lp64',
  20. 'linker': os.path.join(user_dir, 'arch', 'risc-v', 'vdso.lds.S'),
  21. },
  22. }
  23. if arch not in arch_def_config:
  24. raise RuntimeError('Unsupported vDSO arch: %s' % arch)
  25. exec_path = os.getenv('RTT_EXEC_PATH') or '/usr/bin'
  26. prefix = os.getenv('RTT_CC_PREFIX') or arch_def_config[arch]['prefix']
  27. device = os.getenv('RTT_DEVICE') or arch_def_config[arch]['device']
  28. linker_script_src = arch_def_config[arch]['linker']
  29. cc = prefix + 'gcc'
  30. cpp = prefix + 'cpp'
  31. ar = prefix + 'ar'
  32. common_dir = os.path.join(user_dir, 'common')
  33. arch_dir = os.path.join(user_dir, 'arch', arch)
  34. build_dir = os.path.join(user_dir, 'build', arch)
  35. os.makedirs(build_dir, exist_ok=True)
  36. linker_script = os.path.join(build_dir, 'vdso.lds')
  37. cflags = ' '.join([
  38. device,
  39. '-Wall',
  40. '-Wextra',
  41. '-Wno-unused-parameter',
  42. '-Wno-cpp',
  43. '-std=gnu99',
  44. '-O2',
  45. '-fPIC',
  46. '-ffreestanding',
  47. '-fno-builtin',
  48. '-fvisibility=hidden',
  49. '-nostdlib',
  50. '-nostartfiles',
  51. ])
  52. linkflags = ' '.join([
  53. device,
  54. '-nostdlib',
  55. '-nostartfiles',
  56. '-shared',
  57. '-Wl,--gc-sections',
  58. '-Wl,--build-id=none',
  59. '-Wl,-soname=rtt-vdso.so.1',
  60. '-T %s' % linker_script,
  61. ])
  62. env = Environment(
  63. tools=['gcc', 'link'],
  64. AS=cc,
  65. ASFLAGS='-x assembler-with-cpp',
  66. CC=cc,
  67. CFLAGS=cflags,
  68. CPP=cpp,
  69. AR=ar,
  70. LINK=cc,
  71. LINKFLAGS=linkflags,
  72. CPPPATH=[user_dir, common_dir, arch_dir, vdso_root],
  73. )
  74. env.PrependENVPath('PATH', exec_path)
  75. def preprocess_linker_script(target, source, env):
  76. cmd = [env['CC'], '-E', '-P', '-x', 'assembler-with-cpp']
  77. for include_dir in env['CPPPATH']:
  78. cmd.append('-I' + include_dir)
  79. cmd.extend([str(source[0]), '-o', str(target[0])])
  80. return subprocess.call(cmd)
  81. preprocessed_linker = env.Command(linker_script, linker_script_src, preprocess_linker_script)
  82. target = os.path.join(build_dir, 'libvdso.so')
  83. source = os.path.join(common_dir, 'vdso_clock_gettime.c')
  84. objects = [env.SharedObject(target=os.path.join(build_dir, 'vdso_clock_gettime'), source=source)]
  85. shared_lib = env.SharedLibrary(target=target, source=objects)
  86. env.Depends(shared_lib, preprocessed_linker)
  87. Clean(shared_lib, build_dir)
  88. Clean(shared_lib, '.sconsign.dblite')
  89. env.Default(shared_lib)