"""SDL2 autoconf checks used to generate SDL_config.h from the upstream template."""

load("@rules_cc_autoconf//autoconf:checks.bzl", "checks")

SDL2_CONFIG_CHECKS_COMMON = [
    checks.AC_CHECK_SIZEOF(
        "void *",
        define = "SIZEOF_VOIDP",
    ),
    checks.AC_DEFINE("HAVE_LIBC", "1"),
    checks.AC_DEFINE("STDC_HEADERS", "1"),
    checks.AC_DEFINE("HAVE_SETJMP", "1"),
    checks.AC_CHECK_HEADER("alloca.h", define = "HAVE_ALLOCA_H"),
    checks.AC_CHECK_HEADER("ctype.h", define = "HAVE_CTYPE_H"),
    checks.AC_CHECK_HEADER("d3d11_1.h", define = "HAVE_D3D11_H"),
    checks.AC_CHECK_HEADER("d3d12.h", define = "HAVE_D3D12_H"),
    checks.AC_CHECK_HEADER("d3d12sdklayers.h", define = "HAVE_D3D12SDKLAYERS_H"),
    checks.AC_CHECK_HEADER("d3d9.h", define = "HAVE_D3D_H"),
    checks.AC_CHECK_HEADER("float.h", define = "HAVE_FLOAT_H"),
    checks.AC_CHECK_HEADER("iconv.h", define = "HAVE_ICONV_H"),
    checks.AC_CHECK_HEADER("inttypes.h", define = "HAVE_INTTYPES_H"),
    checks.AC_CHECK_HEADER("limits.h", define = "HAVE_LIMITS_H"),
    checks.AC_CHECK_HEADER("linux/input.h", define = "HAVE_LINUX_INPUT_H"),
    checks.AC_CHECK_HEADER("malloc.h", define = "HAVE_MALLOC_H"),
    checks.AC_CHECK_HEADER("memory.h", define = "HAVE_MEMORY_H"),
    checks.AC_CHECK_HEADER("pthread_np.h", define = "HAVE_PTHREAD_NP_H"),
    checks.AC_CHECK_HEADER("signal.h", define = "HAVE_SIGNAL_H"),
    checks.AC_CHECK_HEADER("stdarg.h", define = "HAVE_STDARG_H"),
    checks.AC_CHECK_HEADER("stddef.h", define = "HAVE_STDDEF_H"),
    checks.AC_CHECK_HEADER("stdint.h", define = "HAVE_STDINT_H"),
    checks.AC_CHECK_HEADER("stdio.h", define = "HAVE_STDIO_H"),
    checks.AC_CHECK_HEADER("stdlib.h", define = "HAVE_STDLIB_H"),
    checks.AC_CHECK_HEADER("string.h", define = "HAVE_STRING_H"),
    checks.AC_CHECK_HEADER("strings.h", define = "HAVE_STRINGS_H"),
    checks.AC_CHECK_HEADER("sys/types.h", define = "HAVE_SYS_TYPES_H"),
    checks.AC_CHECK_HEADER("wchar.h", define = "HAVE_WCHAR_H"),
    checks.AC_CHECK_HEADER("math.h", define = "HAVE_MATH_H"),
    checks.AC_CHECK_HEADER("ddraw.h", define = "HAVE_DDRAW_H"),
    checks.AC_CHECK_HEADER("dxgi.h", define = "HAVE_DXGI_H"),
    checks.AC_CHECK_HEADER("dxgi1_6.h", define = "HAVE_DXGI1_6_H"),
    checks.AC_CHECK_HEADER("dxgidebug.h", define = "HAVE_DXGIDEBUG_H"),
    checks.AC_CHECK_HEADER("tpcshrd.h", define = "HAVE_TPCSHRD_H"),
    checks.AC_CHECK_HEADER("xinput.h", define = "HAVE_XINPUT_H"),
    checks.AC_CHECK_HEADER("sensorsapi.h", define = "HAVE_SENSORSAPI_H"),
    checks.AC_CHECK_HEADER("immintrin.h", define = "HAVE_IMMINTRIN_H"),
    checks.AC_CHECK_HEADER("X11/Xcursor/Xcursor.h", define = "HAVE_XCURSOR_H"),
    checks.AC_CHECK_HEADER("X11/extensions/Xfixes.h", define = "HAVE_XFIXES_H"),
    checks.AC_CHECK_HEADER("X11/extensions/XInput2.h", define = "HAVE_XINPUT2_H"),
    checks.AC_CHECK_HEADER("X11/extensions/Xrandr.h", define = "HAVE_XRANDR_H"),
    checks.AC_CHECK_HEADER("xkbcommon/xkbcommon.h", define = "HAVE_XKBCOMMON_H"),
    checks.AC_CHECK_FUNC("abs", define = "HAVE_ABS"),
    checks.AC_CHECK_FUNC("alloca", define = "HAVE_ALLOCA"),
    checks.AC_CHECK_FUNC("atof", define = "HAVE_ATOF"),
    checks.AC_CHECK_FUNC("atoi", define = "HAVE_ATOI"),
    checks.AC_CHECK_FUNC("bsearch", define = "HAVE_BSEARCH"),
    checks.AC_CHECK_FUNC("calloc", define = "HAVE_CALLOC"),
    checks.AC_CHECK_FUNC("clock_gettime", define = "HAVE_CLOCK_GETTIME"),
    checks.AC_CHECK_FUNC("free", define = "HAVE_FREE"),
    checks.AC_CHECK_FUNC("getauxval", define = "HAVE_GETAUXVAL"),
    checks.AC_CHECK_FUNC("getenv", define = "HAVE_GETENV"),
    checks.AC_CHECK_FUNC("malloc", define = "HAVE_MALLOC"),
    checks.AC_CHECK_FUNC("memcmp", define = "HAVE_MEMCMP"),
    checks.AC_CHECK_FUNC("memcpy", define = "HAVE_MEMCPY"),
    checks.AC_CHECK_FUNC("memmove", define = "HAVE_MEMMOVE"),
    checks.AC_CHECK_FUNC("memset", define = "HAVE_MEMSET"),
    checks.AC_CHECK_FUNC("mprotect", define = "HAVE_MPROTECT"),
    checks.AC_CHECK_FUNC("nanosleep", define = "HAVE_NANOSLEEP"),
    checks.AC_CHECK_FUNC("iconv", define = "HAVE_ICONV"),
    checks.AC_CHECK_FUNC("poll", define = "HAVE_POLL"),
    checks.AC_CHECK_FUNC("qsort", define = "HAVE_QSORT"),
    checks.AC_CHECK_FUNC("realloc", define = "HAVE_REALLOC"),
    checks.AC_CHECK_FUNC("strchr", define = "HAVE_STRCHR"),
    checks.AC_CHECK_FUNC("strcmp", define = "HAVE_STRCMP"),
    checks.AC_CHECK_FUNC("strncmp", define = "HAVE_STRNCMP"),
    checks.AC_CHECK_FUNC("strrchr", define = "HAVE_STRRCHR"),
    checks.AC_CHECK_FUNC("strstr", define = "HAVE_STRSTR"),
    checks.AC_CHECK_FUNC("strlen", define = "HAVE_STRLEN"),
    checks.AC_CHECK_FUNC("strtod", define = "HAVE_STRTOD"),
    checks.AC_CHECK_FUNC("strtol", define = "HAVE_STRTOL"),
    checks.AC_CHECK_FUNC("strtoll", define = "HAVE_STRTOLL"),
    checks.AC_CHECK_FUNC("strtoul", define = "HAVE_STRTOUL"),
    checks.AC_CHECK_FUNC("strtoull", define = "HAVE_STRTOULL"),
    checks.AC_CHECK_FUNC("sysconf", define = "HAVE_SYSCONF"),
    checks.AC_CHECK_FUNC("vsnprintf", define = "HAVE_VSNPRINTF"),
    checks.AC_CHECK_FUNC("vsscanf", define = "HAVE_VSSCANF"),
    checks.AC_CHECK_FUNC("wcscmp", define = "HAVE_WCSCMP"),
    checks.AC_CHECK_FUNC("wcslen", define = "HAVE_WCSLEN"),
    checks.AC_CHECK_FUNC("wcsncmp", define = "HAVE_WCSNCMP"),
    checks.AC_CHECK_FUNC("wcsstr", define = "HAVE_WCSSTR"),
]

