# Copyright 2014 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

# Modifications Copyright 2017 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.

import("//cobalt/build/config/base.gni")

# TODO: split out into relevant subdirectories
config("compiler_defaults") {
  if (cobalt_media_buffer_pool_allocate_on_demand) {
    allocate_on_demand = 1
  } else {
    allocate_on_demand = 0
  }

  defines = [
    "COBALT",
    "COBALT_MEDIA_BUFFER_POOL_ALLOCATE_ON_DEMAND=$allocate_on_demand",
    "COBALT_MEDIA_BUFFER_INITIAL_CAPACITY=$cobalt_media_buffer_initial_capacity",
    "COBALT_MEDIA_BUFFER_MAX_CAPACITY_1080p=$cobalt_media_buffer_max_capacity_1080p",
    "COBALT_MEDIA_BUFFER_MAX_CAPACITY_4K=$cobalt_media_buffer_max_capacity_4k",
    "COBALT_MEDIA_BUFFER_ALLOCATION_UNIT=$cobalt_media_buffer_allocation_unit",
    "COBALT_MEDIA_BUFFER_ALIGNMENT=$cobalt_media_buffer_alignment",
    "COBALT_MEDIA_BUFFER_PADDING=$cobalt_media_buffer_padding",
    "COBALT_MEDIA_BUFFER_PROGRESSIVE_BUDGET=$cobalt_media_buffer_progressive_budget",
    "COBALT_MEDIA_BUFFER_NON_VIDEO_BUDGET=$cobalt_media_buffer_non_video_budget",
    "COBALT_MEDIA_BUFFER_VIDEO_BUDGET_1080P=$cobalt_media_buffer_video_budget_1080p",
    "COBALT_MEDIA_BUFFER_VIDEO_BUDGET_4K=$cobalt_media_buffer_video_budget_4k",
    "COBALT_MEDIA_SOURCE_GARBAGE_COLLECTION_DURATION_THRESHOLD_IN_SECONDS=$cobalt_media_source_garbage_collection_duration_threshold_in_seconds",

    # From common.gypi
    "USE_OPENSSL=1",
  ]

  include_dirs = [ "//" ]

  if (cobalt_use_media_source_2016) {
    defines += [ "COBALT_MEDIA_SOURCE_2016=1" ]
  } else {
    defines += [ "COBALT_MEDIA_SOURCE_2012=1" ]
  }

  if (cobalt_media_buffer_storage_type == "memory") {
    defines += [ "COBALT_MEDIA_BUFFER_STORAGE_TYPE_MEMORY=1" ]
  } else {
    defines += [ "COBALT_MEDIA_BUFFER_STORAGE_TYPE_FILE=1" ]
  }

  if (enable_in_app_dial) {
    defines += [ "DIAL_SERVER" ]
  }

  if (!enable_spdy) {
    defines += [ "COBALT_DISABLE_SPDY" ]
  }
}

config("final_executable_target_config") {
  # XXX: ideally this config would only apply when we are compiling targets
  # for the target platform. We try to check for that here, however, this check
  # is ineffective when default_toolchain happens to be the same as
  # host_toolchain.
  # Therefore, **targets which should be compiled for the host must remove this
  # config from their list of configs.**
  if (current_toolchain == default_toolchain &&
      final_executable_type == "shared_library") {
    defines = [
      # Rewrite main() functions into StarboardMain. TODO: This is a
      # hack, it would be better to be more surgical, here.
      "main=StarboardMain",
    ]

    cflags = [
      # To link into a shared library on Linux and similar platforms,
      # the compiler must be told to generate Position Independent Code.
      # This appears to cause errors when linking the code statically,
      # however.
      "-fPIC",
    ]
  }
}

config("compiler_defaults_debug") {
  defines = [
    "ALLOCATOR_STATS_TRACKING",
    "COBALT_BOX_DUMP_ENABLED",
    "COBALT_BUILD_TYPE_DEBUG",
    "COBALT_ENABLE_JAVASCRIPT_ERROR_LOGGING",
    "COBALT_SECURITY_SCREEN_CLEAR_TO_UGLY_COLOR",
    "_DEBUG",
    "ENABLE_DEBUG_COMMAND_LINE_SWITCHES",
    "ENABLE_DEBUG_C_VAL",
    "ENABLE_DEBUG_CONSOLE",
    "ENABLE_IGNORE_CERTIFICATE_ERRORS",
    "ENABLE_PARTIAL_LAYOUT_CONTROL",
    "ENABLE_TEST_DATA",
    "ENABLE_TEST_RUNNER",
    "__LB_SHELL__FORCE_LOGGING__",  # TODO: Rename to COBALT_LOGGING_ENABLED.
    "SK_DEVELOPER",
  ]
}

config("compiler_defaults_devel") {
  defines = [
    "_DEBUG",
    "ALLOCATOR_STATS_TRACKING",
    "COBALT_BUILD_TYPE_DEVEL",
    "COBALT_ENABLE_JAVASCRIPT_ERROR_LOGGING",
    "COBALT_SECURITY_SCREEN_CLEAR_TO_UGLY_COLOR",
    "ENABLE_DEBUG_COMMAND_LINE_SWITCHES",
    "ENABLE_DEBUG_C_VAL",
    "ENABLE_DEBUG_CONSOLE",
    "ENABLE_IGNORE_CERTIFICATE_ERRORS",
    "ENABLE_PARTIAL_LAYOUT_CONTROL",
    "ENABLE_TEST_DATA",
    "ENABLE_TEST_RUNNER",
    "__LB_SHELL__FORCE_LOGGING__",
    "SK_DEVELOPER",
  ]
}

config("compiler_defaults_qa") {
  defines = [
    "ALLOCATOR_STATS_TRACKING",
    "COBALT_BUILD_TYPE_QA",
    "COBALT_ENABLE_JAVASCRIPT_ERROR_LOGGING",
    "COBALT_SECURITY_SCREEN_CLEAR_TO_UGLY_COLOR",
    "ENABLE_DEBUG_COMMAND_LINE_SWITCHES",
    "ENABLE_DEBUG_C_VAL",
    "ENABLE_DEBUG_CONSOLE",
    "ENABLE_IGNORE_CERTIFICATE_ERRORS",
    "ENABLE_PARTIAL_LAYOUT_CONTROL",
    "ENABLE_TEST_DATA",
    "ENABLE_TEST_RUNNER",
    "NDEBUG",
  ]
}

config("compiler_defaults_gold") {
  defines = [
    "ALLOCATOR_STATS_TRACKING",
    "COBALT_BUILD_TYPE_GOLD",
    "COBALT_FORCE_CSP",
    "COBALT_FORCE_HTTPS",
    "NDEBUG",
    "TRACING_DISABLED",
  ]
}

config("chromium_code") {
  defines = [
    "__STDC_CONSTANT_MACROS",
    "__STDC_FORMAT_MACROS",
  ]
}
