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

    # Need for stack unwinding
    "-funwind-tables",

    # 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++17",
    "-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/build/config/modular/arm/hardfp" ]
  } 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",
  ]
}
