# 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.

declare_args() {
  raspi_home = getenv("RASPI_HOME")
}

config("common_flags") {
  ldflags = [
    "--sysroot=$raspi_home/busterroot",

    # This is a quirk of Raspbian, these are required to link any GL-related
    # libraries.
    "-L$raspi_home/busterroot/opt/vc/lib",
    "-Wl,-rpath=$raspi_home/busterroot/opt/vc/lib",
    "-L$raspi_home/busterroot/usr/lib/arm-linux-gnueabihf",
    "-Wl,-rpath=$raspi_home/busterroot/usr/lib/arm-linux-gnueabihf",
    "-L$raspi_home/busterroot/lib/arm-linux-gnueabihf",
    "-Wl,-rpath=$raspi_home/busterroot/lib/arm-linux-gnueabihf",

    # Cleanup unused sections
    "-Wl,-gc-sections",
    "-Wl,--unresolved-symbols=ignore-all",
  ]
  libs = [
    "asound",
    "rt",
    "openmaxil",
    "bcm_host",
    "vcos",
    "vchiq_arm",
    "brcmGLESv2",
    "brcmEGL",

    # Static libs must be last, to avoid __dlopen linker errors
    "EGL_static",
    "GLESv2_static",
  ]
}

config("compiler_flags") {
  cflags = []
  cflags_c = []
  cflags_cc = []
  defines = []
  ldflags = []

  defines += [
    # Cobalt on Linux flag
    "COBALT_LINUX",
    "__STDC_FORMAT_MACROS",  # so that we get PRI*
    "_GNU_SOURCE=1",
  ]

  if (is_debug) {
    cflags += [ "-O0" ]
  } else if (is_devel) {
    cflags += [ "-O2" ]
  } else {
    cflags += [ "-Wno-unused-but-set-variable" ]
  }

  cflags += [
    # Generated by code in the raspi/shared/open_max.
    "-Wno-sign-compare",

    # Generated by many starboard implementation files.
    "-Wno-unused-parameter",
    "-Wno-unused-variable",
  ]

  cflags += [
    # Force char to be signed.
    "-fsigned-char",

    # Disable strict aliasing.
    "-fno-strict-aliasing",

    # Allow Skia"s SkVx.h to convert between vectors of different element
    # types or number of subparts.
    "-flax-vector-conversions",

    # To support large files
    "-D_FILE_OFFSET_BITS=64",

    # Suppress some warnings that will be hard to fix.
    "-Wno-unused-local-typedefs",
    "-Wno-unused-result",
    "-Wno-unused-function",
    "-Wno-deprecated-declarations",
    "-Wno-missing-field-initializers",
    "-Wno-extra",
    "-Wno-comment",  # Talk to my lawyer.
    "-Wno-narrowing",
    "-Wno-unknown-pragmas",
    "-Wno-type-limits",  # TODO: We should actually look into these.

    # It"s OK not to use some input parameters. Note that the order
    # matters: Wall implies Wunused-parameter and Wno-unused-parameter
    # has no effect if specified before Wall.
    "-Wno-unused-parameter",

    # Specify the sysroot with all your include dependencies.
    "--sysroot=$raspi_home/busterroot",

    # This is a quirk of Raspbian, these are required to include any
    # GL-related headers.
    "-I$raspi_home/busterroot/opt/vc/include",
    "-I$raspi_home/busterroot/opt/vc/include/interface/vcos/pthreads",
    "-I$raspi_home/busterroot/opt/vc/include/interface/vmcs_host/linux",
    "-I$raspi_home/busterroot/usr/include/arm-linux-gnueabihf",
  ]

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

  cflags_c += [ "-std=c11" ]
  cflags_cc += [
    "-std=gnu++14",
    "-Wno-literal-suffix",

    # Generated by Audio Renderer and Audio Sink implementations.
    "-Wno-reorder",
  ]
}

config("platform_configuration") {
  configs = [ ":common_flags" ]
  if (current_toolchain == default_toolchain && sb_is_modular) {
    configs += [ "//starboard/evergreen/arm/hardfp/platform_configuration" ]
  } else {
    configs +=
        [ "//starboard/raspi/shared/platform_configuration:compiler_flags" ]

    if (is_debug || is_devel) {
      configs += [ "//build/config/compiler:rtti" ]
    }
  }
}

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

    # Raspi toolchain is based off an old version of gcc, which
    # falsely flags some code.  That same code does not warn with gcc 6.3.
    # This decision should be revisited after raspi toolchain is upgraded.
    "-Wno-maybe-uninitialized",

    "-Werror",
    "-Wno-expansion-to-defined",
    "-Wno-implicit-fallthrough",
  ]
}

config("no_pedantic_warnings") {
  cflags = [
    # Do not warn for implicit type conversions that may change a value.
    "-Wno-conversion",
  ]
}
