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

  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",
    ]

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