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

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

    # 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" ]
  }

  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-in-shared-libs",
  ]

  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") {
  libs = [
    "asound",
    "avcodec",
    "avformat",
    "avutil",
    ":libpthread.so.0",
    "pthread",
    "rt",
    "openmaxil",
    "bcm_host",
    "vcos",
    "vchiq_arm",
    "brcmGLESv2",
    "brcmEGL",

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

  configs = [ "//starboard/raspi/shared/platform_configuration:compiler_flags" ]

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

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

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