# Copyright (C) 2019 The Android Open Source Project
#
# 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("../../../gn/perfetto.gni")
import("../../../gn/test.gni")

source_set("symbolizer") {
  public_deps = [ "../../../include/perfetto/ext/base" ]
  deps = [ "../../../gn:default_deps" ]
  sources = [
    "breakpad_parser.cc",
    "breakpad_parser.h",
    "breakpad_symbolizer.cc",
    "breakpad_symbolizer.h",
    "elf.h",
    "filesystem.h",
    "filesystem_posix.cc",
    "filesystem_windows.cc",
    "local_symbolizer.cc",
    "local_symbolizer.h",
    "subprocess.h",
    "subprocess_posix.cc",
    "subprocess_windows.cc",
    "symbolizer.cc",
    "symbolizer.h",
  ]
}

if (enable_perfetto_trace_processor) {
  source_set("symbolize_database") {
    public_deps = [
      ":symbolizer",
      "../../../include/perfetto/ext/base",
    ]
    deps = [
      "../../../gn:default_deps",
      "../../../include/perfetto/protozero",
      "../../../include/perfetto/trace_processor:trace_processor",
      "../../../protos/perfetto/trace:zero",
      "../../../protos/perfetto/trace/profiling:zero",
      "../../trace_processor/util:build_id",
    ]
    sources = [
      "symbolize_database.cc",
      "symbolize_database.h",
    ]
  }
}

if (enable_perfetto_llvm_symbolizer) {
  _llvm_flags_output =
      exec_script("../../../tools/get_llvm_flags.py", [], "scope")

  assert(
      _llvm_flags_output != [],
      "llvm-config not found, but enable_perfetto_llvm_symbolizer is true. Please install a recent LLVM development package (e.g., 'apt install llvm-dev') and ensure llvm-config is in your PATH.")

  shared_library("llvm_symbolizer_wrapper") {
    sources = [ "llvm_symbolizer_wrapper.cc" ]
    public_deps = [ ":llvm_symbolizer_c_api" ]
    deps = [ "../../../gn:default_deps" ]

    libs = _llvm_flags_output.libs
    ldflags = _llvm_flags_output.ldflags
    cflags = _llvm_flags_output.cflags
    defines = _llvm_flags_output.defines

    cflags += [ "-fvisibility=hidden" ]  # Not currently necessary, but good for
                                         # future-proofing.
  }
  source_set("llvm_symbolizer_c_api") {
    sources = [ "llvm_symbolizer_c_api.h" ]
    deps = [ "../../../gn:default_deps" ]
  }

  source_set("llvm_symbolizer") {
    sources = [
      "llvm_symbolizer.cc",
      "llvm_symbolizer.h",
    ]
    deps = [
      ":llvm_symbolizer_c_api",
      "../../../gn:default_deps",
      "../../../include/perfetto/ext/base",
    ]
    libs = [ "dl" ]
    visibility = [
      "../../../buildtools/*",
      "../../src/trace_processor/*",
      "../../trace_processor/perfetto_sql/intrinsics/functions",
      "./*",
    ]
  }
}

perfetto_unittest_source_set("unittests") {
  testonly = true
  deps = [
    ":symbolizer",
    "../../../gn:default_deps",
    "../../../gn:gtest_and_gmock",
    "../../base:test_support",
  ]
  sources = [
    "breakpad_parser_unittest.cc",
    "breakpad_symbolizer_unittest.cc",
    "local_symbolizer_unittest.cc",
  ]
  if (enable_perfetto_llvm_symbolizer) {
    sources += [ "llvm_symbolizer_unittest.cc" ]
    deps += [ ":llvm_symbolizer" ]
    data_deps = [ ":llvm_symbolizer_wrapper" ]
  }
}
