# 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")
import("//build/config/sysroot.gni")
import("src/Reactor/reactor.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 += [
        "/wd4065", # switch statement contains 'default' but no 'case' labels
        "/wd4309", # Truncation of constant value. See PixelRoutine.cpp casts of signed shorts.
      ]
    }

    cflags_cc = [ "/std:c++17" ]
  } else {
    cflags = [
      "-fno-exceptions",
      "-fno-operator-names",
    ]
    cflags_cc = [ "-std=c++17" ]
    # On macOS, some C++17 features used by LLVM require version 10.12.
    if (is_mac && supports_llvm) {
      cflags += [
        "-isysroot",
        rebase_path(sysroot, root_build_dir),
        "-mmacosx-version-min=10.12.0",
      ]
    }

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

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

      if (current_cpu == "mipsel") {
        ldflags += [
          "-Wl,--hash-style=sysv",
        ]
        if (mips_arch_variant == "r1") {
          ldflags += [
            "-mips32",
          ]
        } else {
          ldflags += [
            "-mips32r2",
          ]
        }
      } else if (current_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 && (current_cpu == "x86" || current_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",
        "tests/SystemUnitTests:swiftshader_system_unittests",
      ]

      if (supports_llvm) {
        data_deps += [ "tests/ReactorUnitTests:swiftshader_reactor_llvm_unittests" ]
      }

      if (supports_subzero) {
        data_deps += [ "tests/ReactorUnitTests:swiftshader_reactor_subzero_unittests" ]
      }
    }
}
