• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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