SDL2_CONFIG_CHECKS_NON_WINDOWS = [
    checks.AC_DEFINE("HAVE_GCC_ATOMICS", "1"),
]

SDL2_CONFIG_CHECKS_LINUX = [
    checks.AC_DEFINE("HAVE_DLOPEN", "1"),
    checks.AC_DEFINE("HAVE_O_CLOEXEC", "1"),
    checks.AC_DEFINE("SDL_JOYSTICK_HIDAPI", "1"),
    checks.AC_DEFINE("SDL_AUDIO_DRIVER_ALSA", "1"),
    checks.AC_DEFINE("SDL_AUDIO_DRIVER_ALSA_DYNAMIC", '"libasound.so.2"'),
    checks.AC_DEFINE("SDL_AUDIO_DRIVER_DISK", "1"),
    checks.AC_DEFINE("SDL_AUDIO_DRIVER_DUMMY", "1"),
    checks.AC_DEFINE("SDL_INPUT_LINUXEV", condition = "ac_cv_header_linux_input_h", if_true = "1"),
    checks.AC_DEFINE("SDL_INPUT_LINUXKD", condition = "ac_cv_header_linux_input_h", if_true = "1"),
    checks.AC_DEFINE("SDL_JOYSTICK_LINUX", condition = "ac_cv_header_linux_input_h", if_true = "1"),
    checks.AC_DEFINE("SDL_HAPTIC_LINUX", "1"),
    checks.AC_DEFINE("SDL_SENSOR_DUMMY", "1"),
    checks.AC_DEFINE("SDL_LOADSO_DLOPEN", "1"),
    checks.AC_DEFINE("SDL_THREAD_PTHREAD", "1"),
    checks.AC_DEFINE("SDL_THREAD_PTHREAD_RECURSIVE_MUTEX", "1"),
    checks.AC_DEFINE("SDL_TIMER_UNIX", "1"),
    checks.AC_DEFINE("SDL_VIDEO_DRIVER_DUMMY", "1"),
    checks.AC_DEFINE("SDL_VIDEO_DRIVER_X11", "1"),
    checks.AC_DEFINE("SDL_VIDEO_DRIVER_X11_SUPPORTS_GENERIC_EVENTS", "1"),
    checks.AC_DEFINE("SDL_VIDEO_DRIVER_X11_XCURSOR", condition = "ac_cv_header_x11_xcursor_xcursor_h", if_true = "1"),
    checks.AC_DEFINE("SDL_VIDEO_DRIVER_X11_XFIXES", condition = "ac_cv_header_x11_extensions_xfixes_h", if_true = "1"),
    checks.AC_DEFINE("SDL_VIDEO_DRIVER_X11_XINPUT2", condition = "ac_cv_header_x11_extensions_xinput2_h", if_true = "1"),
    checks.AC_DEFINE("SDL_VIDEO_DRIVER_X11_XRANDR", condition = "ac_cv_header_x11_extensions_xrandr_h", if_true = "1"),
    checks.AC_DEFINE("SDL_POWER_LINUX", "1"),
    checks.AC_DEFINE("SDL_FILESYSTEM_UNIX", "1"),
    checks.AC_DEFINE("DYNAPI_NEEDS_DLOPEN", "1"),
]

