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