# 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
      # Disable MSVC warnings about std::aligned_storage being broken before VS 2017 15.8
      "/D_ENABLE_EXTENDED_ALIGNED_STORAGE",
    ]

    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" ]
    }

    # Diable some MSVC warnings.
    if (!is_clang) {
      cflags += [
        "/wd4309", # Truncation of constant value. See PixelRoutine.cpp casts of signed shorts.
      ]

      if (target_cpu == "x86") {
        cflags += [
          # TODO(b/140575360): Fix when posssible.
          "/wd4316", # object allocated on the heap may not be aligned. See Renderer and Pool.
        ]
      }
    }
  } 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",
  ]
}

if (build_with_chromium) {
    group("swiftshader_tests") {
      testonly = true

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