# 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("compiler_flags") {
  cflags = []
  cflags_c = []
  cflags_cc = []
  defines = []
  ldflags = []

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

  if (is_clang) {
    ldflags += [ "-fuse-ld=lld" ]
    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",

      # 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

      # 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 an implicit exception spec mismatch.
      "-Wno-implicit-exception-spec-mismatch",

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

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

  defines += [
    # By default, <EGL/eglplatform.h> pulls in some X11 headers that have some
    # nasty macros (|Status|, for example) that conflict with Chromium base.
    "MESA_EGL_NO_X11_HEADERS",
  ]
  cflags_c += [
    # Limit to C99. This allows Linux to be a canary build for any
    # C11 features that are not supported on some platforms' compilers.
    "-std=c99",
  ]
  cflags_cc = [ "-std=gnu++14" ]
  ldflags += [
    "-Wl,-rpath=\$ORIGIN/lib",

    # Cleanup unused sections
    "-Wl,-gc-sections",
  ]

  if (use_asan) {
    cflags += [
      "-fsanitize=address",
      "-fno-omit-frame-pointer",
    ]
    ldflags += [
      "-fsanitize=address",

      # Force linking of the helpers in sanitizer_options.cc
      "-Wl,-u_sanitizer_options_link_helper",
    ]
    defines += [ "ADDRESS_SANITIZER" ]
  } else if (use_tsan) {
    cflags += [
      "-fsanitize=thread",
      "-fno-omit-frame-pointer",
    ]
    ldflags += [ "-fsanitize=thread" ]
    defines += [ "THREAD_SANITIZER" ]
  }
}

config("platform_configuration") {
  defines = []
  ldflags = []
  libs = [
    "asound",
    "dl",
    "pthread",
    "rt",
  ]

  if (!sb_is_evergreen) {
    ldflags += [ "-static-libstdc++" ]
  }

  defines += [
    # Defined to get format macro constants from <inttypes.h>.
    "__STDC_FORMAT_MACROS",
    "COBALT_LINUX",

    # Enable GNU extensions to get prototypes like ffsl.
    "_GNU_SOURCE=1",
  ]

  if (is_debug) {
    defines += [
      "_GLIBCXX_DEBUG",
      "_LIBCPP_DEBUG=1",
    ]
    configs = [ "//build/config/compiler:rtti" ]
  } else if (is_devel) {
    defines += [
      "_GLIBCXX_DEBUG",
      "_LIBCPP_DEBUG=0",
    ]
    configs = [ "//build/config/compiler:rtti" ]
  }
}

config("libraries") {
  ldflags = [ "-Wl,--wrap=eglSwapBuffers" ]
  libs = [
    "X11",
    "Xcomposite",
    "Xrender",
  ]
}

config("speed") {
  cflags = [
    "-O2",

    # Compile symbols in separate sections
    "-ffunction-sections",
    "-fdata-sections",
  ]
}

config("size") {
  cflags = [
    "-Os",

    # Compile symbols in separate sections
    "-ffunction-sections",
    "-fdata-sections",
  ]
}

config("pedantic_warnings") {
  cflags = [
    "-Wall",
    "-Wextra",
    "-Wunreachable-code",
  ]
}

config("no_pedantic_warnings") {
  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",
    "-Wno-undefined-var-template",
  ]
}
