Browse Source

waf: boards: use classes for boards definition

In order to provide board-specific behavior. For example, the incoming PX4
build will require custom build behavior.
master
Gustavo Jose de Sousa 9 years ago committed by Lucas De Marchi
parent
commit
393bea8945
  1. 443
      Tools/ardupilotwaf/boards.py
  2. 14
      wscript

443
Tools/ardupilotwaf/boards.py

@ -5,232 +5,231 @@ import sys
import waflib import waflib
BOARDS = {} _board_classes = {}
PROJECT_ENV = waflib.ConfigSet.ConfigSet() class BoardMeta(type):
def __init__(cls, name, bases, dct):
def define_board(func, name, parent_name=None): super(BoardMeta, cls).__init__(name, bases, dct)
if parent_name is None: if name == 'Board':
parent = PROJECT_ENV return
elif parent_name not in BOARDS: _board_classes[name] = cls
print("Undefined parent board '%s' for '%s'" % (parent_name, name))
sys.exit(1) class Board:
else: def configure(self, cfg):
parent = BOARDS[parent_name] env = waflib.ConfigSet.ConfigSet()
self.configure_env(env)
env = parent.derive().detach()
if name in BOARDS: d = env.get_merged_dict()
print("Multiple definitions of " + name) # Always prepend so that arguments passed in the command line get
sys.exit(1) # the priority.
BOARDS[name] = env for k, val in d.items():
func(env) # Dictionaries (like 'DEFINES') are converted to lists to
# conform to waf conventions.
if isinstance(val, dict):
for item in val.items():
cfg.env.prepend_value(k, '%s=%s' % item)
else:
cfg.env.prepend_value(k, val)
def configure_env(self, env):
# Use a dictionary instead of the convetional list for definitions to
# make easy to override them. Convert back to list before consumption.
env.DEFINES = {}
env.CFLAGS += [
'-ffunction-sections',
'-fdata-sections',
'-fsigned-char',
'-Wall',
'-Wextra',
'-Wformat',
'-Wshadow',
'-Wpointer-arith',
'-Wcast-align',
'-Wno-missing-field-initializers',
'-Wno-unused-parameter',
'-Wno-redundant-decls',
]
env.CXXFLAGS += [
'-std=gnu++11',
'-fdata-sections',
'-ffunction-sections',
'-fno-exceptions',
'-fsigned-char',
'-Wall',
'-Wextra',
'-Wformat',
'-Wshadow',
'-Wpointer-arith',
'-Wcast-align',
'-Wno-unused-parameter',
'-Wno-missing-field-initializers',
'-Wno-reorder',
'-Wno-redundant-decls',
'-Werror=format-security',
'-Werror=array-bounds',
'-Werror=unused-but-set-variable',
'-Werror=uninitialized',
'-Werror=init-self',
'-Wfatal-errors',
]
env.LINKFLAGS += [
'-Wl,--gc-sections',
]
Board = BoardMeta('Board', Board.__bases__, dict(Board.__dict__))
def get_boards_names(): def get_boards_names():
return sorted(list(BOARDS.keys())) return sorted(list(_board_classes.keys()))
# Use a dictionary instead of the convetional list for definitions to def get_board(name):
# make easy to override them. Convert back to list before consumption. return _board_classes[name]()
PROJECT_ENV.DEFINES = {}
PROJECT_ENV.CFLAGS += [
'-ffunction-sections',
'-fdata-sections',
'-fsigned-char',
'-Wall',
'-Wextra',
'-Wformat',
'-Wshadow',
'-Wpointer-arith',
'-Wcast-align',
'-Wno-missing-field-initializers',
'-Wno-unused-parameter',
'-Wno-redundant-decls',
]
PROJECT_ENV.CXXFLAGS += [
'-std=gnu++11',
'-fdata-sections',
'-ffunction-sections',
'-fno-exceptions',
'-fsigned-char',
'-Wall',
'-Wextra',
'-Wformat',
'-Wshadow',
'-Wpointer-arith',
'-Wcast-align',
'-Wno-unused-parameter',
'-Wno-missing-field-initializers',
'-Wno-reorder',
'-Wno-redundant-decls',
'-Werror=format-security',
'-Werror=array-bounds',
'-Werror=unused-but-set-variable',
'-Werror=uninitialized',
'-Werror=init-self',
'-Wfatal-errors',
]
PROJECT_ENV.LINKFLAGS += [
'-Wl,--gc-sections',
]
# NOTE: Keeping all the board definitions together so we can easily # NOTE: Keeping all the board definitions together so we can easily
# identify opportunities to simplify common flags. In the future might # identify opportunities to simplify common flags. In the future might
# be worthy to keep board definitions in files of their own. # be worthy to keep board definitions in files of their own.
def sitl(env): class sitl(Board):
env.DEFINES.update( def configure_env(self, env):
CONFIG_HAL_BOARD = 'HAL_BOARD_SITL', super(sitl, self).configure_env(env)
CONFIG_HAL_BOARD_SUBTYPE = 'HAL_BOARD_SUBTYPE_NONE',
) env.DEFINES.update(
CONFIG_HAL_BOARD = 'HAL_BOARD_SITL',
env.CXXFLAGS += [ CONFIG_HAL_BOARD_SUBTYPE = 'HAL_BOARD_SUBTYPE_NONE',
'-O3', )
] env.CXXFLAGS += [
'-O3',
env.LIB += [ ]
'm', env.LIB += [
] 'm',
env.LINKFLAGS += ['-pthread',] ]
env.AP_LIBRARIES += [ env.LINKFLAGS += ['-pthread',]
'AP_HAL_SITL', env.AP_LIBRARIES += [
'SITL', 'AP_HAL_SITL',
] 'SITL',
]
define_board(sitl, 'sitl')
class linux(Board):
def configure_env(self, env):
def linux(env): super(linux, self).configure_env(env)
env.DEFINES.update(
CONFIG_HAL_BOARD = 'HAL_BOARD_LINUX', env.DEFINES.update(
CONFIG_HAL_BOARD_SUBTYPE = 'HAL_BOARD_SUBTYPE_LINUX_NONE', CONFIG_HAL_BOARD = 'HAL_BOARD_LINUX',
) CONFIG_HAL_BOARD_SUBTYPE = 'HAL_BOARD_SUBTYPE_LINUX_NONE',
)
env.CXXFLAGS += [ env.CXXFLAGS += [
'-O3', '-O3',
] ]
env.LIB += [
env.LIB += [ 'm',
'm', 'rt',
'rt', ]
] env.LINKFLAGS += ['-pthread',]
env.LINKFLAGS += ['-pthread',] env.AP_LIBRARIES = [
env.AP_LIBRARIES = [ 'AP_HAL_Linux',
'AP_HAL_Linux', ]
]
class minlure(linux):
define_board(linux, 'linux') def configure_env(self, env):
super(minlure, self).configure_env(env)
def minlure(env): env.DEFINES.update(
env.DEFINES.update( CONFIG_HAL_BOARD_SUBTYPE = 'HAL_BOARD_SUBTYPE_LINUX_MINLURE',
CONFIG_HAL_BOARD_SUBTYPE = 'HAL_BOARD_SUBTYPE_LINUX_MINLURE', )
)
define_board(minlure, 'minlure', 'linux') class erleboard(linux):
def configure_env(self, env):
super(erleboard, self).configure_env(env)
def erleboard(env):
env.TOOLCHAIN = 'arm-linux-gnueabihf' env.TOOLCHAIN = 'arm-linux-gnueabihf'
env.DEFINES.update(
env.DEFINES.update( CONFIG_HAL_BOARD_SUBTYPE = 'HAL_BOARD_SUBTYPE_LINUX_ERLEBOARD',
CONFIG_HAL_BOARD_SUBTYPE = 'HAL_BOARD_SUBTYPE_LINUX_ERLEBOARD', )
)
class navio(linux):
define_board(erleboard, 'erleboard', 'linux') def configure_env(self, env):
super(navio, self).configure_env(env)
def navio(env): env.TOOLCHAIN = 'arm-linux-gnueabihf'
env.TOOLCHAIN = 'arm-linux-gnueabihf' env.DEFINES.update(
CONFIG_HAL_BOARD_SUBTYPE = 'HAL_BOARD_SUBTYPE_LINUX_NAVIO',
env.DEFINES.update( )
CONFIG_HAL_BOARD_SUBTYPE = 'HAL_BOARD_SUBTYPE_LINUX_NAVIO',
) class zynq(linux):
def configure_env(self, env):
define_board(navio, 'navio', 'linux') super(zynq, self).configure_env(env)
env.TOOLCHAIN = 'arm-xilinx-linux-gnueabi'
def zynq(env): env.DEFINES.update(
env.TOOLCHAIN = 'arm-xilinx-linux-gnueabi' CONFIG_HAL_BOARD_SUBTYPE = 'HAL_BOARD_SUBTYPE_LINUX_ZYNQ',
)
env.DEFINES.update(
CONFIG_HAL_BOARD_SUBTYPE = 'HAL_BOARD_SUBTYPE_LINUX_ZYNQ', class bbbmini(linux):
) def configure_env(self, env):
super(bbbmini, self).configure_env(env)
define_board(zynq, 'zynq', 'linux')
env.TOOLCHAIN = 'arm-linux-gnueabihf'
env.DEFINES.update(
def bbbmini(env): CONFIG_HAL_BOARD_SUBTYPE = 'HAL_BOARD_SUBTYPE_LINUX_BBBMINI',
env.TOOLCHAIN = 'arm-linux-gnueabihf' )
env.DEFINES.update( class pxf(linux):
CONFIG_HAL_BOARD_SUBTYPE = 'HAL_BOARD_SUBTYPE_LINUX_BBBMINI', def configure_env(self, env):
) super(pxf, self).configure_env(env)
define_board(bbbmini, 'bbbmini', 'linux') env.TOOLCHAIN = 'arm-linux-gnueabihf'
env.DEFINES.update(
CONFIG_HAL_BOARD_SUBTYPE = 'HAL_BOARD_SUBTYPE_LINUX_PXF',
def pxf(env): )
env.TOOLCHAIN = 'arm-linux-gnueabihf'
class bebop(linux):
env.DEFINES.update( def configure_env(self, env):
CONFIG_HAL_BOARD_SUBTYPE = 'HAL_BOARD_SUBTYPE_LINUX_PXF', super(bebop, self).configure_env(env)
)
env.TOOLCHAIN = 'arm-linux-gnueabihf'
define_board(pxf, 'pxf', 'linux') env.DEFINES.update(
CONFIG_HAL_BOARD_SUBTYPE = 'HAL_BOARD_SUBTYPE_LINUX_BEBOP',
)
def bebop(env): env.STATIC_LINKING = [True]
env.TOOLCHAIN = 'arm-linux-gnueabihf'
class raspilot(linux):
env.DEFINES.update( def configure_env(self, env):
CONFIG_HAL_BOARD_SUBTYPE = 'HAL_BOARD_SUBTYPE_LINUX_BEBOP', super(raspilot, self).configure_env(env)
)
env.TOOLCHAIN = 'arm-linux-gnueabihf'
env.STATIC_LINKING = [True] env.DEFINES.update(
CONFIG_HAL_BOARD_SUBTYPE = 'HAL_BOARD_SUBTYPE_LINUX_RASPILOT',
define_board(bebop, 'bebop', 'linux') )
class erlebrain2(linux):
def raspilot(env): def configure_env(self, env):
env.TOOLCHAIN = 'arm-linux-gnueabihf' super(erlebrain2, self).configure_env(env)
env.DEFINES.update( env.TOOLCHAIN = 'arm-linux-gnueabihf'
CONFIG_HAL_BOARD_SUBTYPE = 'HAL_BOARD_SUBTYPE_LINUX_RASPILOT', env.DEFINES.update(
) CONFIG_HAL_BOARD_SUBTYPE = 'HAL_BOARD_SUBTYPE_LINUX_ERLEBRAIN2',
)
define_board(raspilot, 'raspilot', 'linux')
class bhat(linux):
def configure_env(self, env):
def erlebrain2(env): super(bhat, self).configure_env(env)
env.TOOLCHAIN = 'arm-linux-gnueabihf'
env.TOOLCHAIN = 'arm-linux-gnueabihf'
env.DEFINES.update( env.DEFINES.update(
CONFIG_HAL_BOARD_SUBTYPE = 'HAL_BOARD_SUBTYPE_LINUX_ERLEBRAIN2', CONFIG_HAL_BOARD_SUBTYPE = 'HAL_BOARD_SUBTYPE_LINUX_BH',
) )
define_board(erlebrain2, 'erlebrain2', 'linux') class pxfmini(linux):
def configure_env(self, env):
super(pxfmini, self).configure_env(env)
def bhat(env):
env.TOOLCHAIN = 'arm-linux-gnueabihf' env.TOOLCHAIN = 'arm-linux-gnueabihf'
env.DEFINES.update(
env.DEFINES.update( CONFIG_HAL_BOARD_SUBTYPE = 'HAL_BOARD_SUBTYPE_LINUX_PXFMINI',
CONFIG_HAL_BOARD_SUBTYPE = 'HAL_BOARD_SUBTYPE_LINUX_BH', )
)
define_board(bhat, 'bhat', 'linux')
def pxfmini(env):
env.TOOLCHAIN = 'arm-linux-gnueabihf'
env.DEFINES.update(
CONFIG_HAL_BOARD_SUBTYPE = 'HAL_BOARD_SUBTYPE_LINUX_PXFMINI',
)
define_board(pxfmini, 'pxfmini', 'linux')

14
wscript

@ -61,19 +61,7 @@ def configure(cfg):
cfg.msg('Setting board to', cfg.options.board) cfg.msg('Setting board to', cfg.options.board)
cfg.env.BOARD = cfg.options.board cfg.env.BOARD = cfg.options.board
board_dict = boards.BOARDS[cfg.env.BOARD].get_merged_dict() boards.get_board(cfg.env.BOARD).configure(cfg)
# Always prepend so that arguments passed in the command line get
# the priority.
for k in board_dict:
val = board_dict[k]
# Dictionaries (like 'DEFINES') are converted to lists to
# conform to waf conventions.
if isinstance(val, dict):
for item in val.items():
cfg.env.prepend_value(k, '%s=%s' % item)
else:
cfg.env.prepend_value(k, val)
cfg.load('toolchain') cfg.load('toolchain')
cfg.load('compiler_cxx compiler_c') cfg.load('compiler_cxx compiler_c')

Loading…
Cancel
Save