# Copyright 2019 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

package(default_visibility = ["//visibility:public"])

sdl_includes = ["include"]

SDL_DEFAULT_SRC_EXCLUDES = [
    # Ignore test files.
    "src/test/*.c",
    # Unfortunately, thread/generic does not contain any guards to
    # prevent collisions against thread/pthread.
    "src/thread/generic/*.c",
    # Don't include Windows support.
    "src/render/direct3d*/**",
    "src/render/SDL_d3d*",
    "src/haptic/windows/**",
    "src/locale/windows/**",
    "src/locale/winrt/**",
    # Ignore Android and Emscripten locales
    "src/locale/android/**",
    "src/locale/emscripten/**",
    # Remove support for QNX
    "src/video/qnx/**",
    # No dbus -> don't try to compile this file
    "src/core/linux/SDL_fcitx.c",
]

sdl_sources = select({
    "@bazel_tools//src/conditions:windows": glob(
        include = [
            "src/**/*.c",
            "src/**/*.h",
        ],
        exclude = [
            # Ignore test files
            "src/test/*.c",
            # Ignore Linux/Unix
            "src/core/linux/**",
            "src/core/unix/**",
            # Ignore Android and Emscripten locales
            "src/locale/android/**",
            "src/locale/emscripten/**",
            # Ignore thread (exclude for thread/windows)
            "src/thread/**",
            # Remove support for QNX
            "src/video/qnx/**",
        ],
    ) + glob([
        "src/thread/*",
        "src/thread/windows/*",
        "src/thread/generic/SDL_syscond.*",
    ]),
    "//conditions:default": glob(
        include = [
            "src/**/*.c",
            "src/**/*.h",
        ],
        exclude = SDL_DEFAULT_SRC_EXCLUDES,
    ),
})

sdl_headers = [
    "include/begin_code.h",
    "include/close_code.h",
    "include/SDL.h",
    "include/SDL_assert.h",
    "include/SDL_atomic.h",
    "include/SDL_audio.h",
    "include/SDL_bits.h",
    "include/SDL_blendmode.h",
    "include/SDL_clipboard.h",
    "include/SDL_config_minimal.h",
    "include/SDL_cpuinfo.h",
    "include/SDL_egl.h",
    "include/SDL_endian.h",
    "include/SDL_error.h",
    "include/SDL_events.h",
    "include/SDL_filesystem.h",
    "include/SDL_gamecontroller.h",
    "include/SDL_gesture.h",
    "include/SDL_haptic.h",
    "include/SDL_hints.h",
    "include/SDL_joystick.h",
    "include/SDL_keyboard.h",
    "include/SDL_keycode.h",
    "include/SDL_loadso.h",
    "include/SDL_locale.h",
    "include/SDL_log.h",
    "include/SDL_main.h",
    "include/SDL_messagebox.h",
    "include/SDL_metal.h",
    "include/SDL_mouse.h",
    "include/SDL_mutex.h",
    "include/SDL_name.h",
    "include/SDL_opengl.h",
    "include/SDL_opengl_glext.h",
    "include/SDL_opengles.h",
    "include/SDL_opengles2.h",
    "include/SDL_pixels.h",
    "include/SDL_platform.h",
    "include/SDL_power.h",
    "include/SDL_quit.h",
    "include/SDL_rect.h",
    "include/SDL_render.h",
    "include/SDL_revision.h",
    "include/SDL_rwops.h",
    "include/SDL_scancode.h",
    "include/SDL_sensor.h",
    "include/SDL_shape.h",
    "include/SDL_stdinc.h",
    "include/SDL_surface.h",
    "include/SDL_system.h",
    "include/SDL_syswm.h",
    "include/SDL_thread.h",
    "include/SDL_timer.h",
    "include/SDL_touch.h",
    "include/SDL_version.h",
    "include/SDL_video.h",
    "include/SDL_vulkan.h",
]

sdl_copts = select({
    "@bazel_tools//src/conditions:windows": [],
    "//conditions:default": [
        "-Wno-string-conversion",
        "-pthread",
        "-includestdio.h",  # Adds `#include <stdio.h>`, which some files need.
    ],
})

sdl_linkopts = select({
    "@bazel_tools//src/conditions:windows": [
        "-DEFAULTLIB:user32",
        "-DEFAULTLIB:gdi32",
        "-DEFAULTLIB:winmm",
        "-DEFAULTLIB:imm32",
        "-DEFAULTLIB:ole32",
        "-DEFAULTLIB:oleaut32",
        "-DEFAULTLIB:version",
        "-DEFAULTLIB:uuid",
        "-DEFAULTLIB:shell32",
        "-DEFAULTLIB:advapi32",
        "-DEFAULTLIB:hid",
        "-DEFAULTLIB:setupapi",
    ],
    "//conditions:default": [
        "-ldl",
        "-lrt",
    ],
})

sdl_deps = [
    "@sdl2_config//:headers",
]

cc_library(
    name = "SDL2",
    srcs = sdl_sources,
    hdrs = sdl_headers,
    copts = sdl_copts,
    includes = sdl_includes,
    linkopts = sdl_linkopts,
    linkstatic = 1,
    deps = sdl_deps,
)
