xref: /openbmc/openpower-hw-diags/meson.build (revision 4efca280)
1# See README.md for details.
2project('openpower-hw-diags', 'cpp',
3        version: '0.1', meson_version: '>=0.57.0',
4        default_options: [
5          'warning_level=3',
6          'werror=true',
7          'cpp_std=c++20',
8        ])
9
10# Package directory root, which will contain required data files.
11package_dir = join_paths( get_option('prefix'),
12                          get_option('datadir'),
13                          meson.project_name() )
14
15# Compiler option so that source knows the package directory.
16package_args = [ '-DPACKAGE_DIR="' + package_dir + '/"' ]
17
18#-------------------------------------------------------------------------------
19# Versioning
20#-------------------------------------------------------------------------------
21buildinfo = vcs_tag(command: ['git', 'describe', '--always', '--long'],
22                  input: 'buildinfo.hpp.in',
23                  output: 'buildinfo.hpp',
24                  replace_string:'@BUILDINFO@',
25                  fallback: '0')
26
27#-------------------------------------------------------------------------------
28# Compiler
29#-------------------------------------------------------------------------------
30
31cmplr = meson.get_compiler('cpp')
32
33#-------------------------------------------------------------------------------
34# Config file
35#-------------------------------------------------------------------------------
36
37conf = configuration_data()
38
39conf.set('CONFIG_PHAL_API', get_option('phal').enabled())
40
41configure_file(input: 'config.h.in', output: 'config.h', configuration: conf)
42
43#-------------------------------------------------------------------------------
44# Include directories
45#-------------------------------------------------------------------------------
46
47# Only using the base directory. All header includes should provide the full
48# path from the base directory.
49incdir = include_directories('.')
50
51#-------------------------------------------------------------------------------
52# External library dependencies
53#-------------------------------------------------------------------------------
54
55# Look if the libhei library has already been built and installed. If not,
56# default to the subproject.
57libhei_dep = dependency('hei', fallback : ['libhei', 'libhei_dep'])
58
59phosphor_logging_dep = dependency('phosphor-logging',
60    fallback: ['phosphor-logging', 'phosphor_logging_dep'])
61
62sdbusplus_dep       = dependency('sdbusplus', version : '>=1.0')
63dbus_interfaces_dep = dependency('phosphor-dbus-interfaces')
64
65libpdbg_dep = cmplr.find_library('pdbg')
66
67fmt_dep = dependency('fmt')
68
69if get_option('phal').enabled()
70  libphal_dep = cmplr.find_library('phal')
71endif
72
73pthread = declare_dependency(link_args : '-pthread')
74lrt = declare_dependency(link_args : '-lrt')
75
76# JSON parser
77if cmplr.has_header('nlohmann/json.hpp')
78    nlohmann_json_dep = declare_dependency()
79else
80    subproject('nlohmann', required: false)
81    nlohmann_json_dep = declare_dependency(
82        include_directories: [
83            'subprojects/nlohmann/single_include',
84            'subprojects/nlohmann/single_include/nlohmann',
85        ]
86    )
87    nlohmann_json_dep = nlohmann_json_dep.as_system('system')
88endif
89
90# JSON validator
91if cmplr.has_header('valijson/validator.hpp')
92    valijson_dep = declare_dependency()
93else
94    subproject('valijson', required: false)
95    valijson_dep = declare_dependency(
96        include_directories: 'subprojects/valijson/include'
97    )
98    valijson_dep = valijson_dep.as_system('system')
99endif
100
101#-------------------------------------------------------------------------------
102# Build the local static libraries
103#-------------------------------------------------------------------------------
104
105subdir('analyzer')
106subdir('attn')
107subdir('util')
108
109hwdiags_libs = [
110    analyzer_lib,
111    attn_lib,
112    util_lib,
113]
114
115#-------------------------------------------------------------------------------
116# Build the executable
117#-------------------------------------------------------------------------------
118
119no_listener_mode = get_option('nlmode')
120
121if not no_listener_mode.disabled()
122  executable('openpower-hw-diags',
123              sources : [ 'main_nl.cpp', 'cli.cpp', buildinfo, plugins_src ],
124              dependencies : [ libhei_dep ],
125              link_with : hwdiags_libs,
126              install : true)
127else
128  executable('openpower-hw-diags',
129              sources : [ 'main.cpp', 'cli.cpp', 'listener.cpp', buildinfo,
130                          plugins_src ],
131              dependencies : [lrt, pthread, libhei_dep],
132              link_with : hwdiags_libs,
133              install : true)
134endif
135
136#-------------------------------------------------------------------------------
137# Test, if configured
138#-------------------------------------------------------------------------------
139
140build_tests = get_option('tests')
141
142if not build_tests.disabled()
143
144  # IMPORTANT NOTE:
145  # We cannot link the test executables to `util_lib` because:
146  #   - It is built without `-DTEST_TRACE` and any of the util functions that
147  #     use `trace.hpp` will throw a linker error because we don't have access
148  #     to phosphor-logging in test ... yet. This issue will go away once we
149  #     have converted all of our trace to use the `lg2` interfaces.
150  #   - Some functions related to pdbg and dbus simply cannot be built in the
151  #     test environment. Instead, there are alternate implementation of those
152  #     functions to simulate them for testing (see `test/*-sim-only.cpp`).
153  # Instead we will build a `test_util_lib` that will contain the `util` files
154  # that we need in test along with simulated versions of some util functions.
155
156  # IMPORTANT NOTE:
157  # When running GCOV reports, the Jenkins CI script explicitly ignores any
158  # libraries and executables built in the `test/` directory. Therefore, this
159  # `test_util_lib` library must be built here instead in order to get any GCOV
160  # credit for the code.
161
162  test_args = [
163    '-DTEST_TRACE',
164    package_args,
165  ]
166
167  test_util_srcs = [
168    files(
169      'util/data_file.cpp',
170      'util/ffdc_file.cpp',
171      'util/pdbg.cpp',
172      'util/temporary_file.cpp',
173      'test/dbus-sim-only.cpp',
174      'test/pdbg-sim-only.cpp',
175    ),
176  ]
177
178  test_util_deps = [
179    libhei_dep,
180    libpdbg_dep,
181    phosphor_logging_dep,
182  ]
183
184  test_util_lib = static_library('test_util_lib',
185    sources             : test_util_srcs,
186    include_directories : incdir,
187    dependencies        : test_util_deps,
188    cpp_args            : test_args,
189    install             : true,
190  )
191
192  test_libs = [
193    analyzer_lib,
194    attn_lib,
195    test_util_lib,
196  ]
197
198  subdir('test')
199endif
200