# Copyright 2021 The Cobalt Authors. All Rights Reserved.
#
# 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
#
#     http://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.

config("base") {
  defines = []

  if (is_debug) {
    defines += [
      "STARBOARD_BUILD_TYPE_DEBUG",
      "_DEBUG",
    ]
  }

  if (is_devel) {
    defines += [
      "STARBOARD_BUILD_TYPE_DEVEL",
      "_DEBUG",
    ]
  }

  if (is_qa) {
    defines += [
      "STARBOARD_BUILD_TYPE_QA",
      "NDEBUG",
    ]
  }

  if (is_gold) {
    defines += [
      "STARBOARD_BUILD_TYPE_GOLD",
      "NDEBUG",
    ]
  }
}

config("host") {
  if (current_toolchain == host_toolchain) {
    if (is_linux) {
      ldflags = [ "-pthread" ]
      cflags_cc = [ "-std=gnu++14" ]

      if (target_cpu == "arm" || target_cpu == "x86") {
        cflags = [ "-m32" ]
        ldflags += [
          "-target",
          "i386-unknown-linux-gnu",
          "-latomic",
        ]
      }
    } else if (is_win) {
      # A few flags to mute MSVC compiler errors that does not appear on Linux.
      cflags = [
        "/wd4267",  # Possible loss of precision from size_t to a smaller type.
        "/wd4715",  # Not all control paths return value.
      ]
    }
  }
}

config("target") {
  if (current_toolchain != host_toolchain) {
    if (final_executable_type == "shared_library") {
      # Rewrite main() functions into StarboardMain. TODO: This is a
      # hack, it would be better to be more surgical, here.
      defines = [ "main=StarboardMain" ]

      # To link into a shared library on Linux and similar platforms,
      # the compiler must be told to generate Position Independent Code.
      # This appears to cause errors when linking the code statically,
      # however.
      cflags = [ "-fPIC" ]
    }

    if (is_starboard) {
      configs = [ ":starboard" ]
    }
  }
}

config("starboard") {
  if (current_toolchain == default_toolchain) {
    defines = [
      "STARBOARD",
      "COBALT",  # TODO: See if this can be replaced by STARBOARD macro.
    ]

    if (gl_type == "none") {
      defines += [ "SB_GN_GL_TYPE_IS_NONE=1" ]
    } else {
      defines += [ "SB_GN_GL_TYPE_IS_NONE=0" ]
    }

    if (abort_on_allocation_failure) {
      defines += [ "SB_ABORT_ON_ALLOCATION_FAILURE" ]
    }

    if (sb_allows_memory_tracking) {
      defines += [ "STARBOARD_ALLOWS_MEMORY_TRACKING" ]
    }

    if (sb_enable_lib) {
      defines += [ "SB_IS_LIBRARY=1" ]
    }

    if (sb_is_evergreen) {
      defines += [ "SB_IS_EVERGREEN=1" ]
    }

    if (sb_is_evergreen_compatible) {
      defines += [ "SB_IS_EVERGREEN_COMPATIBLE=1" ]
    }

    if (sb_evergreen_compatible_use_libunwind) {
      defines += [ "SB_IS_EVERGREEN_COMPATIBLE_LIBUNWIND=1" ]
    }

    if (sb_evergreen_compatible_enable_lite) {
      defines += [ "SB_IS_EVERGREEN_COMPATIBLE_LITE=1" ]
    }

    defines += [
      "STARBOARD_ATOMIC_INCLUDE=\"$starboard_path/atomic_public.h\"",
      "STARBOARD_CONFIGURATION_INCLUDE=\"$starboard_path/configuration_public.h\"",
      "STARBOARD_THREAD_TYPES_INCLUDE=\"$starboard_path/thread_types_public.h\"",
    ]
  }
}

config("starboard_implementation") {
  # This allows the benchmarks to include internal only header files.
  defines = [ "STARBOARD_IMPLEMENTATION" ]
}

config("speed") {
  if (current_toolchain == default_toolchain) {
    if (defined(speed_config_path)) {
      configs = [ speed_config_path ]
    }
  }
}

config("size") {
  if (current_toolchain == default_toolchain) {
    if (defined(size_config_path)) {
      configs = [ size_config_path ]
    }
  }
}

config("pedantic_warnings") {
  if (current_toolchain == default_toolchain) {
    if (defined(pedantic_warnings_config_path)) {
      configs = [ pedantic_warnings_config_path ]
    }
  }
}

config("no_pedantic_warnings") {
  if (current_toolchain == default_toolchain) {
    if (defined(no_pedantic_warnings_config_path)) {
      configs = [ no_pedantic_warnings_config_path ]
    }
  }
}
