# 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/**",
    # Remove support for QNX
    "src/video/qnx/**",
]

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 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_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,
)
