#Only edit file in g3

project(
  'gPowerD',
  ['c', 'cpp'],
  version: '0.1',
  meson_version: '>=1.1.1',
  default_options: [
    'cpp_std=c++23',
    'c_std=c18',
  ],
)
# TODO: b/450349153 - dev builds should be build with NDEBUG undefined, and prod builds with
# NDEBUG defined. This will require a recipe change to set the flag correctly
# in the build environment
add_project_arguments('-DNDEBUG', language: 'cpp')

conf_data = configuration_data()
conf_data.set('LOAS3_AUTH_FLAG', 0)
loas_deps = []
if get_option('loas3-validation').enabled() or not get_option('tests').enabled()
  loas_deps += dependency('authentication_policy_validation')
  conf_data.set('LOAS3_AUTH_FLAG', 1)
endif

conf_data.set('INSECURE_MODE_FLAG', 0)
if get_option('insecure_mode').enabled()
  conf_data.set('INSECURE_MODE_FLAG', 1)
endif

conf_data.set('version', '1.1.1')
configure_file(input : 'gpowerd_build_config.h.in',
               output : 'gpowerd_build_config.h',
               configuration : conf_data)

safepower_include = include_directories('.')
subdir('proto')
cppc = meson.get_compiler('cpp')
safepower_deps = [
    gpowerd_proto,
    dependency('absl_base'),
    dependency('absl_statusor'),
    dependency('absl_flat_hash_set'),
    dependency('one')
]

boost = dependency('boost', modules: ['url'], version : '>=1.82.0', required : false, include_type: 'system')
safepower_deps += [boost]

daemon_context_lib = static_library(
  'daemon_context',
  'daemon_context.cc', 'disruption_manager.cc',
  include_directories: safepower_include,
  implicit_include_directories: false,
  dependencies: [
    safepower_deps,
  ],
  cpp_args: ['-fno-exceptions'],
)

daemon_context = declare_dependency(
  dependencies: safepower_deps,
  include_directories: safepower_include,
  link_with: [daemon_context_lib],
)

parse_text_proto_lib = static_library(
  'parse_text_proto',
  'parse_text_proto.cc',
  include_directories: safepower_include,
  implicit_include_directories: false,
  dependencies: [
    safepower_deps,
  ],
  cpp_args: ['-fno-exceptions'],
)

parse_text_proto = declare_dependency(
  dependencies: safepower_deps,
  include_directories: safepower_include,
  link_with: [parse_text_proto_lib],
)

proto_reader_lib = static_library(
  'proto_reader',
  'proto_reader.cc',
  include_directories: safepower_include,
  implicit_include_directories: false,
  dependencies: [
    safepower_deps,
  ],
  cpp_args: ['-fno-exceptions'],
)

proto_reader = declare_dependency(
  dependencies: safepower_deps,
  include_directories: safepower_include,
  link_with: [proto_reader_lib],
)

persistent_storage_lib = static_library(
  'persistent_storage_impl',
  'persistent_storage_impl.cc',
  include_directories: safepower_include,
  implicit_include_directories: false,
  dependencies: [
    safepower_deps,
    proto_reader,
    gpowerd_proto,
  ],
  cpp_args: ['-fno-exceptions'],
)

persistent_storage = declare_dependency(
  dependencies: safepower_deps,
  include_directories: safepower_include,
  link_with: [persistent_storage_lib],
)

subdir('bmc')

libsafepower = static_library(
  'safepower_agent',
  'safepower_agent.cc',
  include_directories: safepower_include,
  implicit_include_directories: false,
  dependencies: [safepower_deps],
  cpp_args: ['-fno-exceptions'],
)

safepower = declare_dependency(
  dependencies: safepower_deps,
  include_directories: safepower_include,
  link_with: [libsafepower],
)

libstatic_state = static_library(
  'static_state',
  'static_state.cc',
  include_directories: safepower_include,
  implicit_include_directories: false,
  dependencies: [safepower_deps],
)
static_state = declare_dependency(
  dependencies: safepower_deps,
  include_directories: safepower_include,
  link_with: [libstatic_state],
)

