# 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.

import("//starboard/build/config/os_definitions.gni")

_elf_loader_sources = [
  "dynamic_section.cc",
  "dynamic_section.h",
  "elf_hash_table.cc",
  "elf_hash_table.h",
  "elf_header.cc",
  "elf_header.h",
  "elf_loader.cc",
  "elf_loader.h",
  "exported_symbols.cc",
  "file.h",
  "file_impl.cc",
  "file_impl.h",
  "gnu_hash_table.cc",
  "gnu_hash_table.h",
  "lz4_file_impl.cc",
  "lz4_file_impl.h",
  "program_table.cc",
  "program_table.h",
  "relocations.cc",
  "relocations.h",
]

config("elf_loader_config") {
  include_dirs = [
    "src/include",
    "src/src",
  ]
}

static_library("elf_loader") {
  sources = _elf_loader_sources + [
              "elf_loader_impl.cc",
              "elf_loader_impl.h",
            ]

  configs += [ ":elf_loader_config" ]

  deps = [
    ":constants",
    ":evergreen_config",
    ":evergreen_info",
    "//starboard:starboard_group",
    "//starboard/common",
    "//starboard/shared/modular:starboard_layer_posix_abi_wrappers",
    "//third_party/lz4_lib:lz4",
  ]
}

if (sb_is_evergreen_compatible && current_toolchain == starboard_toolchain) {
  static_library("elf_loader_sys") {
    # System loader based on dlopen/dlsym.
    # Should be used only for debugging/troubleshooting.
    sources = _elf_loader_sources + [
                "elf_loader_impl.h",
                "elf_loader_sys_impl.cc",
                "elf_loader_sys_impl.h",
              ]

    configs += [ ":elf_loader_config" ]

    deps = [
      ":constants",
      ":evergreen_config",
      ":evergreen_info",
      "//starboard:starboard_group",
      "//starboard/common",
      "//starboard/shared/modular:starboard_layer_posix_abi_wrappers",
      "//third_party/crashpad/wrapper",
    ]
  }
}

# TODO: b/309493306 - Stop building evergreen targets for all non-evergreen platforms.
if (current_toolchain == starboard_toolchain && !is_host_win) {
  target(starboard_level_final_executable_type, "elf_loader_sandbox") {
    data_deps = [ "//third_party/icu:icudata" ]
    if (cobalt_font_package == "empty") {
      data_deps += [ "//cobalt/content/fonts:copy_font_data" ]
    } else {
      data_deps += [
        "//cobalt/content/fonts:copy_fonts",
        "//cobalt/content/fonts:fonts_xml",
      ]
    }

    sources = [ "elf_loader_sandbox.cc" ]
    configs += [ ":elf_loader_config" ]

    deps = [
      ":constants",
      ":elf_loader",
      ":evergreen_info",
      ":sabi_string",
      "//cobalt/content/fonts:copy_font_data",
      "//starboard:starboard_group",
    ]

    if (!sb_is_evergreen_compatible) {
      deps += [ "//third_party/crashpad/wrapper:wrapper_stub" ]
    }
    if (sb_is_evergreen_compatible && sb_evergreen_compatible_package) {
      deps += [ "//starboard/loader_app:copy_crashpad_handler_named_as_so" ]
    }
  }
}

if (sb_is_evergreen_compatible && current_toolchain == starboard_toolchain) {
  target(final_executable_type, "elf_loader_sys_sandbox") {
    # To properly function the system loader requires the starboard
    # symbols to be exported from the binary.
    # To allow symbols to be exported remove the '-fvisibility=hidden' flag
    # from your BUILD.gn. For Linux this would be:
    #   starboard/linux/shared/platform_configuration/BUILD.gn
    # Example run:
    # export LD_LIBRARY_PATH=.
    # ./elf_loader_sys_sandbox --evergreen_library=app/cobalt/lib/libcobalt.so --evergreen_content=app/cobalt/content
    sources = [ "elf_loader_sandbox.cc" ]
    configs += [ ":elf_loader_config" ]

    starboard_syms_path =
        rebase_path("//starboard/starboard.syms", root_build_dir)
    ldflags = [
      "-Wl,--dynamic-list=$starboard_syms_path",
      "-ldl",
    ]

    deps = [
      ":constants",
      ":elf_loader_sys",
      ":evergreen_info",
      ":sabi_string",
      "//starboard:starboard_group",
    ]
  }
}

# TODO: b/309493306 - Stop building evergreen targets for all non-evergreen platforms.
if (current_toolchain == starboard_toolchain && !is_host_win) {
  target(starboard_level_gtest_target_type, "elf_loader_test") {
    testonly = true
    build_loader = false

    sources = [ "//starboard/common/test_main.cc" ]
    deps = [
      "//starboard:starboard_with_main",
      "//testing/gmock",
      "//testing/gtest",
    ]

    if (target_cpu == "x86" || target_cpu == "x64" || target_cpu == "arm" ||
        target_cpu == "arm64") {
      sources += [
        "dynamic_section_test.cc",
        "elf_header_test.cc",
        "elf_loader_test.cc",
        "lz4_file_impl_test.cc",
        "program_table_test.cc",
        "relocations_test.cc",
      ]
      deps += [
        ":copy_elf_loader_testdata",
        ":elf_loader",
      ]

      data_deps = [ ":copy_elf_loader_testdata" ]
    }
  }
}

copy("copy_elf_loader_testdata") {
  install_content = true
  sources = [
    "testdata/compressed.lz4",
    "testdata/compressed_no_content_size.lz4",
    "testdata/uncompressed",
  ]
  subdir = "starboard/elf_loader"
  outputs = [ "$sb_static_contents_output_data_dir/test/$subdir/{{source_target_relative}}" ]
}

static_library("constants") {
  sources = [
    "elf_loader_constants.cc",
    "elf_loader_constants.h",
  ]
  deps = [ "//starboard:starboard_headers_only" ]
}

static_library("evergreen_info") {
  sources = [
    "evergreen_info.cc",
    "evergreen_info.h",
  ]

  public_deps = [ "//starboard/common" ]
}

static_library("evergreen_config") {
  sources = [
    "evergreen_config.cc",
    "evergreen_config.h",
  ]

  public_deps = [ "//starboard/common" ]
}

static_library("sabi_string") {
  sources = [
    "sabi_string.cc",
    "sabi_string.h",
  ]

  deps = [ "//starboard/common" ]
}
