You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
63 lines
2.0 KiB
63 lines
2.0 KiB
|
5 months ago
|
import os
|
||
|
|
import sys
|
||
|
|
import subprocess
|
||
|
|
|
||
|
|
arguments = sys.argv[2]
|
||
|
|
vdso_usr = arguments
|
||
|
|
vdso_path = os.path.join(vdso_usr, '..', '..', '..')
|
||
|
|
|
||
|
|
EXEC_PATH = os.getenv('RTT_EXEC_PATH') or '/usr/bin'
|
||
|
|
PREFIX = os.getenv('RTT_CC_PREFIX') or 'riscv64-none-elf-'
|
||
|
|
|
||
|
|
def get_riscv64_default_arch_abi(gcc_bin):
|
||
|
|
try:
|
||
|
|
result = subprocess.check_output(
|
||
|
|
[gcc_bin, '-Q', '--help=target'],
|
||
|
|
universal_newlines=True
|
||
|
|
)
|
||
|
|
arch = None
|
||
|
|
abi = None
|
||
|
|
for line in result.splitlines():
|
||
|
|
if '-march=' in line:
|
||
|
|
arch = line.strip().split()[1]
|
||
|
|
arch = arch.split('_')[0] # Get the base architecture, e.g., rv64imafdc
|
||
|
|
if '-mabi=' in line and 'option' not in line:
|
||
|
|
abi = line.strip().split()[1]
|
||
|
|
return arch, abi
|
||
|
|
except Exception as e:
|
||
|
|
print("Error getting arch/abi:", e)
|
||
|
|
return None, None
|
||
|
|
|
||
|
|
# get the gcc path
|
||
|
|
CC_BIN = PREFIX + 'gcc'
|
||
|
|
arch, abi = get_riscv64_default_arch_abi(CC_BIN)
|
||
|
|
if arch and abi:
|
||
|
|
DEVICE = f' -march={arch} -mabi={abi} '
|
||
|
|
else:
|
||
|
|
DEVICE = ' -march=rv64imafdc -mabi=lp64' # fallback
|
||
|
|
|
||
|
|
CC = PREFIX + 'gcc'
|
||
|
|
CPP = PREFIX + 'cpp'
|
||
|
|
AS = PREFIX + 'gcc'
|
||
|
|
AR = PREFIX + 'ar'
|
||
|
|
LINK = PREFIX + 'gcc'
|
||
|
|
|
||
|
|
AFLAGS = ' -x assembler-with-cpp'
|
||
|
|
CFLAGS = DEVICE + ' -Wall -Wno-cpp -std=gnu99 -fdiagnostics-color=always -fPIC -O2'
|
||
|
|
LFLAGS = DEVICE + ' -Bsymbolic -Wl,--gc-sections -T {path}/vdso.lds'.format(path=vdso_usr)
|
||
|
|
CFLAGS += " -I . -I {vdso_path} ".format(vdso_path=vdso_path)
|
||
|
|
|
||
|
|
src = Glob('*.c')
|
||
|
|
env = Environment(tools=['gcc', 'link'],
|
||
|
|
AS = AS, ASFLAGS = AFLAGS,
|
||
|
|
CC = CC, CFLAGS = CFLAGS,
|
||
|
|
CPP = CPP, AR = AR,
|
||
|
|
LINK = LINK, LINKFLAGS = LFLAGS)
|
||
|
|
env.PrependENVPath('PATH', EXEC_PATH)
|
||
|
|
|
||
|
|
target = os.path.join(vdso_path, 'user', 'build', 'libvdso.so')
|
||
|
|
shared_lib = env.SharedLibrary(target=target, source=src)
|
||
|
|
Clean(shared_lib, '{vdso_usr}/vdso.lds'.format(vdso_usr=vdso_usr))
|
||
|
|
Clean(shared_lib, '.sconsign.dblite')
|
||
|
|
env.Default(shared_lib)
|