libconvert_proto = static_library(
  'convert_proto',
  'convert_proto.cc',
  include_directories: safepower_include,
  implicit_include_directories: false,
  dependencies: [safepower_deps],
)
convert_proto = declare_dependency(
  dependencies: safepower_deps,
  include_directories: safepower_include,
  link_with: [libconvert_proto],
)

libaction_context = static_library(
  'action_context',
  'action_context.cc',
  include_directories: safepower_include,
  implicit_include_directories: false,
  dependencies: [safepower_deps, convert_proto],
)
action_context = declare_dependency(
  dependencies: safepower_deps,
  include_directories: safepower_include,
  link_with: [libaction_context],
)

libstate_merge = static_library(
  'state_merge',
  'state_merge.cc',
  include_directories: safepower_include,
  implicit_include_directories: false,
  dependencies: [safepower_deps],
)
state_merge = declare_dependency(
  dependencies: safepower_deps,
  include_directories: safepower_include,
  link_with: [libstate_merge],
)

libcondition = static_library(
  'condition',
  'condition.cc',
  include_directories: safepower_include,
  implicit_include_directories: false,
  dependencies: [safepower_deps],
)
condition = declare_dependency(
  dependencies: safepower_deps,
  include_directories: safepower_include,
  link_with: [libcondition],
)

libcallback_manager = static_library(
  'callback_manager',
  'callback_manager.cc',
  include_directories: safepower_include,
  implicit_include_directories: false,
  dependencies: [safepower_deps],
)
callback_manager = declare_dependency(
  dependencies: safepower_deps,
  include_directories: safepower_include,
  link_with: [libcallback_manager],
)

grpcpp_auth = dependency('libgrpc++_authorization_provider', required: false)
if not grpcpp_auth.found()
  grpcpp_auth = cppc.find_library('libgrpc++_authorization_provider', dirs: '/usr/local/lib')
endif

gpowerd_deps = [
  loas_deps,
  parse_text_proto,
  safepower,
  safepower_deps,
  scheduler,
  proto_reader,
  gmi_reader,
  auth_bmc,
  grpcpp_auth,
  action_context,
  persistent_storage,
  daemon_context,
  daemon_context_bmc,
  state_merge,
  http_connection_bmc,
  redfish_bmc,
  convert_proto,
  condition,
  state_monitor_bmc,
  dependency('openssl'),
  register_actions_bmc,
  bmc_deps,
  static_state,
  callback_manager,
 ]

executable(
  'gpowerd',
  'bmc/gpowerd.cc',
  implicit_include_directories: false,
  dependencies: gpowerd_deps,
  include_directories: safepower_include,
  install:true)

build_tests = get_option('tests')
gtest = dependency('gtest', main: true, disabler: true, required: build_tests)
gmock = dependency('gmock', disabler: true, required: build_tests)

tests = [
  'bmc/scheduler_bmc_test',
  'bmc/gmi_reader_test',
  'persistent_storage_impl_test',
  'bmc/daemon_context_bmc_test',
  'bmc/http_connection_test',
  'bmc/register_actions_bmc_test',
]


foreach t : tests
  test(t, executable(t.underscorify(), t + '.cc',
                     implicit_include_directories: false,
                     dependencies: [
                       gtest,
                       gmock,
                       safepower,
                       scheduler,
                       proto_reader,
                       gmi_reader,
                       persistent_storage,
                       gpowerd_proto,
                       daemon_context,
                       daemon_context_bmc,
                       http_connection_bmc,
                       redfish_bmc,
                       dependency('openssl'),
                       boost,
                       state_monitor_bmc,
                       state_merge,
                       register_actions_bmc,
                       action_context,
                       condition,
                       parse_text_proto,
                       static_state,
                       callback_manager,
                     ],
                     cpp_args: ['-fexceptions'],  # Enable exceptions
                     include_directories: [safepower_include, 'bmc/.']))
endforeach
