# Copyright (C) 2021 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.

# This meson project only supports the Perfetto SDK
# available from release branches.
# https://perfetto.dev/docs/instrumentation/tracing-sdk

project(
    'perfetto',
    ['cpp'],
    default_options: ['cpp_std=c++17']
)

fs = import('fs')

if not fs.is_dir('sdk')
    error('sdk dir not found, please checkout a release tag, e.g. v14.0')
endif

cpp = meson.get_compiler('cpp')

deps_perfetto = [dependency('threads')]

if host_machine.system() == 'android'
  deps_perfetto += cpp.find_library('log')
endif

lib_perfetto = static_library(
    'perfetto',
    sources: 'sdk/perfetto.cc',
    dependencies: deps_perfetto,
    install: true,
)

inc_perfetto = include_directories('sdk')

dir_perfetto_trace = join_paths(meson.current_source_dir(),
                                'protos/perfetto/trace')

install_data(dir_perfetto_trace / 'perfetto_trace.proto')

dep_perfetto = declare_dependency(
    link_with: lib_perfetto,
    include_directories: inc_perfetto,
    variables: {
        'pkgdatadir': dir_perfetto_trace,
    }
)
