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

_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",
  "elf_loader_constants.cc",
  "elf_loader_constants.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 = [
    ":evergreen_config",
    ":evergreen_info",
    "//starboard",
    "//third_party/lz4_lib:lz4",
  ]
}

if (sb_is_evergreen_compatible) {
  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 = [
      ":evergreen_config",
      ":evergreen_info",
      "//starboard",
    ]

    if (sb_is_evergreen_compatible) {
      deps += [ "//third_party/crashpad/wrapper" ]
    } else {
      deps += [ "//third_party/crashpad/wrapper:wrapper_stub" ]
    }
  }
}

target(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 = [ "sandbox.cc" ]
  configs += [ ":elf_loader_config" ]

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

  # TODO: Remove this dependency once MediaSession is migrated to use CobaltExtensions.
  deps += cobalt_platform_dependencies

  if (!sb_is_evergreen_compatible) {
    deps += [ "//third_party/crashpad/wrapper:wrapper_stub" ]
  }
}

if (sb_is_evergreen_compatible) {
  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 = [ "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 = [
      ":elf_loader_sys",
      ":evergreen_info",
      ":sabi_string",
      "//starboard",
    ]

    if (!sb_is_evergreen_compatible) {
      deps += [ "//third_party/crashpad/wrapper:wrapper_stub" ]
    }
  }
}

target(gtest_target_type, "elf_loader_test") {
  testonly = true
  sources = [ "//starboard/common/test_main.cc" ]
  deps = [
    "//starboard",
    "//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",
    ]

    # TODO: Remove this dependency once MediaSession is migrated to use CobaltExtensions.
    deps += cobalt_platform_dependencies

    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("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" ]
}
