# 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" ]
  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",
  ]
  cflags = []

  if (current_toolchain == host_toolchain) {
    cflags += [ "-O2" ]
  }
  if (is_debug) {
    cflags += [
      "-frtti",
      "-O0",
    ]
  } else if (is_devel) {
    cflags += [
      "-frtti",
      "-O2",
    ]
  } else {
    cflags += [
      "-fno-rtti",
      "-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" ]
  }

  if (current_toolchain != host_toolchain) {
    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",
      "-fno-exceptions",
      "-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",
  ]
}
