waf: added QURT board target

This commit is contained in:
Andrew Tridgell 2024-07-06 09:13:29 +10:00
parent a136c28122
commit af34df2b9f
3 changed files with 141 additions and 1 deletions

View File

@ -43,7 +43,10 @@ class Board:
def configure(self, cfg): def configure(self, cfg):
cfg.env.TOOLCHAIN = cfg.options.toolchain or self.toolchain cfg.env.TOOLCHAIN = cfg.options.toolchain or self.toolchain
cfg.env.ROMFS_FILES = [] cfg.env.ROMFS_FILES = []
cfg.load('toolchain') if hasattr(self,'configure_toolchain'):
self.configure_toolchain(cfg)
else:
cfg.load('toolchain')
cfg.load('cxx_checks') cfg.load('cxx_checks')
# don't check elf symbols by default # don't check elf symbols by default
@ -198,6 +201,8 @@ class Board:
cfg.msg("Configured VSCode Intellisense:", 'no', color='YELLOW') cfg.msg("Configured VSCode Intellisense:", 'no', color='YELLOW')
def cc_version_gte(self, cfg, want_major, want_minor): def cc_version_gte(self, cfg, want_major, want_minor):
if cfg.env.TOOLCHAIN == "custom":
return True
(major, minor, patchlevel) = cfg.env.CC_VERSION (major, minor, patchlevel) = cfg.env.CC_VERSION
return (int(major) > want_major or return (int(major) > want_major or
(int(major) == want_major and int(minor) >= want_minor)) (int(major) == want_major and int(minor) >= want_minor))
@ -207,6 +212,8 @@ class Board:
# make easy to override them. Convert back to list before consumption. # make easy to override them. Convert back to list before consumption.
env.DEFINES = {} env.DEFINES = {}
env.with_can = self.with_can
# potentially set extra defines from an environment variable: # potentially set extra defines from an environment variable:
if cfg.options.define is not None: if cfg.options.define is not None:
for (n, v) in [d.split("=") for d in cfg.options.define]: for (n, v) in [d.split("=") for d in cfg.options.define]:
@ -1646,3 +1653,99 @@ class SITL_x86_64_linux_gnu(SITL_static):
class SITL_arm_linux_gnueabihf(SITL_static): class SITL_arm_linux_gnueabihf(SITL_static):
toolchain = 'arm-linux-gnueabihf' toolchain = 'arm-linux-gnueabihf'
class QURT(Board):
'''support for QURT based boards'''
toolchain = 'custom'
def __init__(self):
self.with_can = False
def configure_toolchain(self, cfg):
cfg.env.CXX_NAME = 'gcc'
cfg.env.HEXAGON_SDK_DIR = "/opt/hexagon-sdk/4.1.0.4-lite"
cfg.env.CC_VERSION = ('4','1','0')
cfg.env.TOOLCHAIN_DIR = cfg.env.HEXAGON_SDK_DIR + "/tools/HEXAGON_Tools/8.4.05/Tools"
cfg.env.COMPILER_CC = cfg.env.TOOLCHAIN_DIR + "/bin/hexagon-clang"
cfg.env.COMPILER_CXX = cfg.env.TOOLCHAIN_DIR + "/bin/hexagon-clang++"
cfg.env.LINK_CXX = cfg.env.HEXAGON_SDK_DIR + "/tools/HEXAGON_Tools/8.4.05/Tools/bin/hexagon-link"
cfg.env.CXX = ["ccache", cfg.env.COMPILER_CXX]
cfg.env.CC = ["ccache", cfg.env.COMPILER_CC]
cfg.env.CXX_TGT_F = ['-c', '-o']
cfg.env.CC_TGT_F = ['-c', '-o']
cfg.env.CCLNK_SRC_F = []
cfg.env.CXXLNK_SRC_F = []
cfg.env.CXXLNK_TGT_F = ['-o']
cfg.env.CCLNK_TGT_F = ['-o']
cfg.env.CPPPATH_ST = '-I%s'
cfg.env.DEFINES_ST = '-D%s'
cfg.env.AR = cfg.env.HEXAGON_SDK_DIR + "/tools/HEXAGON_Tools/8.4.05/Tools/bin/hexagon-ar"
cfg.env.ARFLAGS = 'rcs'
cfg.env.cxxstlib_PATTERN = 'lib%s.a'
cfg.env.cstlib_PATTERN = 'lib%s.a'
cfg.env.LIBPATH_ST = '-L%s'
cfg.env.LIB_ST = '-l%s'
cfg.env.SHLIB_MARKER = ''
cfg.env.STLIBPATH_ST = '-L%s'
cfg.env.STLIB_MARKER = ''
cfg.env.STLIB_ST = '-l%s'
cfg.env.LDFLAGS = [
'-lgcc',
cfg.env.TOOLCHAIN_DIR + '/target/hexagon/lib/v66/G0/pic/finiS.o'
]
def configure_env(self, cfg, env):
super(QURT, self).configure_env(cfg, env)
env.BOARD_CLASS = "QURT"
env.HEXAGON_APP = "libardupilot.so"
env.INCLUDES += [cfg.env.HEXAGON_SDK_DIR + "/rtos/qurt/computev66/include/qurt"]
env.INCLUDES += [cfg.env.HEXAGON_SDK_DIR + "/rtos/qurt/computev66/include/posix"]
CFLAGS = "-MD -mv66 -fPIC -mcpu=hexagonv66 -G0 -fdata-sections -ffunction-sections -fomit-frame-pointer -fmerge-all-constants -fno-signed-zeros -fno-trapping-math -freciprocal-math -fno-math-errno -fno-strict-aliasing -fvisibility=hidden -fno-rtti -fmath-errno"
env.CXXFLAGS += CFLAGS.split()
env.CFLAGS += CFLAGS.split()
env.DEFINES.update(
CONFIG_HAL_BOARD = 'HAL_BOARD_QURT',
CONFIG_HAL_BOARD_SUBTYPE = 'HAL_BOARD_SUBTYPE_NONE',
AP_SIM_ENABLED = 0,
)
env.LINKFLAGS = [
"-march=hexagon",
"-mcpu=hexagonv66",
"-shared",
"-call_shared",
"-G0",
cfg.env.TOOLCHAIN_DIR + "/target/hexagon/lib/v66/G0/pic/initS.o",
f"-L{cfg.env.TOOLCHAIN_DIR}/target/hexagon/lib/v66/G0/pic",
"-Bsymbolic",
cfg.env.TOOLCHAIN_DIR + "/target/hexagon/lib/v66/G0/pic/libgcc.a",
"--wrap=malloc",
"--wrap=calloc",
"--wrap=free",
"--wrap=realloc",
"--wrap=printf",
"--wrap=strdup",
"--wrap=__stack_chk_fail",
"-lc"
]
if not cfg.env.DEBUG:
env.CXXFLAGS += [
'-O3',
]
env.AP_LIBRARIES += [
'AP_HAL_QURT',
]
def build(self, bld):
super(QURT, self).build(bld)
bld.load('qurt')
def get_name(self):
# get name of class
return self.__class__.__name__

