1#!/usr/bin/env python 2 3 4import confu 5parser = confu.standard_parser("cpuinfo configuration script") 6parser.add_argument("--log", dest="log_level", 7 choices=("none", "fatal", "error", "warning", "info", "debug"), default="error") 8parser.add_argument("--mock", dest="mock", action="store_true") 9 10 11def main(args): 12 options = parser.parse_args(args) 13 build = confu.Build.from_options(options) 14 15 macros = { 16 "CPUINFO_LOG_LEVEL": {"none": 0, "fatal": 1, "error": 2, "warning": 3, "info": 4, "debug": 5}[options.log_level], 17 "CLOG_LOG_TO_STDIO": int(not options.mock), 18 "CPUINFO_MOCK": int(options.mock), 19 } 20 if build.target.is_linux or build.target.is_android: 21 macros["_GNU_SOURCE"] = 1 22 23 build.export_cpath("include", ["cpuinfo.h"]) 24 25 with build.options(source_dir="src", macros=macros, extra_include_dirs="src", deps=build.deps.clog): 26 sources = ["api.c", "init.c", "cache.c"] 27 if build.target.is_x86 or build.target.is_x86_64: 28 sources += [ 29 "x86/init.c", "x86/info.c", "x86/isa.c", "x86/vendor.c", 30 "x86/uarch.c", "x86/name.c", "x86/topology.c", 31 "x86/cache/init.c", "x86/cache/descriptor.c", "x86/cache/deterministic.c", 32 ] 33 if build.target.is_macos: 34 sources += ["x86/mach/init.c"] 35 elif build.target.is_linux or build.target.is_android: 36 sources += [ 37 "x86/linux/init.c", 38 "x86/linux/cpuinfo.c", 39 ] 40 if build.target.is_arm or build.target.is_arm64: 41 sources += ["arm/uarch.c", "arm/cache.c"] 42 if build.target.is_linux or build.target.is_android: 43 sources += [ 44 "arm/linux/init.c", 45 "arm/linux/cpuinfo.c", 46 "arm/linux/clusters.c", 47 "arm/linux/midr.c", 48 "arm/linux/chipset.c", 49 "arm/linux/hwcap.c", 50 ] 51 if build.target.is_arm: 52 sources.append("arm/linux/aarch32-isa.c") 53 elif build.target.is_arm64: 54 sources.append("arm/linux/aarch64-isa.c") 55 if build.target.is_android: 56 sources += [ 57 "arm/android/properties.c", 58 ] 59 if build.target.is_riscv: 60 if build.target.is_linux: 61 sources += [ 62 "riscv/linux/init.c", 63 "riscv/linux/riscv-isa.c", 64 ] 65 66 if build.target.is_macos: 67 sources += ["mach/topology.c"] 68 if build.target.is_linux or build.target.is_android: 69 sources += [ 70 "linux/cpulist.c", 71 "linux/smallfile.c", 72 "linux/multiline.c", 73 "linux/processors.c", 74 ] 75 if options.mock: 76 sources += ["linux/mockfile.c"] 77 build.static_library("cpuinfo", map(build.cc, sources)) 78 79 with build.options(source_dir="tools", deps=[build, build.deps.clog]): 80 build.executable("cpu-info", build.cc("cpu-info.c")) 81 build.executable("isa-info", build.cc("isa-info.c")) 82 build.executable("cache-info", build.cc("cache-info.c")) 83 84 if build.target.is_x86_64: 85 with build.options(source_dir="tools", include_dirs=["src", "include"]): 86 build.executable("cpuid-dump", build.cc("cpuid-dump.c")) 87 88 with build.options(source_dir="test", deps=[build, build.deps.clog, build.deps.googletest]): 89 build.smoketest("init-test", build.cxx("init.cc")) 90 if build.target.is_linux: 91 build.smoketest("get-current-test", build.cxx("get-current.cc")) 92 if build.target.is_x86_64: 93 build.smoketest("brand-string-test", build.cxx("name/brand-string.cc")) 94 if options.mock: 95 with build.options(source_dir="test", include_dirs="test", macros="CPUINFO_MOCK", deps=[build, build.deps.googletest]): 96 if build.target.is_arm64 and build.target.is_linux: 97 build.unittest("scaleway-test", build.cxx("scaleway.cc")) 98 99 if not options.mock: 100 with build.options(source_dir="bench", deps=[build, build.deps.clog, build.deps.googlebenchmark]): 101 build.benchmark("init-bench", build.cxx("init.cc")) 102 if not build.target.is_macos: 103 build.benchmark("get-current-bench", build.cxx("get-current.cc")) 104 105 return build 106 107 108if __name__ == "__main__": 109 import sys 110 main(sys.argv[1:]).generate() 111