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

import("//build/config/win/manifest.gni")
import("//chrome/version.gni")
import("//testing/test.gni")

process_version("chrome_elf_resources") {
  template_file = chrome_version_rc_template
  sources = [
    "chrome_elf.ver",
  ]
  output = "$target_gen_dir/chrome_elf_version.rc"
}

# This manifest matches what GYP produces. It may not even be necessary.
windows_manifest("chrome_elf_manifest") {
  sources = [
    as_invoker_manifest,
  ]
  type = "dll"
}

shared_library("chrome_elf") {
  sources = [
    "chrome_elf_main.cc",
    "chrome_elf_main.h",
  ]
  deps = [
    ":blacklist",
    ":breakpad",
    ":chrome_elf_manifest",
    ":lib",
    ":chrome_elf_resources",
    "//build/config/sanitizers:deps",
  ]
  configs += [ "//build/config/win:windowed" ]
  configs -= [ "//build/config/win:console" ]
  ldflags = [
    "/NODEFAULTLIB:user32.lib",
    "/DEF:" + rebase_path("chrome_elf.def"),
  ]
  if (current_cpu == "x86") {
    # Don"t set an x64 base address (to avoid breaking HE-ASLR).
    ldflags += [ "/BASE:0x01c20000" ]
  }
}

source_set("lib") {
  sources = [
    "create_file/chrome_create_file.cc",
    "create_file/chrome_create_file.h",
    "ntdll_cache.cc",
    "ntdll_cache.h",
  ]
  deps = [
    ":common",
    "//base:base_static",
    "//sandbox",
  ]
}

source_set("constants") {
  sources = [
    "chrome_elf_constants.cc",
    "chrome_elf_constants.h",
  ]
}

source_set("common") {
  deps = [
    ":constants",
  ]
  sources = [
    "chrome_elf_types.h",
    "chrome_elf_util.cc",
    "chrome_elf_util.h",
    "thunk_getter.cc",
    "thunk_getter.h",
  ]
}

source_set("breakpad") {
  include_dirs = [ "$target_gen_dir" ]
  sources = [
    "breakpad.cc",
    "breakpad.h",
  ]
  deps = [
    ":common",
    "//breakpad:breakpad_handler",
    "//chrome/common:version_header",
  ]
}

if (is_component_build) {
  shared_library("chrome_redirects") {
    sources = [
      "chrome_redirects_main.cc",
    ]
    deps = [
      ":lib",
      "//build/config/sanitizers:deps",
    ]
    configs += [ "//build/config/win:windowed" ]
    ldflags = [ "/DEF:" + rebase_path("chrome_redirects.def") ]

    if (current_cpu == "x86") {
      # Don't set an x64 base address (to avoid breaking HE-ASLR).
      ldflags += [ "/BASE:0x01c20000" ]
    }
  }
}

source_set("dll_hash") {
  deps = [
    "//base",
  ]
  sources = [
    "dll_hash/dll_hash.cc",
    "dll_hash/dll_hash.h",
  ]
}

executable("dll_hash_main") {
  sources = [
    "dll_hash/dll_hash_main.cc",
  ]
  deps = [
    ":dll_hash",
    "//build/config/sanitizers:deps",
  ]
}

static_library("blacklist") {
  sources = [
    "blacklist/blacklist.cc",
    "blacklist/blacklist.h",
    "blacklist/blacklist_interceptions.cc",
    "blacklist/blacklist_interceptions.h",
  ]
  deps = [
    # Depend on base_static, but do NOT take a dependency on base.gyp:base
    # as that would risk pulling in base's link-time dependencies which
    # chrome_elf cannot do.
    ":breakpad",
    ":constants",
    "//base:base_static",
    "//sandbox:sandbox",
  ]
}

test("chrome_elf_unittests") {
  output_name = "chrome_elf_unittests"
  sources = [
    "blacklist/test/blacklist_test.cc",
    "chrome_elf_util_unittest.cc",
    "create_file/chrome_create_file_unittest.cc",
    "elf_imports_unittest.cc",
    "ntdll_cache_unittest.cc",
  ]
  include_dirs = [ "$target_gen_dir" ]
  deps = [
    ":blacklist",
    ":blacklist_test_main_dll",
    ":lib",
    "//base",
    "//base/test:run_all_unittests",
    "//base/test:test_support",
    "//sandbox",
    "//testing/gtest",
  ]
  data_deps = [
    ":blacklist_test_dll_1",
    ":blacklist_test_dll_2",
    ":blacklist_test_dll_3",
    ":chrome_elf",
    "//chrome",
  ]
}

shared_library("blacklist_test_main_dll") {
  sources = [
    "blacklist/test/blacklist_test_main_dll.cc",
  ]
  deps = [
    ":blacklist",
    "//base",
    "//build/config/sanitizers:deps",
  ]
  ldflags =
      [ "/DEF:" + rebase_path("blacklist/test/blacklist_test_main_dll.def",
                              root_build_dir) ]
}

shared_library("blacklist_test_dll_1") {
  sources = [
    "blacklist/test/blacklist_test_dll_1.cc",
  ]
  ldflags = [ "/DEF:" + rebase_path("blacklist/test/blacklist_test_dll_1.def",
                                    root_build_dir) ]
  deps = [
    "//build/config/sanitizers:deps",
  ]
}

shared_library("blacklist_test_dll_2") {
  sources = [
    "blacklist/test/blacklist_test_dll_2.cc",
  ]
  ldflags = [ "/DEF:" + rebase_path("blacklist/test/blacklist_test_dll_2.def",
                                    root_build_dir) ]
  deps = [
    "//build/config/sanitizers:deps",
  ]
}

shared_library("blacklist_test_dll_3") {
  sources = [
    "blacklist/test/blacklist_test_dll_3.cc",
  ]
  deps = [
    "//build/config/sanitizers:deps",
  ]
}