• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# cpuinfo, a library to detect information about the host CPU
2package(default_visibility = ["//visibility:public"])
3
4licenses(["notice"])
5
6exports_files(["LICENSE"])
7
8C99OPTS = [
9    "-std=gnu99",  # gnu99, not c99, because dprintf is used
10    "-Wno-vla",
11    "-D_GNU_SOURCE=1",  # to use CPU_SETSIZE
12    "-DCPUINFO_INTERNAL=",
13    "-DCPUINFO_PRIVATE=",
14]
15
16# Source code common to all platforms.
17COMMON_SRCS = [
18    "src/api.c",
19    "src/init.c",
20    "src/cache.c",
21]
22
23# Architecture-specific sources and headers.
24X86_SRCS = [
25    "src/x86/cache/descriptor.c",
26    "src/x86/cache/deterministic.c",
27    "src/x86/cache/init.c",
28    "src/x86/info.c",
29    "src/x86/init.c",
30    "src/x86/isa.c",
31    "src/x86/name.c",
32    "src/x86/topology.c",
33    "src/x86/uarch.c",
34    "src/x86/vendor.c",
35]
36
37ARM_SRCS = [
38    "src/arm/cache.c",
39    "src/arm/uarch.c",
40]
41
42# Platform-specific sources and headers
43LINUX_SRCS = [
44    "src/linux/cpulist.c",
45    "src/linux/multiline.c",
46    "src/linux/processors.c",
47    "src/linux/smallfile.c",
48]
49
50MOCK_LINUX_SRCS = [
51    "src/linux/mockfile.c",
52]
53
54MACH_SRCS = [
55    "src/mach/topology.c",
56]
57
58EMSCRIPTEN_SRCS = [
59    "src/emscripten/init.c",
60]
61
62LINUX_X86_SRCS = [
63    "src/x86/linux/cpuinfo.c",
64    "src/x86/linux/init.c",
65]
66
67LINUX_ARM_SRCS = [
68    "src/arm/linux/chipset.c",
69    "src/arm/linux/clusters.c",
70    "src/arm/linux/cpuinfo.c",
71    "src/arm/linux/hwcap.c",
72    "src/arm/linux/init.c",
73    "src/arm/linux/midr.c",
74]
75
76LINUX_ARM32_SRCS = LINUX_ARM_SRCS + ["src/arm/linux/aarch32-isa.c"]
77
78LINUX_ARM64_SRCS = LINUX_ARM_SRCS + ["src/arm/linux/aarch64-isa.c"]
79
80ANDROID_ARM_SRCS = [
81    "src/arm/android/properties.c",
82]
83
84WINDOWS_X86_SRCS = [
85    "src/x86/windows/init.c",
86]
87
88MACH_X86_SRCS = [
89    "src/x86/mach/init.c",
90]
91
92MACH_ARM_SRCS = [
93    "src/arm/mach/init.c",
94]
95
96EMSCRIPTEN_SRCS = [
97    "src/emscripten/init.c",
98]
99
100cc_library(
101    name = "cpuinfo_impl",
102    srcs = select({
103        ":linux_x86_64": COMMON_SRCS + X86_SRCS + LINUX_SRCS + LINUX_X86_SRCS,
104        ":linux_arm": COMMON_SRCS + ARM_SRCS + LINUX_SRCS + LINUX_ARM32_SRCS,
105        ":linux_armhf": COMMON_SRCS + ARM_SRCS + LINUX_SRCS + LINUX_ARM32_SRCS,
106        ":linux_armv7a": COMMON_SRCS + ARM_SRCS + LINUX_SRCS + LINUX_ARM32_SRCS,
107        ":linux_armeabi": COMMON_SRCS + ARM_SRCS + LINUX_SRCS + LINUX_ARM32_SRCS,
108        ":linux_aarch64": COMMON_SRCS + ARM_SRCS + LINUX_SRCS + LINUX_ARM64_SRCS,
109        ":linux_mips64": COMMON_SRCS + LINUX_SRCS,
110        ":linux_riscv64": COMMON_SRCS + LINUX_SRCS,
111        ":linux_s390x": COMMON_SRCS + LINUX_SRCS,
112        ":macos_x86_64": COMMON_SRCS + X86_SRCS + MACH_SRCS + MACH_X86_SRCS,
113        ":macos_arm64": COMMON_SRCS + MACH_SRCS + MACH_ARM_SRCS,
114        ":windows_x86_64": COMMON_SRCS + X86_SRCS + WINDOWS_X86_SRCS,
115        ":android_armv7": COMMON_SRCS + ARM_SRCS + LINUX_SRCS + LINUX_ARM32_SRCS + ANDROID_ARM_SRCS,
116        ":android_arm64": COMMON_SRCS + ARM_SRCS + LINUX_SRCS + LINUX_ARM64_SRCS + ANDROID_ARM_SRCS,
117        ":android_x86": COMMON_SRCS + X86_SRCS + LINUX_SRCS + LINUX_X86_SRCS,
118        ":android_x86_64": COMMON_SRCS + X86_SRCS + LINUX_SRCS + LINUX_X86_SRCS,
119        ":ios_x86_64": COMMON_SRCS + X86_SRCS + MACH_SRCS + MACH_X86_SRCS,
120        ":ios_x86": COMMON_SRCS + X86_SRCS + MACH_SRCS + MACH_X86_SRCS,
121        ":ios_armv7": COMMON_SRCS + MACH_SRCS + MACH_ARM_SRCS,
122        ":ios_arm64": COMMON_SRCS + MACH_SRCS + MACH_ARM_SRCS,
123        ":ios_arm64e": COMMON_SRCS + MACH_SRCS + MACH_ARM_SRCS,
124        ":watchos_x86_64": COMMON_SRCS + X86_SRCS + MACH_SRCS + MACH_X86_SRCS,
125        ":watchos_x86": COMMON_SRCS + X86_SRCS + MACH_SRCS + MACH_X86_SRCS,
126        ":watchos_armv7k": COMMON_SRCS + MACH_SRCS + MACH_ARM_SRCS,
127        ":watchos_arm64_32": COMMON_SRCS + MACH_SRCS + MACH_ARM_SRCS,
128        ":tvos_x86_64": COMMON_SRCS + X86_SRCS + MACH_SRCS + MACH_X86_SRCS,
129        ":tvos_arm64": COMMON_SRCS + MACH_SRCS + MACH_ARM_SRCS,
130        ":emscripten_wasm": COMMON_SRCS + EMSCRIPTEN_SRCS,
131    }),
132    copts = select({
133        ":windows_x86_64": [],
134        "//conditions:default": C99OPTS,
135    }) + [
136        "-Iexternal/cpuinfo/include",
137        "-Iexternal/cpuinfo/src",
138    ],
139    linkstatic = select({
140        # https://github.com/bazelbuild/bazel/issues/11552
141        ":macos_x86_64": False,
142        "//conditions:default": True,
143    }),
144    # Headers must be in textual_hdrs to allow us to set the standard to C99
145    textual_hdrs = [
146        "include/cpuinfo.h",
147        "src/linux/api.h",
148        "src/mach/api.h",
149        "src/cpuinfo/common.h",
150        "src/cpuinfo/internal-api.h",
151        "src/cpuinfo/log.h",
152        "src/cpuinfo/utils.h",
153        "src/x86/api.h",
154        "src/x86/cpuid.h",
155        "src/x86/linux/api.h",
156        "src/arm/android/api.h",
157        "src/arm/linux/api.h",
158        "src/arm/linux/cp.h",
159        "src/arm/api.h",
160        "src/arm/midr.h",
161    ],
162    deps = [
163        "@clog",
164    ],
165)
166
167cc_library(
168    name = "cpuinfo",
169    hdrs = [
170        "include/cpuinfo.h",
171    ],
172    strip_include_prefix = "include",
173    deps = [
174        ":cpuinfo_impl",
175    ],
176)
177
178cc_library(
179    name = "cpuinfo_with_unstripped_include_path",
180    hdrs = [
181        "include/cpuinfo.h",
182    ],
183    deps = [
184        ":cpuinfo_impl",
185    ],
186)
187
188############################# Build configurations #############################
189
190config_setting(
191    name = "linux_x86_64",
192    values = {"cpu": "k8"},
193)
194
195config_setting(
196    name = "linux_arm",
197    values = {"cpu": "arm"},
198)
199
200config_setting(
201    name = "linux_armhf",
202    values = {"cpu": "armhf"},
203)
204
205config_setting(
206    name = "linux_armv7a",
207    values = {"cpu": "armv7a"},
208)
209
210config_setting(
211    name = "linux_armeabi",
212    values = {"cpu": "armeabi"},
213)
214
215config_setting(
216    name = "linux_aarch64",
217    values = {"cpu": "aarch64"},
218)
219
220config_setting(
221    name = "linux_mips64",
222    values = {"cpu": "mips64"},
223)
224
225config_setting(
226    name = "linux_riscv64",
227    values = {"cpu": "riscv64"},
228)
229
230config_setting(
231    name = "linux_s390x",
232    values = {"cpu": "s390x"},
233)
234
235config_setting(
236    name = "macos_x86_64",
237    values = {
238        "apple_platform_type": "macos",
239        "cpu": "darwin",
240    },
241)
242
243config_setting(
244    name = "windows_x86_64",
245    values = {"cpu": "x64_windows"},
246)
247
248config_setting(
249    name = "android_armv7",
250    values = {
251        "crosstool_top": "//external:android/crosstool",
252        "cpu": "armeabi-v7a",
253    },
254    visibility = ["//visibility:public"],
255)
256
257config_setting(
258    name = "android_arm64",
259    values = {
260        "crosstool_top": "//external:android/crosstool",
261        "cpu": "arm64-v8a",
262    },
263    visibility = ["//visibility:public"],
264)
265
266config_setting(
267    name = "android_x86",
268    values = {
269        "crosstool_top": "//external:android/crosstool",
270        "cpu": "x86",
271    },
272    visibility = ["//visibility:public"],
273)
274
275config_setting(
276    name = "android_x86_64",
277    values = {
278        "crosstool_top": "//external:android/crosstool",
279        "cpu": "x86_64",
280    },
281    visibility = ["//visibility:public"],
282)
283
284config_setting(
285    name = "ios_armv7",
286    values = {
287        "apple_platform_type": "ios",
288        "cpu": "ios_armv7",
289    },
290)
291
292config_setting(
293    name = "ios_arm64",
294    values = {
295        "apple_platform_type": "ios",
296        "cpu": "ios_arm64",
297    },
298)
299
300config_setting(
301    name = "ios_arm64e",
302    values = {
303        "apple_platform_type": "ios",
304        "cpu": "ios_arm64e",
305    },
306)
307
308config_setting(
309    name = "macos_arm64",
310    values = {
311        "apple_platform_type": "macos",
312        "cpu": "darwin_arm64",
313    },
314)
315
316config_setting(
317    name = "ios_x86",
318    values = {
319        "apple_platform_type": "ios",
320        "cpu": "ios_i386",
321    },
322)
323
324config_setting(
325    name = "ios_x86_64",
326    values = {
327        "apple_platform_type": "ios",
328        "cpu": "ios_x86_64",
329    },
330)
331
332config_setting(
333    name = "watchos_armv7k",
334    values = {
335        "apple_platform_type": "watchos",
336        "cpu": "watchos_armv7k",
337    },
338)
339
340config_setting(
341    name = "watchos_arm64_32",
342    values = {
343        "apple_platform_type": "watchos",
344        "cpu": "watchos_arm64_32",
345    },
346)
347
348config_setting(
349    name = "watchos_x86",
350    values = {
351        "apple_platform_type": "watchos",
352        "cpu": "watchos_i386",
353    },
354)
355
356config_setting(
357    name = "watchos_x86_64",
358    values = {
359        "apple_platform_type": "watchos",
360        "cpu": "watchos_x86_64",
361    },
362)
363
364config_setting(
365    name = "tvos_arm64",
366    values = {
367        "apple_platform_type": "tvos",
368        "cpu": "tvos_arm64",
369    },
370)
371
372config_setting(
373    name = "tvos_x86_64",
374    values = {
375        "apple_platform_type": "tvos",
376        "cpu": "tvos_x86_64",
377    },
378)
379
380config_setting(
381    name = "emscripten_wasm",
382    values = {
383        "cpu": "wasm",
384    },
385)
386
387config_setting(
388    name = "emscripten_wasmsimd",
389    values = {
390        "cpu": "wasm",
391        "features": "wasm_simd",
392    },
393)
394
395config_setting(
396    name = "emscripten_asmjs",
397    values = {
398        "cpu": "asmjs",
399    },
400)
401