# 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("platform_configuration") {
  configs = [ "//starboard/build/config/sabi" ]
  cflags = []

  if (current_toolchain == host_toolchain) {
    cflags += [ "-O2" ]
  } else {
    defines = []
    ldflags = [
      # The NDK default "ld" is actually the gold linker for all architectures
      # except arm64 (aarch64) where it"s the bfd linker. Don"t use either of
      # those, rather use lld everywhere. See release notes for NDK 19:
      # https://developer.android.com/ndk/downloads/revision_history
      "-fuse-ld=lld",

      # Mimic build/cmake/android.toolchain.cmake in the Android NDK.
      "-Wl,--exclude-libs,libunwind.a",
    ]
    if (is_debug) {
      cflags += [ "-O0" ]
      configs += [ "//build/config/compiler:rtti" ]
    } else if (is_devel) {
      cflags += [ "-O2" ]
      configs += [ "//build/config/compiler:rtti" ]
    } else {
      cflags += [ "-gline-tables-only" ]
    }

    libs = [
      "EGL",
      "GLESv2",
      "OpenSLES",
      "android",
      "log",
      "mediandk",
    ]

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

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

    cflags_cc = [ "-std=c++14" ]
    cflags += [
      # libwebp uses the cpufeatures library to detect ARM NEON support
      "-I${android_ndk_path}/sources/android/cpufeatures",

      # Mimic build/cmake/android.toolchain.cmake in the Android NDK.
      "-ffunction-sections",
      "-funwind-tables",
      "-fstack-protector-strong",
      "-no-canonical-prefixes",

      # Other flags
      "-fsigned-char",
      "-fno-limit-debug-info",
      "-fcolor-diagnostics",
      "-fno-strict-aliasing",  # See http://crbug.com/32204

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

      # Any warning will stop the build.
      "-Werror",

      # Disable errors for the warning till the Android NDK r19 is fixed.
      # The warning is trigger when compiling .c files and complains for
      # "-stdlib=libc++" which is added by the NDK.
      "-Wno-error=unused-command-line-argument",

      # Don"t warn about register variables (in base and net)
      "-Wno-deprecated-register",

      # Don"t warn about deprecated ICU methods (in googleurl and net)
      "-Wno-deprecated-declarations",

      # Skia doesn"t use overrides.
      "-Wno-inconsistent-missing-override",

      # shifting a negative signed value is undefined
      "-Wno-shift-negative-value",

      # Don"t warn for implicit sign conversions. (in v8 and protobuf)
      "-Wno-sign-conversion",
    ]
    defines += [
      # Enable compile-time decisions based on the ABI
      "ANDROID_ABI=$android_abi",

      # -DANDROID is an argument to some ifdefs in the NDK"s eglplatform.h
      "ANDROID",

      # Cobalt on Linux flag
      "COBALT_LINUX",

      # So that we get the PRI* macros from inttypes.h
      "__STDC_FORMAT_MACROS",

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

      # Undefining __linux__ causes the system headers to make wrong
      # assumptions about which C-library is used on the platform.
      "__BIONIC__",

      # Undefining __linux__ leaves libc++ without a threads implementation.
      # TODO: See if there"s a way to make libcpp threading use Starboard.
      "_LIBCPP_HAS_THREAD_API_PTHREAD",
    ]
    ldflags += [
      # Use the static LLVM libc++.
      "-static-libstdc++",

      # Mimic build/cmake/android.toolchain.cmake in the Android NDK, but
      # force build-id to sha1, so that older lldb versions can still find
      # debugsymbols, see https://github.com/android-ndk/ndk/issues/885
      "-Wl,--build-id=sha1",
      "-Wl,--warn-shared-textrel",
      "-Wl,--fatal-warnings",
      "-Wl,--gc-sections",
      "-Wl,-z,nocopyreloc",

      # Wrapper synchronizes punch-out video bounds with the UI frame.
      "-Wl,--wrap=eglSwapBuffers",
    ]
  }
}

config("size") {
  cflags = [ "-Os" ]
}

config("speed") {
  cflags = [ "-O2" ]
}

config("executable_config") {
  cflags = [ "-fPIE" ]
  ldflags = [ "-pie" ]
}

config("library_config") {
  cflags = [ "-fPIC" ]
}

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

    # Don't get pedantic about warnings from base macros. These must be
    # disabled after the -Wall above, so this has to be done here rather
    # than in the platform's target toolchain.
    # TODO: Rebase base and use static_assert instead of COMPILE_ASSERT
    "-Wno-unused-local-typedef",  # COMPILE_ASSERT
    "-Wno-missing-field-initializers",  # LAZY_INSTANCE_INITIALIZER

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