# 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("embed_v8c_resources_as_header_files_public_config") {
  include_dirs = [ target_gen_dir ]
}

action("embed_v8c_resources_as_header_files_action") {
  script = "//cobalt/build/generate_data_header.py"
  sources = [
    "//cobalt/fetch/embedded_scripts/fetch.js",
    "//cobalt/streams/embedded_scripts/byte_length_queuing_strategy.js",
    "//cobalt/streams/embedded_scripts/count_queuing_strategy.js",
    "//cobalt/streams/embedded_scripts/readable_stream.js",
  ]
  outputs = [ "$target_gen_dir/cobalt/script/v8c/embedded_resources.h" ]

  args = [ "V8cEmbeddedResources" ] + rebase_path(outputs, root_build_dir) +
         rebase_path(sources, root_build_dir)
}

group("embed_v8c_resources_as_header_files") {
  public_configs = [ ":embed_v8c_resources_as_header_files_public_config" ]
  deps = [ ":embed_v8c_resources_as_header_files_action" ]
}

config("common_public_config") {
  if ((current_cpu == "arm64" || current_cpu == "x64") &&
      v8_enable_pointer_compression_override) {
    defines = [
      # enables pointer compression on 64 bit platforms for Cobalt.
      "V8_COMPRESS_POINTERS",
      "V8_31BIT_SMIS_ON_64BIT_ARCH",
    ]
  }
}

config("engine_all_dependent_config") {
  defines = [
    "ENGINE_SUPPORTS_INDEXED_DELETERS",
    "ENGINE_SUPPORTS_INT64",
  ]
}

static_library("engine") {
  check_includes = false

  sources = [
    "algorithm_helpers.cc",
    "algorithm_helpers.h",
    "callback_function_conversion.h",
    "cobalt_platform.cc",
    "cobalt_platform.h",
    "common_v8c_bindings_code.cc",
    "common_v8c_bindings_code.h",
    "conversion_helpers.cc",
    "conversion_helpers.h",
    "entry_scope.h",
    "interface_data.h",
    "isolate_fellowship.cc",
    "isolate_fellowship.h",
    "native_promise.h",
    "scoped_persistent.h",
    "stack_trace_helpers.cc",
    "switches.cc",
    "switches.h",
    "type_traits.h",
    "union_type_conversion_forward.h",
    "union_type_conversion_impl.h",
    "v8c_array_buffer.cc",
    "v8c_array_buffer.h",
    "v8c_array_buffer_view.cc",
    "v8c_array_buffer_view.h",
    "v8c_callback_function.h",
    "v8c_callback_interface.cc",
    "v8c_callback_interface.h",
    "v8c_callback_interface_holder.h",
    "v8c_data_view.cc",
    "v8c_data_view.h",
    "v8c_engine.cc",
    "v8c_engine.h",
    "v8c_exception_state.cc",
    "v8c_exception_state.h",
    "v8c_global_environment.cc",
    "v8c_global_environment.h",
    "v8c_heap_tracer.cc",
    "v8c_heap_tracer.h",
    "v8c_property_enumerator.h",
    "v8c_script_debugger.cc",
    "v8c_script_debugger.h",
    "v8c_script_value_factory.cc",
    "v8c_script_value_factory.h",
    "v8c_source_code.cc",
    "v8c_source_code.h",
    "v8c_tracing_controller.cc",
    "v8c_tracing_controller.h",
    "v8c_typed_arrays.cc",
    "v8c_typed_arrays.h",
    "v8c_user_object_holder.h",
    "v8c_value_handle.cc",
    "v8c_value_handle.h",
    "v8c_wrapper_handle.h",
    "wrapper_factory.cc",
    "wrapper_factory.h",
    "wrapper_private.cc",
    "wrapper_private.h",
  ]

  public_configs = [
    ":common_public_config",
    ":engine_all_dependent_config",
  ]

  deps = [
    ":embed_v8c_resources_as_header_files",
    "//cobalt/cache",
    "//cobalt/configuration",
    "//cobalt/script",
    "//nb",
    "//third_party/v8",
    "//third_party/v8:v8_libplatform",
    "//third_party/v8/third_party/inspector_protocol:crdtp",
  ]
}

target(final_executable_type, "v8c") {
  sources = [ "v8c.cc" ]

  public_configs = [ ":common_public_config" ]

  deps = [
    ":engine",
    "//cobalt/base",
    "//cobalt/script:script",
    "//cobalt/script:standalone_javascript_runner",
    "//third_party/v8",
    "//third_party/v8:v8_libplatform",
  ]
}
