Files
rt-thread/components/lwp/vdso/user/SConstruct
T
2026-04-30 06:19:58 +08:00

103 lines
2.9 KiB
Python

import os
import subprocess
arch = ARGUMENTS.get('RTT_VDSO_ARCH') or os.getenv('RTT_VDSO_ARCH')
user_dir = os.path.normpath(Dir('.').abspath)
vdso_root = os.path.normpath(os.path.join(user_dir, '..'))
arch_def_config = {
'aarch64': {
'prefix': 'aarch64-none-elf-',
'device': '-march=armv8-a -mtune=cortex-a53',
'linker': os.path.join(user_dir, 'arch', 'aarch64', 'vdso.lds.S'),
},
'arm': {
'prefix': 'arm-none-eabi-',
'device': '-march=armv7-a -marm',
'linker': os.path.join(user_dir, 'arch', 'arm', 'vdso.lds.S'),
},
'risc-v': {
'prefix': 'riscv64-none-elf-',
'device': '-march=rv64imafdc -mabi=lp64',
'linker': os.path.join(user_dir, 'arch', 'risc-v', 'vdso.lds.S'),
},
}
if arch not in arch_def_config:
raise RuntimeError('Unsupported vDSO arch: %s' % arch)
exec_path = os.getenv('RTT_EXEC_PATH') or '/usr/bin'
prefix = os.getenv('RTT_CC_PREFIX') or arch_def_config[arch]['prefix']
device = os.getenv('RTT_DEVICE') or arch_def_config[arch]['device']
linker_script_src = arch_def_config[arch]['linker']
cc = prefix + 'gcc'
cpp = prefix + 'cpp'
ar = prefix + 'ar'
common_dir = os.path.join(user_dir, 'common')
arch_dir = os.path.join(user_dir, 'arch', arch)
build_dir = os.path.join(user_dir, 'build', arch)
os.makedirs(build_dir, exist_ok=True)
linker_script = os.path.join(build_dir, 'vdso.lds')
cflags = ' '.join([
device,
'-Wall',
'-Wextra',
'-Wno-unused-parameter',
'-Wno-cpp',
'-std=gnu99',
'-O2',
'-fPIC',
'-ffreestanding',
'-fno-builtin',
'-fvisibility=hidden',
'-nostdlib',
'-nostartfiles',
])
linkflags = ' '.join([
device,
'-nostdlib',
'-nostartfiles',
'-shared',
'-Wl,--gc-sections',
'-Wl,--build-id=none',
'-Wl,-soname=rtt-vdso.so.1',
'-T %s' % linker_script,
])
env = Environment(
tools=['gcc', 'link'],
AS=cc,
ASFLAGS='-x assembler-with-cpp',
CC=cc,
CFLAGS=cflags,
CPP=cpp,
AR=ar,
LINK=cc,
LINKFLAGS=linkflags,
CPPPATH=[user_dir, common_dir, arch_dir, vdso_root],
)
env.PrependENVPath('PATH', exec_path)
def preprocess_linker_script(target, source, env):
cmd = [env['CC'], '-E', '-P', '-x', 'assembler-with-cpp']
for include_dir in env['CPPPATH']:
cmd.append('-I' + include_dir)
cmd.extend([str(source[0]), '-o', str(target[0])])
return subprocess.call(cmd)
preprocessed_linker = env.Command(linker_script, linker_script_src, preprocess_linker_script)
target = os.path.join(build_dir, 'libvdso.so')
source = os.path.join(common_dir, 'vdso_clock_gettime.c')
objects = [env.SharedObject(target=os.path.join(build_dir, 'vdso_clock_gettime'), source=source)]
shared_lib = env.SharedLibrary(target=target, source=objects)
env.Depends(shared_lib, preprocessed_linker)
Clean(shared_lib, build_dir)
Clean(shared_lib, '.sconsign.dblite')
env.Default(shared_lib)