xref: /openbmc/libpldm/meson.build (revision 9d2a1c6a)
1project('libpldm', ['c','cpp'],
2    default_options: [
3      'debug=true',
4      'optimization=g',
5      'warning_level=3',
6      'werror=true',
7      'cpp_std=c++20',
8      'c_std=c17',
9      'tests=' + (meson.is_subproject() ? 'disabled' : 'enabled'),
10    ],
11    version: '0.2.0',
12    meson_version: '>=0.63.0',
13)
14
15add_project_arguments('-D_DEFAULT_SOURCE', language: ['c'])
16
17compiler = meson.get_compiler('c')
18conf = configuration_data()
19if compiler.has_header('poll.h')
20  conf.set('PLDM_HAS_POLL', 1)
21endif
22
23# ABI control
24visible =  '__attribute__((visibility("default")))'
25if get_option('abi').contains('deprecated')
26  conf.set('LIBPLDM_ABI_DEPRECATED', visible)
27  add_project_arguments('-DLIBPLDM_API_DEPRECATED', language: ['c', 'cpp'])
28else
29  conf.set('LIBPLDM_ABI_DEPRECATED', '')
30endif
31conf.set('LIBPLDM_ABI_STABLE', visible) # Always expose the stable symbols
32if get_option('abi').contains('testing')
33  conf.set('LIBPLDM_ABI_TESTING', visible)
34  add_project_arguments('-DLIBPLDM_API_TESTING', language: ['c', 'cpp'])
35else
36  conf.set('LIBPLDM_ABI_TESTING', '')
37endif
38
39libpldm_sources = files()
40subdir('src')
41
42libpldm_include_dir = ['.', 'include', 'src']
43libpldm_headers = files()
44libpldm_transport_headers = files()
45
46subdir('include/libpldm')
47
48libpldm = library(
49  'pldm',
50   libpldm_sources,
51   implicit_include_directories: false,
52   include_directories: libpldm_include_dir,
53   version: meson.project_version(),
54   gnu_symbol_visibility: 'hidden',
55   install: true
56   )
57
58install_headers(
59  libpldm_headers,
60  subdir:'libpldm'
61  )
62
63install_headers(
64  libpldm_transport_headers,
65  subdir:'libpldm/transport'
66  )
67
68libpldm_dep = declare_dependency(
69  include_directories: libpldm_include_dir,
70  link_with: libpldm)
71
72import('pkgconfig').generate(
73  name: 'libpldm',
74  description: 'PLDM protocol encode/decode C lib',
75  version: meson.project_version(),
76  libraries: libpldm)
77
78configure_file(output: 'config.h',
79  configuration: conf
80)
81
82if get_option('tests').enabled()
83  subdir('tests')
84
85  c_suite = meson.get_compiler('c').get_id()
86  cpp_suite = meson.get_compiler('cpp').get_id()
87
88  if get_option('abi-compliance-check').allowed() and c_suite == cpp_suite and c_suite == 'gcc'
89    host = host_machine.cpu_family()
90    baseline_dump = meson.project_source_root() / 'abi' / host / '@0@.dump'.format(c_suite)
91
92    abi_dumper = find_program('abi-dumper',
93                              native: true,
94                              required: get_option('abi-compliance-check'))
95    abi_compliance_checker = find_program('abi-compliance-checker',
96                                          native: true,
97                                          required: get_option('abi-compliance-check'))
98
99    test_abi_compliance = abi_dumper.found() and \
100                          abi_compliance_checker.found() and \
101                          import('fs').is_file(baseline_dump)
102
103    if test_abi_compliance
104      current_dump = custom_target('abi-dump',
105                               input: libpldm,
106                               output: 'current.dump',
107                               command: [ abi_dumper,
108                                          '-public-headers',
109                                          meson.project_source_root() / 'include',
110                                          '@INPUT@',
111                                          '-o',
112                                          '@OUTPUT@',
113                                          '-lver',
114                                          meson.project_version()])
115      abi_compliance = custom_target('abi-compliance',
116                                     input: [baseline_dump, current_dump],
117                                     output: 'abi-compliance',
118                                     command: [ abi_compliance_checker,
119                                                '-l',
120                                                meson.project_name(),
121                                                '-old',
122                                                '@INPUT0@',
123                                                '-new',
124                                                '@INPUT1@' ],
125                                                build_by_default: true)
126    endif
127  endif
128endif
129
130install_subdir('instance-db',
131               install_mode: 'r--r--r--',
132               install_dir: get_option('datadir') / meson.project_name())
133