waf: replace libuavcan with libcanard for vehicle builds

This commit is contained in:
bugobliterator 2023-01-06 00:07:00 +11:00 committed by Andrew Tridgell
parent 7067e9d917
commit 0e80802f69
6 changed files with 70 additions and 27 deletions

View File

@ -325,6 +325,9 @@ def ap_stlib(bld, **kw):
for l in kw['ap_libraries']:
bld.ap_library(l, kw['ap_vehicle'])
if 'dynamic_source' not in kw:
kw['dynamic_source'] = 'modules/DroneCAN/libcanard/dsdlc_generated/src/**.c'
kw['features'] = kw.get('features', []) + ['cxx', 'cxxstlib']
kw['target'] = kw['name']
kw['source'] = []

View File

@ -429,15 +429,26 @@ class Board:
]
if self.with_can and not cfg.env.AP_PERIPH:
env.AP_LIBRARIES += [
'AP_UAVCAN',
'modules/uavcan/libuavcan/src/**/*.cpp'
]
if not cfg.env.SITL32BIT and cfg.env.BOARD == 'sitl':
env.DEFINES.update(
HAL_ENABLE_LIBUAVCAN_DRIVERS = 0
)
else:
env.AP_LIBRARIES += [
'AP_UAVCAN',
'modules/DroneCAN/libcanard/*.c',
]
if cfg.options.enable_dronecan_tests:
env.DEFINES.update(
AP_TEST_DRONECAN_DRIVERS = 1
)
env.DEFINES.update(
UAVCAN_CPP_VERSION = 'UAVCAN_CPP03',
UAVCAN_NO_ASSERTIONS = 1,
UAVCAN_NULLPTR = 'nullptr'
UAVCAN_NULLPTR = 'nullptr',
DRONECAN_CXX_WRAPPERS = 1,
CANARD_ENABLE_DEADLINE = 1,
)
@ -638,6 +649,9 @@ class sitl(Board):
cfg.define('HAL_NUM_CAN_IFACES', 2)
cfg.define('UAVCAN_EXCEPTIONS', 0)
cfg.define('UAVCAN_SUPPORT_CANFD', 1)
env.DEFINES.update(CANARD_MULTI_IFACE=1,
CANARD_IFACE_ALL = 0x3,
CANARD_ENABLE_CANFD = 1)
env.CXXFLAGS += [
'-Werror=float-equal'
@ -1069,16 +1083,13 @@ class chibios(Board):
('10','2','1'),
]
if cfg.env.AP_PERIPH:
if cfg.env.HAL_CANFD_SUPPORTED:
env.DEFINES.update(CANARD_ENABLE_CANFD=1)
else:
env.DEFINES.update(CANARD_ENABLE_TAO_OPTION=1)
if not cfg.options.bootloader:
if int(cfg.env.HAL_NUM_CAN_IFACES) > 1:
env.DEFINES.update(CANARD_MULTI_IFACE=1)
else:
env.DEFINES.update(CANARD_MULTI_IFACE=0)
if cfg.env.HAL_CANFD_SUPPORTED:
env.DEFINES.update(CANARD_ENABLE_CANFD=1)
else:
env.DEFINES.update(CANARD_ENABLE_TAO_OPTION=1)
if not cfg.options.bootloader and cfg.env.HAL_NUM_CAN_IFACES:
if int(cfg.env.HAL_NUM_CAN_IFACES) >= 1:
env.DEFINES.update(CANARD_IFACE_ALL=(1<<int(cfg.env.HAL_NUM_CAN_IFACES))-1)
if cfg.options.Werror or cfg.env.CC_VERSION in gcc_whitelist:
cfg.msg("Enabling -Werror", "yes")
if '-Werror' not in env.CXXFLAGS:

View File

@ -443,9 +443,11 @@ def setup_canmgr_build(cfg):
env = cfg.env
env.AP_LIBRARIES += [
'AP_UAVCAN',
'modules/uavcan/libuavcan/src/**/*.cpp',
'modules/DroneCAN/libcanard/*.c',
]
env.INCLUDES += [
cfg.srcnode.find_dir('modules/DroneCAN/libcanard').abspath(),
]
env.CFLAGS += ['-DHAL_CAN_IFACES=2']
env.DEFINES += [
@ -453,6 +455,12 @@ def setup_canmgr_build(cfg):
'UAVCAN_NO_ASSERTIONS=1',
'UAVCAN_NULLPTR=nullptr'
]
if not env.AP_PERIPH:
env.DEFINES += [
'DRONECAN_CXX_WRAPPERS=1',
'CANARD_ENABLE_DEADLINE=1',
'CANARD_MULTI_IFACE=1'
]
if cfg.env.HAL_CANFD_SUPPORTED:
env.DEFINES += ['UAVCAN_SUPPORT_CANFD=1']

View File

