Initial draft of making BUILD files for y2014.
Change-Id: Ib62acfe4ee8f20ccd5b5d684acdd8cc5a7e79d8d
diff --git a/doc/gyp_to_bazel.py b/doc/gyp_to_bazel.py
new file mode 100755
index 0000000..b3da95b
--- /dev/null
+++ b/doc/gyp_to_bazel.py
@@ -0,0 +1,285 @@
+#!/usr/bin/python3
+
+# This script converts simple Gyp files to their Bazel equivalents.
+# It is not intended to be particularly extensible; it is only going to be used
+# once over all of our code and then forgotten about.
+# This "only has to work on exactly the code we have now" property also means
+# it's pretty picky about many things and doesn't try to handle anything
+# beyond what we actually have.
+#
+# It takes a list of folders to deal with.
+#
+# Running this script requires PyYAML <pyyaml.org> to be installed.
+
+import sys
+import os
+import yaml
+import collections
+
+'''Converts a Gyp filename to its Bazel equivalent.
+
+Args:
+ gyp_file_name: The name of the gyp file this is contained in.
+ This is important for resolving relative paths etc.
+ file: The name of the file to deal with.
+'''
+def gyp_file_to_bazel(gyp_file_name, file):
+ if file.startswith('<(AOS)/'):
+ return '//aos' + file[6:]
+ elif file.startswith('<(DEPTH)/'):
+ return '//' + file[9:]
+ else:
+ if '(' in file:
+ raise RuntimeError('Bad variable in file "%s"' % file)
+ split_gyp = os.path.dirname(gyp_file_name).split('/')
+ rest = []
+ dotdots = 0
+ doing_dotdots = True
+ for component in file.split('/'):
+ if component == '..':
+ dotdots += 1
+ if not doing_dotdots:
+ raise RuntimeError('Bad use of .. in file "%s"' % file)
+ else:
+ doing_dotdots = False
+ rest.append(component)
+ return '/'.join(['/'] + split_gyp[:-dotdots] + rest)
+
+'''Converts a Gyp target to its Bazel equivalent.
+
+Args:
+ gyp_file_name: The name of the gyp file this is contained in.
+ This is important for resolving relative paths etc.
+ target: The name of the target to deal with.
+'''
+def gyp_target_to_bazel(gyp_file_name, target):
+ if not ':' in target:
+ if '.' in target:
+ raise RuntimeError('Have a filename instead of a target: "%s"' % target)
+ return ':' + target
+ if target[0] == ':':
+ return target
+
+ if target == '<(AOS)/build/aos.gyp:logging':
+ return '//aos/common/logging'
+
+ split = target.split(':')
+ if len(split) != 2:
+ raise RuntimeError('Not sure how to parse target "%s"' % target)
+
+ if split[0] == '<(EXTERNALS)':
+ return '//third_party/' + split[1]
+
+ split_path = split[0].rsplit('/', 1)
+ if len(split_path) != 2:
+ raise RuntimeError('TODO(Brian): Handle referring to this .gyp file as %s!' % split[0])
+ if not split_path[1].endswith('.gyp'):
+ raise RuntimeError('Not sure how to deal with gyp filename "%s"' % split[0])
+
+ folder = gyp_file_to_bazel(gyp_file_name, split_path[0])
+
+ if not folder.endswith(split_path[1][:-4]):
+ raise RuntimeError('Not sure how to deal with non-matching gyp file "%s"' % target)
+
+ return '%s:%s' % (folder, split[1])
+
+'''Represents a Bazel build target.
+
+Subclasses represent actual concrete things which are emitted into a BUILD
+file.'''
+class BuildTarget(object):
+ def __init__(self, type, name):
+ self.__type = type
+ self.__name = name
+
+ def add_dep(self, bazel_dep):
+ self.__deps.append(bazel_dep)
+
+ '''Returns a collections.OrderedDict with all of the attributes on the
+ Bazel rule this represents.
+
+ Subclasses are expected to override this and add their own attributes
+ in the appropriate order.'''
+ def attrs(self):
+ r = collections.OrderedDict()
+ r['name'] = self.__name
+ return r
+
+ '''Returns a set of load statements.
+
+ Subclasses are expected to override this and add their own loads.
+
+ Each element of the result is the arguments to a single load call.'''
+ def loads(self):
+ return set()
+
+ '''Returns the Bazel representation of a given object as an attribute
+ value.'''
+ def __to_bazel_string(o):
+ if isinstance(o, str):
+ return repr(o)
+ if hasattr(o, '__iter__'):
+ r = ['[']
+ for c in o:
+ r.append(' %s,' % BuildTarget.__to_bazel_string(c))
+ r.append(' ]')
+ return '\n'.join(r)
+ else:
+ return str(o)
+
+ def __str__(self):
+ r = [self.__type + '(']
+ for name, value in self.attrs().items():
+ if value:
+ r.append(' %s = %s,' % (name, BuildTarget.__to_bazel_string(value)))
+ r.append(')')
+ return '\n'.join(r)
+
+'''Represents a cc_* target.'''
+class CcBuildTarget(BuildTarget):
+ def __init__(self, type, name):
+ if not type.startswith('cc_'):
+ raise
+
+ super(CcBuildTarget, self).__init__(type, name)
+
+ self.__srcs = []
+ self.__deps = []
+
+ def add_src(self, src):
+ self.__srcs.append(src)
+
+ def add_dep(self, dep):
+ self.__deps.append(dep)
+
+ def attrs(self):
+ r = super(CcBuildTarget, self).attrs();
+ r['srcs'] = self.__srcs
+ r['deps'] = self.__deps
+ return r
+
+'''Represents a filegroup target.'''
+class FilegroupTarget(BuildTarget):
+ def __init__(self, name):
+ super(FilegroupTarget, self).__init__('filegroup', name)
+
+ self.__srcs = []
+
+ def add_src(self, src):
+ self.__srcs.append(src)
+
+ def attrs(self):
+ r = super(FilegroupTarget, self).attrs();
+ r['srcs'] = self.__srcs
+ return r
+
+'''Represents a queue_library target.'''
+class QueueTarget(BuildTarget):
+ def __init__(self, name):
+ super(QueueTarget, self).__init__('queue_library', name)
+
+ self.__srcs = []
+
+ def add_src(self, src):
+ self.__srcs.append(src)
+
+ def loads(self):
+ return set((('aos/build/queues', 'queue_library'),))
+
+ def attrs(self):
+ r = super(QueueTarget, self).attrs();
+ r['srcs'] = self.__srcs
+ return r
+
+def main(argv):
+ for d in argv:
+ build_targets = []
+
+ d = d.rstrip('/')
+ gyp_file_name = os.path.join(d, os.path.split(d)[-1] + '.gyp')
+ with open(gyp_file_name, 'r') as gyp_file:
+ gyp = yaml.load(gyp_file)
+ if 'targets' not in gyp:
+ print('No targets entry found in %s!' % gyp_file_name, file=sys.stderr)
+ return 1
+ if list(gyp.keys()) != ['targets']:
+ print('Unknown keys of %s from %s' % (gyp.keys(), gyp_file_name),
+ file=sys.stderr)
+ targets = gyp['targets']
+ for gyp_target in targets:
+ target = None
+ name = gyp_target['target_name']
+ type = gyp_target['type']
+ if (type in ['static_library', 'executable'] and
+ not 'includes' in gyp_target):
+ cc_type = {
+ 'static_library': 'cc_library',
+ 'executable': 'cc_binary',
+ }[type]
+ target = CcBuildTarget(cc_type, name)
+
+ for dep in gyp_target['dependencies']:
+ target.add_dep(gyp_target_to_bazel(gyp_file_name, dep))
+ for src in gyp_target['sources']:
+ target.add_src(src)
+ elif type == 'none':
+ target = FilegroupTarget(name)
+ for dep in gyp_target['dependencies']:
+ target.add_src(gyp_target_to_bazel(gyp_file_name, dep))
+ elif 'includes' in gyp_target:
+ includes = gyp_target['includes']
+ if len(includes) != 1:
+ raise RuntimeError(
+ 'Not sure how to handle multiple includes in %s' % gyp_target)
+ include = gyp_file_to_bazel(gyp_file_name, includes[0])
+ if include == '//aos/build/queues.gypi':
+ vars = gyp_target['variables']
+ if 'header_path' not in vars:
+ raise RuntimeError(
+ 'No header_path for target %s in %s' % (name, gyp_file_name))
+ if list(vars.keys()) != ['header_path']:
+ raise RuntimeError(
+ 'Extra variables for target %s in %s' % (name, gyp_file_name))
+ if vars['header_path'] != os.path.dirname(gyp_file_name):
+ raise RuntimeError(
+ 'Incorrect header_path for target %s in %s' % (name,
+ gyp_file_name))
+
+ target = QueueTarget(name)
+ for src in gyp_target['sources']:
+ if '/' in src:
+ raise RuntimeError(
+ '.q src %s in bad dir for target %s in %s' % (src,
+ name,
+ gyp_file_name))
+ target.add_src(src)
+ else:
+ raise RuntimeError(
+ 'Unknown include %s for target %s in %s' % (include, name,
+ gyp_file_name))
+ else:
+ raise RuntimeError(
+ 'Unknown type %s for target %s in %s' % (type, name, gyp_file_name))
+
+ if not target:
+ raise
+ build_targets.append(target)
+
+ with open(os.path.join(d, 'BUILD'), 'w') as build_file:
+ build_file.write(
+ 'package(default_visibility = [\'//visibility:public\'])\n')
+ loads = set()
+ for t in build_targets:
+ loads |= t.loads()
+ if loads:
+ build_file.write('\n')
+ for load in sorted(loads):
+ build_file.write('load(%s)\n' % (', '.join([repr(part) for part
+ in load])))
+ for t in build_targets:
+ build_file.write('\n')
+ build_file.write(str(t))
+ build_file.write('\n')
+
+if __name__ == '__main__':
+ sys.exit(main(sys.argv[1:]))
diff --git a/y2014/BUILD b/y2014/BUILD
new file mode 100644
index 0000000..9c65f34
--- /dev/null
+++ b/y2014/BUILD
@@ -0,0 +1,37 @@
+package(default_visibility = ['//visibility:public'])
+
+cc_library(
+ name = 'constants',
+ srcs = [
+ 'constants.cc',
+ ],
+ deps = [
+ '//aos/common/logging',
+ '//aos/common:once',
+ '//aos/common/network:team_number',
+ '//frc971/control_loops:state_feedback_loop',
+ '//y2014/control_loops/drivetrain:polydrivetrain_plants',
+ ],
+)
+
+cc_binary(
+ name = 'joystick_reader',
+ srcs = [
+ 'joystick_reader.cc',
+ ],
+ deps = [
+ '//aos/prime/input:joystick_input',
+ '//aos/linux_code:init',
+ '//aos/common/logging',
+ '//aos/common:time',
+ '//aos/common/util:log_interval',
+ '//aos/common/actions:action_lib',
+ '//y2014/control_loops/drivetrain:drivetrain_queue',
+ '//y2014:constants',
+ '//frc971/queues:gyro',
+ '//frc971/autonomous:auto_queue',
+ '//y2014/control_loops/claw:claw_queue',
+ '//y2014/control_loops/shooter:shooter_queue',
+ '//y2014/actors:shoot_action_lib',
+ ],
+)
diff --git a/y2014/actors/BUILD b/y2014/actors/BUILD
new file mode 100644
index 0000000..c5304a8
--- /dev/null
+++ b/y2014/actors/BUILD
@@ -0,0 +1,85 @@
+package(default_visibility = ['//visibility:public'])
+
+load('aos/build/queues', 'queue_library')
+
+filegroup(
+ name = 'binaries',
+ srcs = [
+ ':drivetrain_action',
+ ':shoot_action',
+ ],
+)
+
+queue_library(
+ name = 'shoot_action_queue',
+ srcs = [
+ 'shoot_action.q',
+ ],
+)
+
+cc_library(
+ name = 'shoot_action_lib',
+ srcs = [
+ 'shoot_actor.cc',
+ ],
+ deps = [
+ ':shoot_action_queue',
+ '//aos/common/actions:action_lib',
+ '//y2014/queues:profile_params',
+ '//aos/common/logging',
+ '//y2014/control_loops/shooter:shooter_queue',
+ '//y2014/control_loops/claw:claw_queue',
+ '//y2014/control_loops/drivetrain:drivetrain_queue',
+ '//y2014:constants',
+ ],
+)
+
+cc_binary(
+ name = 'shoot_action',
+ srcs = [
+ 'shoot_actor_main.cc',
+ ],
+ deps = [
+ '//aos/linux_code:init',
+ ':shoot_action_lib',
+ ':shoot_action_queue',
+ ],
+)
+
+queue_library(
+ name = 'drivetrain_action_queue',
+ srcs = [
+ 'drivetrain_action.q',
+ ],
+)
+
+cc_library(
+ name = 'drivetrain_action_lib',
+ srcs = [
+ 'drivetrain_actor.cc',
+ ],
+ deps = [
+ ':drivetrain_action_queue',
+ '//y2014:constants',
+ '//aos/common:time',
+ '//aos/common/util:phased_loop',
+ '//aos/common/logging',
+ '//aos/common/actions:action_lib',
+ '//aos/common/logging:queue_logging',
+ '//third_party/eigen',
+ '//aos/common/util:trapezoid_profile',
+ '//y2014/control_loops/drivetrain:drivetrain_queue',
+ ],
+)
+
+cc_binary(
+ name = 'drivetrain_action',
+ srcs = [
+ 'drivetrain_actor_main.cc',
+ ],
+ deps = [
+ '//aos/linux_code:init',
+ ':drivetrain_action_lib',
+ ':drivetrain_action_queue',
+ ],
+)
diff --git a/y2014/autonomous/BUILD b/y2014/autonomous/BUILD
new file mode 100644
index 0000000..0ff5b7e
--- /dev/null
+++ b/y2014/autonomous/BUILD
@@ -0,0 +1,39 @@
+package(default_visibility = ['//visibility:public'])
+
+cc_library(
+ name = 'auto_lib',
+ srcs = [
+ 'auto.cc',
+ ],
+ deps = [
+ '//frc971/autonomous:auto_queue',
+ '//aos/common/controls:control_loop',
+ '//y2014/control_loops/drivetrain:drivetrain_queue',
+ '//y2014/control_loops/shooter:shooter_queue',
+ '//y2014/control_loops/claw:claw_queue',
+ '//y2014:constants',
+ '//aos/common:time',
+ '//aos/common/util:phased_loop',
+ '//aos/common/util:trapezoid_profile',
+ '//aos/common/logging',
+ '//aos/common/actions:action_lib',
+ '//y2014/actors:shoot_action_lib',
+ '//y2014/actors:drivetrain_action_lib',
+ '//y2014/queues:hot_goal',
+ '//aos/common/logging:queue_logging',
+ '//y2014/queues:profile_params',
+ '//y2014/queues:auto_mode',
+ ],
+)
+
+cc_binary(
+ name = 'auto',
+ srcs = [
+ 'auto_main.cc',
+ ],
+ deps = [
+ '//aos/linux_code:init',
+ '//frc971/autonomous:auto_queue',
+ ':auto_lib',
+ ],
+)
diff --git a/y2014/control_loops/claw/BUILD b/y2014/control_loops/claw/BUILD
new file mode 100644
index 0000000..23370cd
--- /dev/null
+++ b/y2014/control_loops/claw/BUILD
@@ -0,0 +1,78 @@
+package(default_visibility = ['//visibility:public'])
+
+load('aos/build/queues', 'queue_library')
+
+cc_binary(
+ name = 'replay_claw',
+ srcs = [
+ 'replay_claw.cc',
+ ],
+ deps = [
+ ':claw_queue',
+ '//aos/common/controls:replay_control_loop',
+ '//aos/linux_code:init',
+ ],
+)
+
+queue_library(
+ name = 'claw_queue',
+ srcs = [
+ 'claw.q',
+ ],
+)
+
+cc_library(
+ name = 'claw_lib',
+ srcs = [
+ 'claw.cc',
+ 'claw_motor_plant.cc',
+ ],
+ deps = [
+ ':claw_queue',
+ '//aos/common/controls:control_loop',
+ '//y2014:constants',
+ '//frc971/control_loops:state_feedback_loop',
+ '//aos/common/controls:polytope',
+ '//frc971/control_loops:coerce_goal',
+ '//aos/common/logging:queue_logging',
+ '//aos/common/logging:matrix_logging',
+ ],
+)
+
+cc_binary(
+ name = 'claw_lib_test',
+ srcs = [
+ 'claw_lib_test.cc',
+ ],
+ deps = [
+ '//third_party/gtest',
+ ':claw_queue',
+ ':claw_lib',
+ '//frc971/control_loops:state_feedback_loop',
+ '//aos/common/controls:control_loop_test',
+ ],
+)
+
+cc_binary(
+ name = 'claw_calibration',
+ srcs = [
+ 'claw_calibration.cc',
+ ],
+ deps = [
+ '//aos/linux_code:init',
+ ':claw_queue',
+ '//aos/common/controls:control_loop',
+ '//y2014:constants',
+ ],
+)
+
+cc_binary(
+ name = 'claw',
+ srcs = [
+ 'claw_main.cc',
+ ],
+ deps = [
+ '//aos/linux_code:init',
+ ':claw_lib',
+ ],
+)
diff --git a/y2014/control_loops/drivetrain/BUILD b/y2014/control_loops/drivetrain/BUILD
new file mode 100644
index 0000000..d9015e3
--- /dev/null
+++ b/y2014/control_loops/drivetrain/BUILD
@@ -0,0 +1,81 @@
+package(default_visibility = ['//visibility:public'])
+
+load('aos/build/queues', 'queue_library')
+
+cc_binary(
+ name = 'replay_drivetrain',
+ srcs = [
+ 'replay_drivetrain.cc',
+ ],
+ deps = [
+ ':drivetrain_queue',
+ '//aos/common/controls:replay_control_loop',
+ '//aos/linux_code:init',
+ ],
+)
+
+queue_library(
+ name = 'drivetrain_queue',
+ srcs = [
+ 'drivetrain.q',
+ ],
+)
+
+cc_library(
+ name = 'polydrivetrain_plants',
+ srcs = [
+ 'polydrivetrain_dog_motor_plant.cc',
+ 'drivetrain_dog_motor_plant.cc',
+ ],
+ deps = [
+ '//frc971/control_loops:state_feedback_loop',
+ ],
+)
+
+cc_library(
+ name = 'drivetrain_lib',
+ srcs = [
+ 'drivetrain.cc',
+ 'polydrivetrain_cim_plant.cc',
+ ],
+ deps = [
+ ':drivetrain_queue',
+ '//aos/common/controls:control_loop',
+ '//y2014:constants',
+ '//aos/common/controls:polytope',
+ '//frc971/control_loops:state_feedback_loop',
+ '//frc971/control_loops:coerce_goal',
+ '//frc971/queues:gyro',
+ '//aos/common/util:log_interval',
+ '//aos/common/logging:queue_logging',
+ '//aos/common/logging:matrix_logging',
+ ],
+)
+
+cc_binary(
+ name = 'drivetrain_lib_test',
+ srcs = [
+ 'drivetrain_lib_test.cc',
+ ],
+ deps = [
+ '//third_party/gtest',
+ ':drivetrain_queue',
+ ':drivetrain_lib',
+ '//aos/common/controls:control_loop_test',
+ '//frc971/control_loops:state_feedback_loop',
+ '//frc971/queues:gyro',
+ '//aos/common:queues',
+ ],
+)
+
+cc_binary(
+ name = 'drivetrain',
+ srcs = [
+ 'drivetrain_main.cc',
+ ],
+ deps = [
+ '//aos/linux_code:init',
+ ':drivetrain_lib',
+ ':drivetrain_queue',
+ ],
+)
diff --git a/y2014/control_loops/shooter/BUILD b/y2014/control_loops/shooter/BUILD
new file mode 100644
index 0000000..c8605a3
--- /dev/null
+++ b/y2014/control_loops/shooter/BUILD
@@ -0,0 +1,63 @@
+package(default_visibility = ['//visibility:public'])
+
+load('aos/build/queues', 'queue_library')
+
+cc_binary(
+ name = 'replay_shooter',
+ srcs = [
+ 'replay_shooter.cc',
+ ],
+ deps = [
+ ':shooter_queue',
+ '//aos/common/controls:replay_control_loop',
+ '//aos/linux_code:init',
+ ],
+)
+
+queue_library(
+ name = 'shooter_queue',
+ srcs = [
+ 'shooter.q',
+ ],
+)
+
+cc_library(
+ name = 'shooter_lib',
+ srcs = [
+ 'shooter.cc',
+ 'shooter_motor_plant.cc',
+ 'unaugmented_shooter_motor_plant.cc',
+ ],
+ deps = [
+ ':shooter_queue',
+ '//aos/common/controls:control_loop',
+ '//y2014:constants',
+ '//frc971/control_loops:state_feedback_loop',
+ '//aos/common/logging:queue_logging',
+ ],
+)
+
+cc_binary(
+ name = 'shooter_lib_test',
+ srcs = [
+ 'shooter_lib_test.cc',
+ ],
+ deps = [
+ '//third_party/gtest',
+ ':shooter_queue',
+ ':shooter_lib',
+ '//aos/common/controls:control_loop_test',
+ '//frc971/control_loops:state_feedback_loop',
+ ],
+)
+
+cc_binary(
+ name = 'shooter',
+ srcs = [
+ 'shooter_main.cc',
+ ],
+ deps = [
+ '//aos/linux_code:init',
+ ':shooter_lib',
+ ],
+)
diff --git a/y2014/prime/BUILD b/y2014/prime/BUILD
new file mode 100644
index 0000000..7a787e9
--- /dev/null
+++ b/y2014/prime/BUILD
@@ -0,0 +1,36 @@
+package(default_visibility = ['//visibility:public'])
+
+filegroup(
+ name = 'All',
+ srcs = [
+ '//frc971:All',
+ '//y2014/control_loops/drivetrain:drivetrain',
+ '//y2014/control_loops/drivetrain:drivetrain_lib_test',
+ '//y2014/control_loops/drivetrain:replay_drivetrain',
+ '//y2014/control_loops/claw:claw',
+ '//y2014/control_loops/claw:claw_calibration',
+ '//y2014/control_loops/claw:claw_lib_test',
+ '//y2014/control_loops/claw:replay_claw',
+ '//y2014/control_loops/shooter:shooter',
+ '//y2014/control_loops/shooter:shooter_lib_test',
+ '//y2014/control_loops/shooter:replay_shooter',
+ '//y2014/autonomous:auto',
+ '//y2014:joystick_reader',
+ '//y2014/actors:binaries',
+ ':hot_goal_reader',
+ ],
+)
+
+cc_binary(
+ name = 'hot_goal_reader',
+ srcs = [
+ 'hot_goal_reader.cc',
+ ],
+ deps = [
+ '//aos/common:time',
+ '//aos/common/logging',
+ '//aos/common/logging:queue_logging',
+ '//aos/linux_code:init',
+ '//y2014/queues:hot_goal',
+ ],
+)
diff --git a/y2014/queues/BUILD b/y2014/queues/BUILD
new file mode 100644
index 0000000..0c04ab7
--- /dev/null
+++ b/y2014/queues/BUILD
@@ -0,0 +1,24 @@
+package(default_visibility = ['//visibility:public'])
+
+load('aos/build/queues', 'queue_library')
+
+queue_library(
+ name = 'profile_params',
+ srcs = [
+ 'profile_params.q',
+ ],
+)
+
+queue_library(
+ name = 'hot_goal',
+ srcs = [
+ 'hot_goal.q',
+ ],
+)
+
+queue_library(
+ name = 'auto_mode',
+ srcs = [
+ 'auto_mode.q',
+ ],
+)
diff --git a/y2014/wpilib/BUILD b/y2014/wpilib/BUILD
new file mode 100644
index 0000000..ac2c1cf
--- /dev/null
+++ b/y2014/wpilib/BUILD
@@ -0,0 +1,36 @@
+package(default_visibility = ['//visibility:public'])
+
+cc_binary(
+ name = 'wpilib_interface',
+ srcs = [
+ 'wpilib_interface.cc',
+ ],
+ deps = [
+ '//aos/linux_code:init',
+ '//aos/common:stl_mutex',
+ '//aos/common/logging',
+ '//third_party/WPILib',
+ '//y2014:constants',
+ '//y2014/queues:auto_mode',
+ '//y2014/control_loops/drivetrain:drivetrain_queue',
+ '//y2014/control_loops/shooter:shooter_queue',
+ '//y2014/control_loops/claw:claw_queue',
+ '//aos/common/controls:control_loop',
+ '//aos/common/util:log_interval',
+ '//aos/common:time',
+ '//aos/common/logging:queue_logging',
+ '//aos/common/messages:robot_state',
+ '//aos/common/util:phased_loop',
+ '//aos/common/messages:robot_state',
+ '//frc971/wpilib:hall_effect',
+ '//frc971/wpilib:joystick_sender',
+ '//frc971/wpilib:loop_output_handler',
+ '//frc971/wpilib:buffered_pcm',
+ '//frc971/wpilib:gyro_sender',
+ '//frc971/wpilib:dma_edge_counting',
+ '//frc971/wpilib:interrupt_edge_counting',
+ '//frc971/wpilib:encoder_and_potentiometer',
+ '//frc971/control_loops:queues',
+ '//frc971/wpilib:logging_queue',
+ ],
+)