blob: af18e388b583488ddedd40180931936fe65d8f9d [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",
Philipp Schraderf1bbf342022-02-05 14:30:15 -08009 "arm64",
Austin Schuhde821712019-08-03 18:16:49 -070010 "cortex-m",
Austin Schuh0a96ea32022-01-01 22:29:30 -080011 "cortex-m0plus",
Brian Silverman7a7c24d2018-09-01 17:49:09 -070012]
Brian Silvermana7ba3aa2015-10-12 00:33:03 -040013
Brian Silverman7a7c24d2018-09-01 17:49:09 -070014"""All of the CPUs we know about."""
15
16"""A select wrapper for CPU architectures.
Brian Silvermana7ba3aa2015-10-12 00:33:03 -040017
18Args:
19 values: A mapping from architecture names (as strings) to other things.
Austin Schuh1e69d422023-06-25 16:57:01 -070020 Currently amd64, roborio, and cortex are recognized.
Brian Silvermana7ba3aa2015-10-12 00:33:03 -040021 'else' is also allowed as a default.
Austin Schuh1e69d422023-06-25 16:57:01 -070022 'arm' is allowed instead of roborio, and cortex.
Brian Silvermana7ba3aa2015-10-12 00:33:03 -040023Returns a select which evaluates to the correct element of values.
Brian Silverman7a7c24d2018-09-01 17:49:09 -070024"""
25
Brian Silvermana7ba3aa2015-10-12 00:33:03 -040026def cpu_select(values):
Austin Schuh8e17be92019-12-24 09:32:11 -080027 if "arm" in values:
28 new_values = {}
29 for cpu in values:
30 if cpu != "arm":
31 new_values[cpu] = values[cpu]
Philipp Schraderf1bbf342022-02-05 14:30:15 -080032 new_values["arm64"] = values["arm"]
Austin Schuh8e17be92019-12-24 09:32:11 -080033 new_values["roborio"] = values["arm"]
34 new_values["cortex-m"] = values["arm"]
Austin Schuh0a96ea32022-01-01 22:29:30 -080035 new_values["cortex-m0plus"] = values["arm"]
Austin Schuh8e17be92019-12-24 09:32:11 -080036 values = new_values
Philipp Schraderf1bbf342022-02-05 14:30:15 -080037 elif "arm32" in values:
38 if "arm64" not in values:
39 fail("Need to handle 'arm64' CPU if handling 'arm32' CPU.")
40 new_values = {}
41 for cpu in values:
42 if cpu != "arm32":
43 new_values[cpu] = values[cpu]
Philipp Schraderf1bbf342022-02-05 14:30:15 -080044 new_values["roborio"] = values["arm32"]
45 new_values["cortex-m"] = values["arm32"]
46 new_values["cortex-m0plus"] = values["arm32"]
47 values = new_values
Austin Schuh8e17be92019-12-24 09:32:11 -080048 for cpu in all_cpus:
49 if cpu not in values:
50 if "else" in values:
51 values[cpu] = values["else"]
52 else:
53 fail("Need to handle %s CPUs!" % cpu, "values")
54 for key in values:
55 if key not in all_cpus and key != "else":
56 fail("Not sure what a %s CPU is!" % key, "values")
57 return select({
58 "@//tools:cpu_k8": values["amd64"],
59 "@//tools:cpu_roborio": values["roborio"],
Philipp Schraderf1bbf342022-02-05 14:30:15 -080060 "@//tools:cpu_arm64": values["arm64"],
Austin Schuh8e17be92019-12-24 09:32:11 -080061 "@//tools:cpu_cortex_m4f": values["cortex-m"],
Austin Schuh0a96ea32022-01-01 22:29:30 -080062 "@//tools:cpu_cortex_m0plus": values["cortex-m0plus"],
Philipp Schraderdada1072020-11-24 11:34:46 -080063 # TODO(phil): Support this properly.
64 #"@//tools:cpu_cortex_m4f_k22": values["cortex-m"],
Austin Schuh8e17be92019-12-24 09:32:11 -080065 })
Brian Silvermana7ba3aa2015-10-12 00:33:03 -040066
Brian Silverman7a7c24d2018-09-01 17:49:09 -070067"""A select wrapper for address space sizes.
Brian Silvermana7ba3aa2015-10-12 00:33:03 -040068
69Args:
70 values: A mapping from address space sizes (as strings) to other things.
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 address_size_select(values):
Austin Schuh8e17be92019-12-24 09:32:11 -080075 if "32" not in values:
76 fail("Need to handle 32 bit addresses!", "values")
77 if "64" not in values:
78 fail("Need to handle 64 bit addresses!", "values")
79 return select({
80 "@//tools:cpu_k8": values["64"],
Philipp Schraderf1bbf342022-02-05 14:30:15 -080081 "@//tools:cpu_arm64": values["64"],
Austin Schuh8e17be92019-12-24 09:32:11 -080082 "@//tools:cpu_roborio": values["32"],
Austin Schuh8e17be92019-12-24 09:32:11 -080083 "@//tools:cpu_cortex_m4f": values["32"],
Austin Schuh0a96ea32022-01-01 22:29:30 -080084 "@//tools:cpu_cortex_m0plus": values["32"],
Philipp Schraderdada1072020-11-24 11:34:46 -080085 # TODO(phil): Support this properly.
86 #"@//tools:cpu_cortex_m4f_k22": values["32"],
Austin Schuh8e17be92019-12-24 09:32:11 -080087 })
Brian Silvermana7ba3aa2015-10-12 00:33:03 -040088
Brian Silverman7a7c24d2018-09-01 17:49:09 -070089"""A select wrapper for compilers.
Brian Silvermana7ba3aa2015-10-12 00:33:03 -040090
91Args:
92 values: A mapping from compiler names (as strings) to other things.
93 Currently 'gcc' and 'clang' are recognized.
94Returns a select which evaluates to the correct element of values.
Brian Silverman7a7c24d2018-09-01 17:49:09 -070095"""
96
Brian Silvermana7ba3aa2015-10-12 00:33:03 -040097def compiler_select(values):
Austin Schuh8e17be92019-12-24 09:32:11 -080098 if "gcc" not in values:
99 fail("Need to handle gcc!", "values")
100 if "clang" not in values:
101 fail("Need to handle clang!", "values")
102 return select({
103 "@//tools:compiler_gcc": values["gcc"],
104 "@//tools:compiler_clang": values["clang"],
Austin Schuh8e17be92019-12-24 09:32:11 -0800105 })