SDL2_CONFIG_CHECKS_MACOS = [
    checks.AC_DEFINE("HAVE_DLOPEN", "1"),
    checks.AC_DEFINE("SDL_HIDAPI_DISABLED", "1"),
    checks.AC_DEFINE("SDL_AUDIO_DRIVER_COREAUDIO", "1"),
    checks.AC_DEFINE("SDL_AUDIO_DRIVER_DISK", "1"),
    checks.AC_DEFINE("SDL_AUDIO_DRIVER_DUMMY", "1"),
    checks.AC_DEFINE("SDL_HAPTIC_IOKIT", "1"),
    checks.AC_DEFINE("SDL_JOYSTICK_IOKIT", "1"),
    checks.AC_DEFINE("SDL_JOYSTICK_MFI", "1"),
    checks.AC_DEFINE("SDL_SENSOR_DUMMY", "1"),
    checks.AC_DEFINE("SDL_LOADSO_DLOPEN", "1"),
    checks.AC_DEFINE("SDL_THREAD_PTHREAD", "1"),
    checks.AC_DEFINE("SDL_THREAD_PTHREAD_RECURSIVE_MUTEX", "1"),
    checks.AC_DEFINE("SDL_TIMER_UNIX", "1"),
    checks.AC_DEFINE("SDL_VIDEO_DRIVER_COCOA", "1"),
    checks.AC_DEFINE("SDL_VIDEO_DRIVER_DUMMY", "1"),
    checks.AC_DEFINE("SDL_VIDEO_OPENGL", "1"),
    checks.AC_DEFINE("SDL_VIDEO_OPENGL_CGL", "1"),
    checks.AC_DEFINE("SDL_VIDEO_RENDER_OGL", "1"),
    checks.AC_DEFINE("SDL_VIDEO_RENDER_METAL", "1"),
    checks.AC_DEFINE("SDL_VIDEO_METAL", "1"),
    checks.AC_DEFINE("SDL_FILESYSTEM_COCOA", "1"),
    checks.AC_DEFINE("SDL_POWER_MACOSX", "1"),
    checks.AC_DEFINE("DYNAPI_NEEDS_DLOPEN", "1"),
]