@ -19,7 +19,7 @@ class dronecangen(Task.Task):
python = self.env.get_flat('PYTHON')
out = self.env.get_flat('OUTPUT_DIR')
src = self.env.get_flat('SRC')
dsdlc = self.env.get_flat("DSDL_COMPILER")
dsdlc = self.env.get_flat("DC_DSDL_COMPILER")
ret = self.exec_command(['{}'.format(python),
'{}'.format(dsdlc),
@ -70,6 +70,6 @@ def configure(cfg):
cfg.check_python_version(minver=(2,7,0))
env = cfg.env
env.DSDL_COMPILER_DIR = cfg.srcnode.make_node('modules/DroneCAN/dronecan_dsdlc/').abspath()
env.DSDL_COMPILER = env.DSDL_COMPILER_DIR + '/dronecan_dsdlc.py'
cfg.msg('DSDL compiler', env.DSDL_COMPILER)
env.DC_DSDL_COMPILER_DIR = cfg.srcnode.make_node('modules/DroneCAN/dronecan_dsdlc/').abspath()
env.DC_DSDL_COMPILER = env.DC_DSDL_COMPILER_DIR + '/dronecan_dsdlc.py'
cfg.msg('DC_DSDL compiler', env.DC_DSDL_COMPILER)

View File

@ -19,7 +19,7 @@ class uavcangen(Task.Task):
python = self.env.get_flat('PYTHON')
out = self.env.get_flat('OUTPUT_DIR')
src = self.env.get_flat('SRC')
dsdlc = self.env.get_flat("DSDL_COMPILER")
dsdlc = self.env.get_flat("UC_DSDL_COMPILER")
ret = self.exec_command(['{}'.format(python),
'{}'.format(dsdlc),
@ -71,6 +71,6 @@ def configure(cfg):
cfg.check_python_version(minver=(2,7,0))
env = cfg.env
env.DSDL_COMPILER_DIR = cfg.srcnode.make_node('modules/uavcan/libuavcan/dsdl_compiler').abspath()
env.DSDL_COMPILER = env.DSDL_COMPILER_DIR + '/libuavcan_dsdlc'
cfg.msg('DSDL compiler', env.DSDL_COMPILER)
env.UC_DSDL_COMPILER_DIR = cfg.srcnode.make_node('modules/uavcan/libuavcan/dsdl_compiler').abspath()
env.UC_DSDL_COMPILER = env.UC_DSDL_COMPILER_DIR + '/libuavcan_dsdlc'
cfg.msg('UC_DSDL compiler', env.UC_DSDL_COMPILER)

25
wscript
View File

@ -13,6 +13,7 @@ sys.path.insert(0, 'Tools/ardupilotwaf/')
import ardupilotwaf
import boards
import shutil
from waflib import Build, ConfigSet, Configure, Context, Utils
from waflib.Configure import conf
@ -255,6 +256,9 @@ submodules at specific revisions.
help="Enable the dds client to connect with ROS2/DDS"
)
g.add_option('--enable-dronecan-tests', action='store_true',
default=False,
help="Enables DroneCAN tests in sitl")
g = opt.ap_groups['linux']
linux_options = ('--prefix', '--destdir', '--bindir', '--libdir')
@ -478,6 +482,8 @@ def configure(cfg):
cfg.load('dronecangen')
else:
cfg.load('uavcangen')
if not (cfg.options.sitl_32bit and cfg.options.board != 'sitl'):
cfg.load('dronecangen')
cfg.env.SUBMODULE_UPDATE = cfg.options.submodule_update
@ -674,6 +680,23 @@ def _build_dynamic_sources(bld):
bld.srcnode.find_dir('modules/uavcan/libuavcan/include').abspath()
]
)
if (not bld.env.SITL32BIT) and bld.env.BOARD == 'sitl':
# remove generated files
dronecan_dir = bld.bldnode.make_node('modules/DroneCAN/libcanard/dsdlc_generated/').abspath()
if os.path.exists(dronecan_dir):
print("Removing DroneCAN generated files")
shutil.rmtree(dronecan_dir)
else:
bld(
features='dronecangen',
source=bld.srcnode.ant_glob('modules/DroneCAN/DSDL/* libraries/AP_UAVCAN/dsdl/*', dir=True, src=False),
output_dir='modules/DroneCAN/libcanard/dsdlc_generated/',
name='dronecan',
export_includes=[
bld.bldnode.make_node('modules/DroneCAN/libcanard/dsdlc_generated/include').abspath(),
bld.srcnode.find_dir('modules/DroneCAN/libcanard/').abspath(),
]
)
elif bld.env.AP_PERIPH:
bld(
features='dronecangen',
@ -812,8 +835,6 @@ def build(bld):
_load_pre_build(bld)
if bld.get_board().with_can:
bld.env.AP_LIBRARIES_OBJECTS_KW['use'] += ['uavcan']
if bld.env.AP_PERIPH:
bld.env.AP_LIBRARIES_OBJECTS_KW['use'] += ['dronecan']
_build_cmd_tweaks(bld)