# Copyright 2016 The SwiftShader 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.

import("//build/config/c++/c++.gni")
import("//build/config/compiler/compiler.gni")
import("//build/config/mips.gni")

config("swiftshader_config") {
  defines = []

  if (is_win) {
    cflags = [
      "/GS",  # Detects some buffer overruns
      "/Zc:wchar_t",
      "/EHs-c-",  # Disable C++ exceptions
      "/nologo",
      "/Gd",  # Default calling convention
    ]

    if (!use_custom_libcxx) {
      # Disable EH usage in STL headers.
      # libc++ uses a predefined macro to control whether to use exceptions, so
      # defining this macro is unnecessary. Defining _HAS_EXCEPTIONS to 0 also
      # breaks libc++ because it depends on MSVC headers that only provide
      # certain declarations if _HAS_EXCEPTIONS is 1.
      defines += [
        "_HAS_EXCEPTIONS=0",
      ]
    }

    defines += [
      "_CRT_SECURE_NO_DEPRECATE",
      "NOMINMAX",
      "_WINDLL",
      "NO_SANITIZE_FUNCTION=",
    ]

    if (!is_debug) {
      defines += [ "ANGLE_DISABLE_TRACE" ]
    }
  } else {
    cflags = [
      "-std=c++11",
      "-fno-exceptions",
      "-fno-operator-names",
    ]

    defines += [
      "__STDC_CONSTANT_MACROS",
      "__STDC_LIMIT_MACROS",
      "NO_SANITIZE_FUNCTION=__attribute__((no_sanitize(\"function\")))",
    ]

    if (is_debug) {
      cflags += [
        "-g",
        "-g3",
      ]
    } else {  # Release
      # All Release builds use function/data sections to make the shared libraries smaller
      cflags += [
        "-ffunction-sections",
        "-fdata-sections",
        "-fomit-frame-pointer",
        "-Os",
      ]

      defines += [
        "ANGLE_DISABLE_TRACE",
        "NDEBUG",
      ]
    }

    if (target_cpu == "x64") {  # 64 bit version
      cflags += [
        "-m64",
        "-fPIC",
        "-march=x86-64",
        "-mtune=generic",
      ]
    } else if (target_cpu == "x86") {  # 32 bit version
      cflags += [
        "-m32",
        "-msse2",
        "-mfpmath=sse",
        "-march=pentium4",
        "-mtune=generic",
      ]
    } else if (target_cpu == "mipsel" && current_cpu == target_cpu) {
      cflags += [
        "-march=mipsel",
        "-fPIC",
        "-mhard-float",
        "-mfp32",
      ]
      if (mips_arch_variant == "r1") {
        cflags += [
          "-mcpu=mips32",
        ]
      } else {
        cflags += [
          "-mcpu=mips32r2",
        ]
      }
    } else if (target_cpu == "mips64el" && current_cpu == target_cpu) {
      cflags += [
        "-march=mips64el",
        "-mcpu=mips64r2",
        "-mabi=64",
        "-fPIC",
      ]
    }

    if (is_linux) {
      ldflags = [ "-Wl,--gc-sections" ]

      if (target_cpu == "mipsel") {
        ldflags += [
          "-Wl,--hash-style=sysv",
        ]
        if (mips_arch_variant == "r1") {
          ldflags += [
            "-mips32",
          ]
        } else {
          ldflags += [
            "-mips32r2",
          ]
        }
      } else if (target_cpu == "mips64el") {
        ldflags += [
          "-Wl,--hash-style=sysv",
          "-mips64r2",
        ]
      } else {
        ldflags += [ "-Wl,--hash-style=both" ]
      }

      # A bug in the gold linker prevents using ICF on 32-bit (crbug.com/729532)
      if (use_gold && (target_cpu == "x86" || target_cpu == "mipsel")) {
        ldflags += [ "-Wl,--icf=none" ]
      }
    }
  }
}

source_set("vertex_routine_fuzzer") {
  sources = [
    "tests/fuzzers/VertexRoutineFuzzer.cpp"
  ]
  if (is_win) {
    cflags = [
      "/wd4201",  # nameless struct/union
      "/wd4065",  # switch statement contains 'default' but no 'case' labels
      "/wd5030",  # attribute is not recognized
    ]
  }
  include_dirs = [
    "src/",
  ]
  deps = [
    "src/OpenGL/libGLESv2:swiftshader_libGLESv2_static",
  ]
}

group("swiftshader") {
  data_deps = [
    "src/OpenGL/libGLESv2:swiftshader_libGLESv2",
    "src/OpenGL/libEGL:swiftshader_libEGL",
  ]
}

group("swiftshader_tests") {
  testonly = true

  data_deps = [
    "tests/GLESUnitTests:swiftshader_unittests",
  ]
}