View File

@ -0,0 +1,35 @@
# encoding: utf-8
"""
Waf tool for QURT build
"""
def build(bld):
AARCH64_SDK_DIR = "/opt/aarch64-sdk/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu"
AARCH64_CC = AARCH64_SDK_DIR + "/bin/aarch64-linux-gnu-gcc"
AARCH64_CXX = AARCH64_SDK_DIR + "/bin/aarch64-linux-gnu-g++"
STUB_C = bld.srcnode.make_node('libraries/AP_HAL_QURT/ap_host/libslpi-link-api/src/slpi_link_stub.c')
STUB_INC = bld.srcnode.make_node('libraries/AP_HAL_QURT/ap_host/libslpi-link-api/inc')
STUB_SO = bld.bldnode.find_or_declare('slpi_link_stub.so')
MAIN_CPP = bld.srcnode.make_node('libraries/AP_HAL_QURT/ap_host/src/main.cpp')
IFADDR_CPP = bld.srcnode.make_node('libraries/AP_HAL_QURT/ap_host/src/getifaddrs.cpp')
AP_HOST = bld.bldnode.find_or_declare('ap_host')
bld(
# build slpi stub library
source=[STUB_C],
rule="%s -fPIC -o %s -shared -Wl,-soname,libslpi_link.so %s" % (AARCH64_CC, STUB_SO.abspath(), STUB_C.abspath()),
target=[STUB_SO],
group='dynamic_sources'
)
bld(
# build ap_host
source=[STUB_SO, MAIN_CPP],
rule="%s -I%s %s %s %s -o %s" % (AARCH64_CXX, STUB_INC.abspath(),
MAIN_CPP.abspath(), IFADDR_CPP.abspath(), STUB_SO.abspath(), AP_HOST.abspath()),
target=[AP_HOST],
group='dynamic_sources'
)

View File

@ -133,6 +133,8 @@ def configure(cfg):
_filter_supported_cxx_compilers('g++', 'clang++') _filter_supported_cxx_compilers('g++', 'clang++')
cfg.msg('Using toolchain', cfg.env.TOOLCHAIN) cfg.msg('Using toolchain', cfg.env.TOOLCHAIN)
if cfg.env.TOOLCHAIN == "custom":
return
if cfg.env.TOOLCHAIN == 'native': if cfg.env.TOOLCHAIN == 'native':
cfg.load('compiler_cxx compiler_c') cfg.load('compiler_cxx compiler_c')