# Copyright 2014 PDFium 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/sanitizers/sanitizers.gni")
import("../pdfium.gni")

group("samples") {
  testonly = true
  deps = [
    ":pdfium_test",
  ]
}

config("pdfium_samples_config") {
  cflags = []
  ldflags = []
  defines = [
    "PNG_PREFIX",
    "PNG_USE_READ_MACROS",
  ]
  include_dirs = [ ".." ]
  if (pdf_use_skia) {
    defines += [ "PDF_ENABLE_SKIA" ]
  } else if (pdf_use_skia_paths) {
    defines += [ "PDF_ENABLE_SKIA_PATHS" ]
  }
  if (is_asan) {
    defines += [ "PDF_ENABLE_ASAN" ]
  }

  if (enable_callgrind) {
    defines += [ "ENABLE_CALLGRIND" ]
  }
}

executable("pdfium_test") {
  testonly = true
  sources = [
    "pdfium_test.cc",
    "pdfium_test_dump_helper.cc",
    "pdfium_test_dump_helper.h",
    "pdfium_test_event_helper.cc",
    "pdfium_test_event_helper.h",
    "pdfium_test_write_helper.cc",
    "pdfium_test_write_helper.h",
  ]

  # Note: One should write programs that depend on ../:pdfium. Whereas this
  # sample program does not set a good example, and depends on PDFium internals,
  # as well as test support code, for convenience.
  deps = [
    "../:pdfium_public_headers",
    "../fpdfsdk",
    "../testing/:test_support",
    "../testing/image_diff",
    "../third_party:pdfium_base",
    "//build/win:default_exe_manifest",
  ]
  configs += [ ":pdfium_samples_config" ]

  if (pdf_enable_v8) {
    deps += [
      "//v8:v8_headers",
      "//v8:v8_libplatform",
    ]
    include_dirs = [ "//v8" ]
    configs += [ "//v8:external_startup_data" ]
  }
  if (pdf_use_skia || pdf_use_skia_paths) {
    deps += [ "//skia" ]
  }
}
