#!/usr/bin/env python3

from __future__ import print_function
import os


CPUINFO_SOURCES = {
    None: [
        "init.c",
        "api.c",
        "cache.c",
    ],
    "defined(__linux__)": [
        "linux/multiline.c",
        "linux/cpulist.c",
        "linux/mockfile.c",
        "linux/smallfile.c",
        "linux/processors.c",
    ],
    "defined(__MACH__) && defined(__APPLE__)": [
        "mach/topology.c",
    ],
    "defined(__i386__) || defined(__i686__) || defined(__x86_64__) || defined(_WIN32)": [
        "x86/cache/init.c",
        "x86/cache/deterministic.c",
        "x86/cache/descriptor.c",
        "x86/info.c",
        "x86/mockcpuid.c",
        "x86/isa.c",
        "x86/topology.c",
        "x86/name.c",
        "x86/init.c",
        "x86/uarch.c",
        "x86/vendor.c",
    ],
    "(defined(__i386__) || defined(__i686__) || defined(__x86_64__)) && defined(__linux__)": [
        "x86/linux/init.c",
        "x86/linux/cpuinfo.c",
    ],
    "(defined(__i386__) || defined(__i686__) || defined(__x86_64__)) && defined(__MACH__) && defined(__APPLE__)": [
        "x86/mach/init.c",
    ],
    "defined(_WIN32)": [
        "x86/windows/init.c",
    ],
    "(defined(__arm__) || defined(__aarch64__)) && defined(__linux__)": [
        "arm/linux/cpuinfo.c",
        "arm/linux/hwcap.c",
        "arm/linux/init.c",
        "arm/linux/clusters.c",
        "arm/linux/midr.c",
        "arm/linux/chipset.c",
        "arm/tlb.c",
        "arm/uarch.c",
        "arm/cache.c",
    ],
    "defined(__arm__) && defined(__linux__)": [
        "arm/linux/aarch32-isa.c",
    ],
    "defined(__aarch64__) && defined(__linux__)": [
        "arm/linux/aarch64-isa.c",
    ],
    "(defined(__arm__) || defined(__aarch64__)) && defined(__ANDROID__)": [
        "arm/android/properties.c",
    ],
    "(defined(__arm__) || defined(__aarch64__)) && defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE": [
        "arm/mach/init.c",
    ],
}


if __name__ == "__main__":
    for condition, filenames in CPUINFO_SOURCES.items():
        for filename in filenames:
            filepath = os.path.join("cpuinfo/wrappers", filename)
            if not os.path.exists(os.path.dirname(filepath)):
                print(filepath)
                os.makedirs(os.path.dirname(filepath))
            with open(filepath, "w") as wrapper:
                print("/* Auto-generated by generate-wrappers.py script. Do not modify */", file=wrapper)
                print(file=wrapper)
                print("#ifdef __APPLE__", file=wrapper)
                print("\t#include <TargetConditionals.h>", file=wrapper)
                print("#endif /* __APPLE__ */", file=wrapper)
                print(file=wrapper)

                if not condition:
                    print("#include <%s>" % filename, file=wrapper)
                else:
                    # Include source file only if condition is satisfied
                    print("#if %s" % condition, file=wrapper)
                    print("#include <%s>" % filename, file=wrapper)
                    print("#endif /* %s */" % condition, file=wrapper)
