1# See README.md for details. 2project('openpower-hw-diags', 'cpp', 3 version: '0.1', meson_version: '>=1.1.1', 4 default_options: [ 5 'warning_level=3', 6 'werror=true', 7 'cpp_std=c++23', 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 73libpldm_dep = dependency('libpldm') 74 75pthread = declare_dependency(link_args : '-pthread') 76lrt = declare_dependency(link_args : '-lrt') 77 78# JSON parser 79if cmplr.has_header('nlohmann/json.hpp') 80 nlohmann_json_dep = declare_dependency() 81else 82 subproject('nlohmann', required: false) 83 nlohmann_json_dep = declare_dependency( 84 include_directories: [ 85 'subprojects/nlohmann/single_include', 86 'subprojects/nlohmann/single_include/nlohmann', 87 ] 88 ) 89 nlohmann_json_dep = nlohmann_json_dep.as_system('system') 90endif 91 92# JSON validator 93if cmplr.has_header('valijson/validator.hpp') 94 valijson_dep = declare_dependency() 95else 96 subproject('valijson', required: false) 97 valijson_dep = declare_dependency( 98 include_directories: 'subprojects/valijson/include' 99 ) 100 valijson_dep = valijson_dep.as_system('system') 101endif 102 103#------------------------------------------------------------------------------- 104# Build the local static libraries 105#------------------------------------------------------------------------------- 106 107subdir('analyzer') 108subdir('attn') 109subdir('util') 110 111hwdiags_libs = [ 112 analyzer_lib, 113 attn_lib, 114 util_lib, 115] 116 117#------------------------------------------------------------------------------- 118# Build the executable 119#------------------------------------------------------------------------------- 120 121no_listener_mode = get_option('nlmode') 122 123if not no_listener_mode.disabled() 124 executable('openpower-hw-diags', 125 sources : [ 'main_nl.cpp', 'cli.cpp', buildinfo, plugins_src ], 126 dependencies : [ libhei_dep ], 127 link_with : hwdiags_libs, 128 install : true) 129else 130 executable('openpower-hw-diags', 131 sources : [ 'main.cpp', 'cli.cpp', 'listener.cpp', buildinfo, 132 plugins_src ], 133 dependencies : [lrt, pthread, libhei_dep], 134 link_with : hwdiags_libs, 135 install : true) 136endif 137 138#------------------------------------------------------------------------------- 139# Test, if configured 140#------------------------------------------------------------------------------- 141 142build_tests = get_option('tests') 143 144if not build_tests.disabled() 145 146 # IMPORTANT NOTE: 147 # We cannot link the test executables to `util_lib` because: 148 # - It is built without `-DTEST_TRACE` and any of the util functions that 149 # use `trace.hpp` will throw a linker error because we don't have access 150 # to phosphor-logging in test ... yet. This issue will go away once we 151 # have converted all of our trace to use the `lg2` interfaces. 152 # - Some functions related to pdbg and dbus simply cannot be built in the 153 # test environment. Instead, there are alternate implementation of those 154 # functions to simulate them for testing (see `test/*-sim-only.cpp`). 155 # Instead we will build a `test_util_lib` that will contain the `util` files 156 # that we need in test along with simulated versions of some util functions. 157 158 # IMPORTANT NOTE: 159 # When running GCOV reports, the Jenkins CI script explicitly ignores any 160 # libraries and executables built in the `test/` directory. Therefore, this 161 # `test_util_lib` library must be built here instead in order to get any GCOV 162 # credit for the code. 163 164 test_args = [ 165 '-DTEST_TRACE', 166 package_args, 167 ] 168 169 test_util_srcs = [ 170 files( 171 'util/data_file.cpp', 172 'util/ffdc_file.cpp', 173 'util/pdbg.cpp', 174 'util/temporary_file.cpp', 175 'test/dbus-sim-only.cpp', 176 'test/pdbg-sim-only.cpp', 177 ), 178 ] 179 180 test_util_deps = [ 181 libhei_dep, 182 libpdbg_dep, 183 phosphor_logging_dep, 184 ] 185 186 test_util_lib = static_library('test_util_lib', 187 sources : test_util_srcs, 188 include_directories : incdir, 189 dependencies : test_util_deps, 190 cpp_args : test_args, 191 install : true, 192 ) 193 194 test_libs = [ 195 analyzer_lib, 196 attn_lib, 197 test_util_lib, 198 ] 199 200 subdir('test') 201endif 202