# 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",

      # 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",

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

    if (is_gold) {
      cflags += [
        # Don't generate an eh_frame and eh_frame_hdr section.
        "-fno-asynchronous-unwind-tables",
      ]
    }
  }

  if (is_clang_16) {
    cflags += [
      # Do not warn about an implicit conversion from int to float
      "-Wno-implicit-int-float-conversion",

      # Do not warn about an implicit conversion from int to char16
      "-Wno-implicit-int-conversion",

      # Do not remove null pointer checks.
      "-fno-delete-null-pointer-checks",
    ]
  }

  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 += [ "-std=c11" ]

  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" ]
    if (asan_symbolizer_path != "") {
      defines += [ "ASAN_SYMBOLIZER_PATH=\"${asan_symbolizer_path}\"" ]
    }
  } 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_modular || current_toolchain != cobalt_toolchain) {
    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" ]

  if (is_qa || is_gold) {
    cflags += [
      # Compile symbols in separate sections
      "-ffunction-sections",
      "-fdata-sections",
    ]
  }
}

config("size") {
  cflags = [ "-Os" ]
  if (is_qa || is_gold) {
    cflags += [
      # 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",
  ]
}