SDL2_CONFIG_CHECKS_WINDOWS = [
    checks.AC_CHECK_HEADER("audioclient.h", define = "HAVE_AUDIOCLIENT_H"),
    checks.AC_CHECK_HEADER("dinput.h", define = "HAVE_DINPUT_H"),
    checks.AC_CHECK_HEADER("dsound.h", define = "HAVE_DSOUND_H"),
    checks.AC_CHECK_HEADER("mmdeviceapi.h", define = "HAVE_MMDEVICEAPI_H"),
    checks.AC_DEFINE("SDL_JOYSTICK_HIDAPI", "1"),
    checks.AC_DEFINE("SDL_AUDIO_DRIVER_WINMM", "1"),
    checks.AC_DEFINE("SDL_AUDIO_DRIVER_DSOUND", requires = ["ac_cv_header_dsound_h==1"]),
    checks.AC_DEFINE("SDL_AUDIO_DRIVER_WASAPI", requires = [
        "ac_cv_header_audioclient_h==1",
        "ac_cv_header_mmdeviceapi_h==1",
    ]),
    checks.AC_DEFINE("SDL_AUDIO_DRIVER_DISK", "1"),
    checks.AC_DEFINE("SDL_AUDIO_DRIVER_DUMMY", "1"),
    checks.AC_DEFINE("SDL_JOYSTICK_DINPUT", condition = "ac_cv_header_dinput_h", if_true = "1"),
    checks.AC_DEFINE("SDL_JOYSTICK_RAWINPUT", "1"),
    checks.AC_DEFINE("SDL_JOYSTICK_XINPUT", condition = "ac_cv_header_xinput_h", if_true = "1"),
    checks.AC_DEFINE("SDL_JOYSTICK_WINDOWS", "1"),
    checks.AC_DEFINE("SDL_HAPTIC_DINPUT", condition = "ac_cv_header_dinput_h", if_true = "1"),
    checks.AC_DEFINE("SDL_HAPTIC_XINPUT", condition = "ac_cv_header_xinput_h", if_true = "1"),
    checks.AC_DEFINE("SDL_SENSOR_WINDOWS", condition = "ac_cv_header_sensorsapi_h", if_true = "1"),
    checks.AC_DEFINE("SDL_LOADSO_WINDOWS", "1"),
    checks.AC_DEFINE("SDL_THREAD_GENERIC_COND_SUFFIX", "1"),
    checks.AC_DEFINE("SDL_THREAD_WINDOWS", "1"),
    checks.AC_DEFINE("SDL_TIMER_WINDOWS", "1"),
    checks.AC_DEFINE("SDL_VIDEO_DRIVER_DUMMY", "1"),
    checks.AC_DEFINE("SDL_VIDEO_DRIVER_WINDOWS", "1"),
    checks.AC_DEFINE("SDL_VIDEO_OPENGL", "1"),
    checks.AC_DEFINE("SDL_VIDEO_OPENGL_WGL", "1"),
    checks.AC_DEFINE("SDL_VIDEO_RENDER_OGL", "1"),
    checks.AC_DEFINE("SDL_VIDEO_RENDER_D3D", requires = ["ac_cv_header_d3d9_h==1"]),
    checks.AC_DEFINE("SDL_VIDEO_RENDER_D3D11", requires = ["ac_cv_header_d3d11_1_h==1"]),
    checks.AC_DEFINE("SDL_VIDEO_RENDER_D3D12", requires = [
        "ac_cv_header_d3d12_h==1",
        "ac_cv_header_d3d12sdklayers_h==1",
    ]),
    checks.AC_DEFINE("SDL_POWER_WINDOWS", "1"),
    checks.AC_DEFINE("SDL_FILESYSTEM_WINDOWS", "1"),
]
