# Copyright 2021 Google LLC
#
# 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.

project(
  'nemora-postd',
  'cpp',
  version: '0.1',
  default_options: [
    'warning_level=3',
    'werror=true',
    'cpp_std=c++20'
  ],
)

protobuf = dependency('protobuf')
phosphor_dbus_interfaces = dependency('phosphor-dbus-interfaces')
sdbusplus = dependency('sdbusplus')
threads = dependency('threads')
logging = dependency('phosphor-logging')
fmt = declare_dependency(compile_args: '-DFMT_STRING_ALIAS=1', dependencies: dependency('fmt'))

protoc = find_program('protoc', native: true)

proto = custom_target(
  'event_message_proto',
  command: [
    find_program('protoc', native: true),
    '--proto_path=@CURRENT_SOURCE_DIR@',
    '--cpp_out=@OUTDIR@',
    '@INPUT@'
  ],
  output: [
    'event_message.pb.cc',
    'event_message.pb.h',
  ],
  input: 'event_message.proto')

executable(
  'nemora-postd',
  'nemorad.cpp',
  'src/host_manager.cpp',
  'src/nemora.cpp',
  'src/socket_manager.cpp',
  'src/serializer.cpp',
  proto,
  include_directories: include_directories('.'),
  dependencies: [protobuf, phosphor_dbus_interfaces, sdbusplus, threads, logging, fmt],
  install: true
)


