blob: 8754f260e4b6ae4517558d0eab2a25e7a4f4a150 [file] [log] [blame]
Brian Silvermana7ba3aa2015-10-12 00:33:03 -04001# This file contains replacements for select where the keys have more abstract
2# meanings so we can map multiple conditions to the same value easily and
3# quickly find issues where something new isn't handled.
4# It will also make adding ORs when it makes sense easy to do nicely.
5
Brian Silverman7a7c24d2018-09-01 17:49:09 -07006all_cpus = [
7 "amd64",
8 "roborio",
9 "armhf",
10]
Brian Silvermana7ba3aa2015-10-12 00:33:03 -040011
Brian Silverman7a7c24d2018-09-01 17:49:09 -070012"""All of the CPUs we know about."""
13
14"""A select wrapper for CPU architectures.
Brian Silvermana7ba3aa2015-10-12 00:33:03 -040015
16Args:
17 values: A mapping from architecture names (as strings) to other things.
Brian Silverman0d57fc82016-01-24 21:02:53 -050018 Currently amd64, roborio, and armhf are recognized.
Brian Silvermana7ba3aa2015-10-12 00:33:03 -040019 'else' is also allowed as a default.
Brian Silverman0d57fc82016-01-24 21:02:53 -050020 'arm' is allowed instead of roborio and armhf.
Brian Silvermana7ba3aa2015-10-12 00:33:03 -040021Returns a select which evaluates to the correct element of values.
Brian Silverman7a7c24d2018-09-01 17:49:09 -070022"""
23
Brian Silvermana7ba3aa2015-10-12 00:33:03 -040024def cpu_select(values):
Brian Silverman0d57fc82016-01-24 21:02:53 -050025 if 'arm' in values:
26 new_values = {}
27 for cpu in values:
28 if cpu != 'arm':
29 new_values[cpu] = values[cpu]
30 new_values['armhf'] = values['arm']
31 new_values['roborio'] = values['arm']
32 values = new_values
Brian Silvermana7ba3aa2015-10-12 00:33:03 -040033 for cpu in all_cpus:
34 if cpu not in values:
35 if 'else' in values:
36 values[cpu] = values['else']
37 else:
38 fail('Need to handle %s CPUs!' % cpu, 'values')
39 for key in values:
40 if key not in all_cpus and key != 'else':
41 fail('Not sure what a %s CPU is!' % key, 'values')
42 return select({
Austin Schuhf6b94632019-02-02 22:11:27 -080043 '@//tools:cpu_k8': values['amd64'],
44 '@//tools:cpu_roborio': values['roborio'],
45 '@//tools:cpu_armhf': values['armhf'],
Brian Silvermana7ba3aa2015-10-12 00:33:03 -040046 })
47
Brian Silverman7a7c24d2018-09-01 17:49:09 -070048"""A select wrapper for address space sizes.
Brian Silvermana7ba3aa2015-10-12 00:33:03 -040049
50Args:
51 values: A mapping from address space sizes (as strings) to other things.
52Returns a select which evaluates to the correct element of values.
Brian Silverman7a7c24d2018-09-01 17:49:09 -070053"""
54
Brian Silvermana7ba3aa2015-10-12 00:33:03 -040055def address_size_select(values):
56 if '32' not in values:
57 fail('Need to handle 32 bit addresses!', 'values')
58 if '64' not in values:
59 fail('Need to handle 64 bit addresses!', 'values')
60 return select({
Austin Schuhf6b94632019-02-02 22:11:27 -080061 '@//tools:cpu_k8': values['64'],
62 '@//tools:cpu_roborio': values['32'],
63 '@//tools:cpu_armhf': values['32'],
Brian Silvermana7ba3aa2015-10-12 00:33:03 -040064 })
65
Brian Silverman7a7c24d2018-09-01 17:49:09 -070066"""A select wrapper for compilers.
Brian Silvermana7ba3aa2015-10-12 00:33:03 -040067
68Args:
69 values: A mapping from compiler names (as strings) to other things.
70 Currently 'gcc' and 'clang' are recognized.
71Returns a select which evaluates to the correct element of values.
Brian Silverman7a7c24d2018-09-01 17:49:09 -070072"""
73
Brian Silvermana7ba3aa2015-10-12 00:33:03 -040074def compiler_select(values):
75 if 'gcc' not in values:
76 fail('Need to handle gcc!', 'values')
77 if 'clang' not in values:
78 fail('Need to handle clang!', 'values')
79 return select({
Brian Silvermand3ad1652018-02-18 22:16:29 -050080 '@//tools:compiler_gcc': values['gcc'],
81 '@//tools:compiler_clang': values['clang'],
Brian Silvermana7ba3aa2015-10-12 00:33:03 -040082 })