# 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("platform_configuration") {
  configs = [ "//starboard/build/config/sabi" ]
  cflags = []
  ldflags = [ "-static-libstdc++" ]

  if (current_toolchain == default_toolchain) {
    cflags += [
      "-O2",
      "-Wno-unused-parameter",
    ]
  }

  if (is_debug) {
    cflags += [
      "-frtti",
      "-O0",
    ]
  } else if (is_devel) {
    cflags += [
      "-frtti",
      "-O2",
    ]
  } else {
    cflags += [
      "-fno-rtti",
      "-O2",
      "gline-tables-only",
    ]
  }

  # if (!cobalt_fastbuild && (is_debug || is_devel)) {
  #   cflags += ["-g"]
  # }

  if (is_clang) {
    cflags += [
      "-Werror",
      "-fcolor-diagnostics",

      # Default visibility to hidden, to enable dead stripping.
      "-fvisibility=hidden",

      # Warn for implicit type conversions that may change a value.
      "-Wconversion",

      # Warns on switches on enums that cover all enum values but
      # also contain a default: branch. Chrome is full of that.
      "-Wno-covered-switch-default",

      # protobuf uses hash_map.
      "-Wno-deprecated",
      "-fno-exceptions",

      # Don"t warn about the "struct foo f = {0};" initialization pattern.
      "-Wno-missing-field-initializers",

      # Do not warn for implicit sign conversions.
      "-Wno-sign-conversion",
      "-fno-strict-aliasing",  # See http://crbug.com/32204

      # TODO(pkasting): In C++11 this is legal, so this should be
      # removed when we change to that.  (This is also why we don"t
      # bother fixing all these cases today.)
      "-Wno-unnamed-type-template-args",

      # Triggered by the COMPILE_ASSERT macro.
      "-Wno-unused-local-typedef",

      # Do not warn if a function or variable cannot be implicitly
      # instantiated.
      "-Wno-undefined-var-template",

      # Do not warn about unused function params.
      "-Wno-unused-parameter",
    ]
  }

  defines = [ "__STDC_FORMAT_MACROS" ]  # so that we get PRI*

  if (sb_pedantic_warnings) {
    cflags += [
      "-Wall",
      "-Wextra",
      "-Wunreachable-code",
    ]
  } else {
    cflags += [
      # 'this' pointer cannot be NULL...pointer may be assumed
      # to always convert to true.
      "-Wno-undefined-bool-conversion",

      # Skia doesn't use overrides.
      "-Wno-inconsistent-missing-override",

      # Do not warn for implicit type conversions that may change a value.
      "-Wno-conversion",

      # shifting a negative signed value is undefined
      "-Wno-shift-negative-value",

      # Width of bit-field exceeds width of its type- value will be truncated
      "-Wno-bitfield-width",
    ]
  }
}
