# 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(
  'google-misc',
  'c',
  version: '0.1',
  meson_version: '>=1.1.1',
  default_options: [
    'warning_level=3',
    'werror=true',
    'cpp_std=c++23',
    'c_std=c18',
    'tests=' + (meson.is_subproject() ? 'disabled' : 'auto'),
  ])

# Dummy file to make code coverage happy
if get_option('tests').allowed()
  test('hello', executable('hello', 'hello.c'))
endif

# Meson has no feature option to str...
tests_str = get_option('tests').allowed() ? 'enabled' : 'disabled'
if get_option('tests').auto()
  tests_str = 'auto'
endif

# The ordering in this list intentionally lists dependencies higher than
# dependents to guarantee their tests are enabled
if not meson.is_subproject()
  subproject('acpi-power-state-daemon')
  subproject('ncsid', default_options: 'tests=' + tests_str)
  subproject('metrics-ipmi-blobs', default_options: 'tests=' + tests_str)
  subproject('nemora-postd')
  subproject('libcr51sign')
  subproject('dhcp-done')
  subproject('espi-control')
endif
