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 96cc_library( 97 name = "cpuinfo_impl", 98 srcs = select({ 99 ":linux_x86_64": COMMON_SRCS + X86_SRCS + LINUX_SRCS + LINUX_X86_SRCS, 100 ":linux_arm": COMMON_SRCS + ARM_SRCS + LINUX_SRCS + LINUX_ARM32_SRCS, 101 ":linux_armeabi": COMMON_SRCS + ARM_SRCS + LINUX_SRCS + LINUX_ARM32_SRCS, 102 ":linux_armhf": COMMON_SRCS + ARM_SRCS + LINUX_SRCS + LINUX_ARM32_SRCS, 103 ":linux_armv7a": COMMON_SRCS + ARM_SRCS + LINUX_SRCS + LINUX_ARM32_SRCS, 104 ":linux_aarch64": COMMON_SRCS + ARM_SRCS + LINUX_SRCS + LINUX_ARM64_SRCS, 105 ":macos_x86_64": COMMON_SRCS + X86_SRCS + MACH_SRCS + MACH_X86_SRCS, 106 ":macos_arm64": COMMON_SRCS + MACH_SRCS + MACH_ARM_SRCS, 107 ":windows_x86_64": COMMON_SRCS + X86_SRCS + WINDOWS_X86_SRCS, 108 ":android_armv7": COMMON_SRCS + ARM_SRCS + LINUX_SRCS + LINUX_ARM32_SRCS + ANDROID_ARM_SRCS, 109 ":android_arm64": COMMON_SRCS + ARM_SRCS + LINUX_SRCS + LINUX_ARM64_SRCS + ANDROID_ARM_SRCS, 110 ":android_x86": COMMON_SRCS + X86_SRCS + LINUX_SRCS + LINUX_X86_SRCS, 111 ":android_x86_64": COMMON_SRCS + X86_SRCS + LINUX_SRCS + LINUX_X86_SRCS, 112 ":ios_x86_64": COMMON_SRCS + X86_SRCS + MACH_SRCS + MACH_X86_SRCS, 113 ":ios_x86": COMMON_SRCS + X86_SRCS + MACH_SRCS + MACH_X86_SRCS, 114 ":ios_armv7": COMMON_SRCS + MACH_SRCS + MACH_ARM_SRCS, 115 ":ios_arm64": COMMON_SRCS + MACH_SRCS + MACH_ARM_SRCS, 116 ":ios_arm64e": COMMON_SRCS + MACH_SRCS + MACH_ARM_SRCS, 117 ":ios_sim_arm64": COMMON_SRCS + MACH_SRCS + MACH_ARM_SRCS, 118 ":watchos_x86_64": COMMON_SRCS + X86_SRCS + MACH_SRCS + MACH_X86_SRCS, 119 ":watchos_x86": COMMON_SRCS + X86_SRCS + MACH_SRCS + MACH_X86_SRCS, 120 ":watchos_armv7k": COMMON_SRCS + MACH_SRCS + MACH_ARM_SRCS, 121 ":watchos_arm64_32": COMMON_SRCS + MACH_SRCS + MACH_ARM_SRCS, 122 ":tvos_x86_64": COMMON_SRCS + X86_SRCS + MACH_SRCS + MACH_X86_SRCS, 123 ":tvos_arm64": COMMON_SRCS + MACH_SRCS + MACH_ARM_SRCS, 124 ":emscripten": COMMON_SRCS + EMSCRIPTEN_SRCS, 125 }), 126 copts = select({ 127 ":windows_x86_64": [], 128 "//conditions:default": C99OPTS, 129 }) + [ 130 "-Iexternal/cpuinfo/include", 131 "-Iexternal/cpuinfo/src", 132 ], 133 linkstatic = True, 134 # Headers must be in textual_hdrs to allow us to set the standard to C99 135 textual_hdrs = [ 136 "include/cpuinfo.h", 137 "src/linux/api.h", 138 "src/mach/api.h", 139 "src/cpuinfo/common.h", 140 "src/cpuinfo/internal-api.h", 141 "src/cpuinfo/log.h", 142 "src/cpuinfo/utils.h", 143 "src/x86/api.h", 144 "src/x86/cpuid.h", 145 "src/x86/linux/api.h", 146 "src/arm/android/api.h", 147 "src/arm/linux/api.h", 148 "src/arm/linux/cp.h", 149 "src/arm/api.h", 150 "src/arm/midr.h", 151 ], 152 deps = [ 153 "@clog", 154 ], 155) 156 157cc_library( 158 name = "cpuinfo", 159 hdrs = [ 160 "include/cpuinfo.h", 161 ], 162 strip_include_prefix = "include", 163 deps = [ 164 ":cpuinfo_impl", 165 ], 166) 167 168############################# Build configurations ############################# 169 170config_setting( 171 name = "linux_x86_64", 172 values = {"cpu": "k8"}, 173) 174 175config_setting( 176 name = "linux_arm", 177 values = {"cpu": "arm"}, 178) 179 180config_setting( 181 name = "linux_armeabi", 182 values = {"cpu": "armeabi"}, 183) 184 185config_setting( 186 name = "linux_armhf", 187 values = {"cpu": "armhf"}, 188) 189 190config_setting( 191 name = "linux_armv7a", 192 values = {"cpu": "armv7a"}, 193) 194 195config_setting( 196 name = "linux_aarch64", 197 values = {"cpu": "aarch64"}, 198) 199 200config_setting( 201 name = "macos_x86_64", 202 values = { 203 "apple_platform_type": "macos", 204 "cpu": "darwin", 205 }, 206) 207 208config_setting( 209 name = "macos_arm64", 210 values = { 211 "apple_platform_type": "macos", 212 "cpu": "darwin_arm64", 213 }, 214) 215 216config_setting( 217 name = "windows_x86_64", 218 values = {"cpu": "x64_windows"}, 219) 220 221config_setting( 222 name = "android_armv7", 223 values = { 224 "crosstool_top": "//external:android/crosstool", 225 "cpu": "armeabi-v7a", 226 }, 227 visibility = ["//visibility:public"], 228) 229 230config_setting( 231 name = "android_arm64", 232 values = { 233 "crosstool_top": "//external:android/crosstool", 234 "cpu": "arm64-v8a", 235 }, 236 visibility = ["//visibility:public"], 237) 238 239config_setting( 240 name = "android_x86", 241 values = { 242 "crosstool_top": "//external:android/crosstool", 243 "cpu": "x86", 244 }, 245 visibility = ["//visibility:public"], 246) 247 248config_setting( 249 name = "android_x86_64", 250 values = { 251 "crosstool_top": "//external:android/crosstool", 252 "cpu": "x86_64", 253 }, 254 visibility = ["//visibility:public"], 255) 256 257config_setting( 258 name = "ios_armv7", 259 values = { 260 "apple_platform_type": "ios", 261 "cpu": "ios_armv7", 262 }, 263) 264 265config_setting( 266 name = "ios_arm64", 267 values = { 268 "apple_platform_type": "ios", 269 "cpu": "ios_arm64", 270 }, 271) 272 273config_setting( 274 name = "ios_arm64e", 275 values = { 276 "apple_platform_type": "ios", 277 "cpu": "ios_arm64e", 278 }, 279) 280 281config_setting( 282 name = "ios_sim_arm64", 283 values = { 284 "apple_platform_type": "ios", 285 "cpu": "ios_sim_arm64", 286 }, 287) 288 289config_setting( 290 name = "ios_x86", 291 values = { 292 "apple_platform_type": "ios", 293 "cpu": "ios_i386", 294 }, 295) 296 297config_setting( 298 name = "ios_x86_64", 299 values = { 300 "apple_platform_type": "ios", 301 "cpu": "ios_x86_64", 302 }, 303) 304 305config_setting( 306 name = "watchos_armv7k", 307 values = { 308 "apple_platform_type": "watchos", 309 "cpu": "watchos_armv7k", 310 }, 311) 312 313config_setting( 314 name = "watchos_arm64_32", 315 values = { 316 "apple_platform_type": "watchos", 317 "cpu": "watchos_arm64_32", 318 }, 319) 320 321config_setting( 322 name = "watchos_x86", 323 values = { 324 "apple_platform_type": "watchos", 325 "cpu": "watchos_i386", 326 }, 327) 328 329config_setting( 330 name = "watchos_x86_64", 331 values = { 332 "apple_platform_type": "watchos", 333 "cpu": "watchos_x86_64", 334 }, 335) 336 337config_setting( 338 name = "tvos_arm64", 339 values = { 340 "apple_platform_type": "tvos", 341 "cpu": "tvos_arm64", 342 }, 343) 344 345config_setting( 346 name = "tvos_x86_64", 347 values = { 348 "apple_platform_type": "tvos", 349 "cpu": "tvos_x86_64", 350 }, 351) 352 353config_setting( 354 name = "emscripten", 355 values = {"crosstool_top": "//toolchain:emscripten"}, 356) 357