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