meson.build (12670B)
1 project( 2 'taler-merchant', 3 'c', 4 license: 'AGPLv3', 5 meson_version: '>=1.1.0', 6 version: '1.5.12', 7 ) 8 9 cc = meson.get_compiler('c') 10 incdir = include_directories('src/include') 11 12 # Used to populate gnunet_private_config.h 13 private_config = configuration_data() 14 15 pkgcfgdir = get_option('datadir') / 'taler-merchant' / 'config.d' 16 docdir = get_option('datadir') / 'doc' / 'taler-merchant' 17 18 if get_option('install-rpath') 19 rpath_option = get_option('prefix') / get_option('libdir') 20 else 21 rpath_option = '' 22 endif 23 24 install_emptydir(docdir) 25 install_data('README', 'COPYING', install_dir: docdir) 26 27 gnunet_user = false 28 dpkg_architecture_bin = find_program( 29 'dpkg-architecture', 30 '/usr/bin/getent', 31 required: false, 32 ) 33 if dpkg_architecture_bin.found() 34 private_config.set( 35 'MULTIARCH', 36 dpkg_architecture_bin.full_path() + ' -qDEB_HOST_MULTIARCH', 37 ) 38 endif 39 40 TALER_PLUGIN_LDFLAGS = [ 41 '-export-dynamic', 42 '-avoid-version', 43 '-module', 44 '--no-undefined', 45 ] 46 47 cdata = configuration_data() 48 if not get_option('only-doc') 49 add_project_arguments( 50 '-Wall', 51 '-Wno-address-of-packed-member', 52 language: 'c', 53 ) 54 taler_lib_ldflags = '-export-dynamic -no-undefined' 55 56 check_headers = ['stdint.h', 'stdlib.h', 'string.h', 'unistd.h'] 57 58 foreach h : check_headers 59 if cc.check_header(h) 60 define = 'HAVE_' + h.underscorify().to_upper() 61 message(define) 62 private_config.set(define, 1) 63 endif 64 endforeach 65 66 67 mhd_dep = dependency('libmicrohttpd', required: false) 68 if not mhd_dep.found() 69 mhd_dep = cc.find_library('microhttpd', required: true) 70 endif 71 72 mhd2_dep = dependency('libmicrohttpd2', required: false) 73 if not mhd2_dep.found() 74 mhd_dep2 = cc.find_library('microhttpd2', required: false) 75 endif 76 77 json_dep = dependency('jansson', required: false) 78 if not json_dep.found() 79 json_dep = cc.find_library('jansson', required: true) 80 endif 81 82 gcrypt_dep = dependency('libgcrypt', required: false) 83 if not gcrypt_dep.found() 84 gcrypt_dep = cc.find_library('gcrypt', required: true) 85 endif 86 87 private_config.set_quoted('NEED_LIBGCRYPT_VERSION', '1.6.1') 88 89 gnunetutil_dep = dependency('gnunetutil', required: false) 90 if not gnunetutil_dep.found() 91 gnunetutil_dep = cc.find_library('gnunetutil', required: true) 92 endif 93 94 cc.has_header_symbol( 95 'gnunet/gnunet_util_lib.h', 96 'GNUNET_TIME_round_up', 97 dependencies: [gnunetutil_dep], 98 required: true, 99 ) 100 101 gnunetjson_dep = dependency('gnunetjson', required: false) 102 if not gnunetjson_dep.found() 103 gnunetjson_dep = cc.find_library('gnunetjson', required: true) 104 endif 105 106 gnunetmhd_dep = dependency('gnunetmhd', required: false) 107 if not gnunetmhd_dep.found() 108 gnunetmhd_dep = cc.find_library('gnunetmhd', required: true) 109 endif 110 cc.has_header_symbol( 111 'gnunet/gnunet_mhd_lib.h', 112 'GNUNET_MHD_post_parser', 113 dependencies: [gnunetmhd_dep], 114 required: true, 115 ) 116 117 curl_dep = dependency('libcurl', version: '>=7.34.0', required: false) 118 if not curl_dep.found() 119 curl_dep = cc.find_library('curl', required: true) 120 curl_version_check = '''#include <curl/curl.h> 121 int main(int argc, char **argv) { 122 #if LIBCURL_VERSION_NUM < 0x073400 123 #error "cURL version >= 7.34.0 required" 124 #endif 125 return 0; 126 } 127 ''' 128 if not cc.compiles( 129 curl_version_check, 130 name: 'cURL version check', 131 dependencies: curl_dep, 132 ) 133 error('cURL version >=7.34.0 required') 134 endif 135 endif 136 137 gnunetcurl_dep = dependency('gnunetcurl', required: false) 138 if not gnunetcurl_dep.found() 139 gnunetcurl_dep = cc.find_library('gnunetcurl', required: true) 140 endif 141 cc.has_header_symbol( 142 'gnunet/gnunet_curl_lib.h', 143 'GNUNET_CURL_get_select_info', 144 dependencies: [gnunetcurl_dep], 145 required: true, 146 ) 147 148 pq_dep = dependency('libpq', required: false) 149 if not pq_dep.found() 150 pq_dep = cc.find_library('pq', required: true) 151 endif 152 153 gnunetpq_dep = dependency('gnunetpq', required: false) 154 if not gnunetpq_dep.found() 155 gnunetpq_dep = cc.find_library('gnunetpq', required: true) 156 endif 157 cc.has_header_symbol( 158 'gnunet/gnunet_pq_lib.h', 159 'GNUNET_PQ_query_param_blind_sign_priv', 160 required: true, 161 dependencies: [pq_dep, gnunetpq_dep], 162 ) 163 private_config.set10('HAVE_GNUNETPQ', gnunetpq_dep.found()) 164 165 talerutil_dep = dependency('talerutil', required: false) 166 if not talerutil_dep.found() 167 talerutil_dep = cc.find_library('talerutil', required: true) 168 endif 169 cc.has_header_symbol( 170 'taler/taler_util.h', 171 'TALER_merchant_instance_auth_hash_with_salt', 172 required: true, 173 dependencies: [talerutil_dep], 174 ) 175 private_config.set10('HAVE_TALERUTIL', talerutil_dep.found()) 176 177 talercurl_dep = dependency('talercurl', required: false) 178 if not talercurl_dep.found() 179 talercurl_dep = cc.find_library('talercurl', required: true) 180 endif 181 talerkyclogic_dep = dependency('talerkyclogic', required: false) 182 if not talerkyclogic_dep.found() 183 talerkyclogic_dep = cc.find_library('talerkyclogic', required: true) 184 endif 185 talerbank_dep = dependency('talerbank', required: false) 186 if not talerbank_dep.found() 187 talerbank_dep = cc.find_library('talerbank', required: true) 188 endif 189 talerfakebank_dep = dependency('talerfakebank', required: false) 190 if not talerfakebank_dep.found() 191 talerfakebank_dep = cc.find_library('talerfakebank', required: false) 192 endif 193 talertemplating_dep = dependency('talertemplating', required: false) 194 if not talertemplating_dep.found() 195 talertemplating_dep = cc.find_library('talertemplating', required: true) 196 endif 197 talertesting_dep = dependency('talertesting', required: false) 198 if not talertesting_dep.found() 199 talertesting_dep = cc.find_library('talertesting', required: true) 200 endif 201 202 talerexchange_dep = dependency('talerexchange', required: false) 203 if not talerexchange_dep.found() 204 talerexchange_dep = cc.find_library('talerexchange', required: true) 205 endif 206 cc.has_header_symbol( 207 'taler/taler_exchange_service.h', 208 'TALER_EXCHANGE_keys_test_account_allowed', 209 required: true, 210 dependencies: [talerexchange_dep], 211 ) 212 private_config.set10('HAVE_TALEREXCHANGE', talerexchange_dep.found()) 213 214 donau_dep = dependency('donau', required: false) 215 if not donau_dep.found() 216 donau_dep = cc.find_library('donau', required: true) 217 endif 218 cc.has_header_symbol( 219 'donau/donau_service.h', 220 'DONAU_get_keys', 221 required: true, 222 dependencies: [donau_dep], 223 ) 224 donaujson_dep = dependency('donaujson', required: false) 225 if not donaujson_dep.found() 226 donaujson_dep = cc.find_library('donaujson', required: true) 227 endif 228 donauutil_dep = dependency('donauutil', required: false) 229 if not donauutil_dep.found() 230 donauutil_dep = cc.find_library('donauutil', required: true) 231 endif 232 donautesting_dep = dependency('donautesting', required: false) 233 if not donautesting_dep.found() 234 donautesting_dep = cc.find_library('donautesting', required: true) 235 endif 236 private_config.set10('HAVE_DONAU', donau_dep.found()) 237 238 talermhd_dep = dependency('talermhd', required: false) 239 if not talermhd_dep.found() 240 talermhd_dep = cc.find_library('talermhd', required: true) 241 endif 242 cc.has_header_symbol( 243 'taler/taler_mhd_lib.h', 244 'TALER_MHD_parse_request_arg_rel_time', 245 required: true, 246 dependencies: [talermhd_dep], 247 ) 248 private_config.set10('HAVE_TALERMHD', talermhd_dep.found()) 249 250 251 talerjson_dep = dependency('talerjson', required: false) 252 if not talerjson_dep.found() 253 talerjson_dep = cc.find_library('talerjson', required: true) 254 endif 255 cc.has_header_symbol( 256 'taler/taler_json_lib.h', 257 'TALER_JSON_currency_specs_to_json', 258 required: true, 259 dependencies: [talerjson_dep], 260 ) 261 private_config.set10('HAVE_TALERJSON', talerjson_dep.found()) 262 263 264 talerpq_dep = dependency('talerpq', required: false) 265 if not talerpq_dep.found() 266 talerpq_dep = cc.find_library('talerpq', required: true) 267 endif 268 cc.has_header_symbol( 269 'taler/taler_pq_lib.h', 270 'TALER_PQ_query_param_array_blinded_denom_sig', 271 required: true, 272 dependencies: [talerpq_dep, pq_dep], 273 ) 274 private_config.set10('HAVE_TALERPQ', talerpq_dep.found()) 275 276 # todo talertwister optional 277 twister_dep = cc.find_library('talertwister', required: false) 278 if twister_dep.found() 279 private_config.set10( 280 'HAVE_TWISTER', 281 cc.has_header_symbol( 282 'taler/taler_twister_service.h', 283 'TALER_TWISTER_connect', 284 dependencies: [twister_dep], 285 ), 286 ) 287 endif 288 289 talertwistertesting_dep = dependency('talertwistertesting', required: false) 290 if not talertwistertesting_dep.found() 291 talertwistertesting_dep = cc.find_library( 292 'talertwistertesting', 293 required: false, 294 ) 295 endif 296 cc.has_header_symbol( 297 'taler/taler_twister_testing_lib.h', 298 'TALER_TWISTER_run_twister', 299 required: false, 300 dependencies: [talertwistertesting_dep], 301 ) 302 private_config.set10('HAVE_TWISTER', talertwistertesting_dep.found()) 303 qrencode_dep = dependency('qrencode', required: false) 304 if not qrencode_dep.found() 305 qrencode_dep = cc.find_library('qrencode', required: true) 306 endif 307 m_dep = cc.find_library('m', required: false) 308 if m_dep.found() 309 private_config.set('HAVE_LIBM', 1) 310 endif 311 312 313 logging_opt = get_option('logging') 314 logging_verbosity = 0 315 316 if logging_opt == 'yes' 317 logging_verbosity = 1 318 endif 319 if logging_opt == 'no' 320 add_project_arguments('-DGNUNET_CULL_LOGGING=1', language: 'c') 321 endif 322 if logging_opt == 'verbose' 323 logging_verbosity = 2 324 endif 325 if logging_opt == 'veryverbose' 326 logging_verbosity = 3 327 endif 328 329 #add_project_arguments('-DGNUNET_EXTRA_LOGGING=@0@'.format(logging_verbosity), language: 'c') 330 331 332 # todo gcov has meson builtin 333 334 # Used to populate configuration file and script templates 335 336 337 libltversions = [ 338 ['libtalermerchant', '9:0:1'], 339 ['libtalermerchantutil', '1:1:1'], 340 ['libtalermerchantbank', '0:1:0'], 341 ['libtalermerchantdb', '4:1:2'], 342 ['libtalermerchanttesting', '4:1:1'], 343 ] 344 345 solibversions = {} 346 347 foreach libversion : libltversions 348 ltversion = libversion[1].split(':') 349 current = ltversion[0].to_int() 350 revision = ltversion[1].to_int() 351 age = ltversion[2].to_int() 352 soversion_str = '@0@'.format(current - age) 353 ltversion_str = '@0@.@1@.@2@'.format(current - age, age, revision) 354 solibversions = solibversions + { 355 libversion[0]: { 356 'soversion': soversion_str, 357 'version': ltversion_str, 358 }, 359 } 360 endforeach 361 362 private_config.set_quoted('PACKAGE_VERSION', meson.project_version()) 363 # Compatibility. Used in source. 364 private_config.set_quoted('VERSION', meson.project_version()) 365 private_config.set_quoted('VCS_VERSION', 'mesonbuild') 366 private_config.set_quoted('PACKAGE_BUGREPORT', 'taler@gnu.org') 367 configure_file( 368 output: 'taler_merchant_config.h', 369 configuration: private_config, 370 ) 371 configuration_inc = include_directories('.') 372 373 cdata.merge_from(private_config) 374 add_project_arguments('-DHAVE_CONFIG_H', language: 'c') 375 376 pkg = import('pkgconfig') 377 subdir('contrib') 378 subdir('src') 379 if not get_option('disable-doc') 380 subdir('doc') 381 endif 382 383 taler_prefix = get_option('prefix') / get_option('libdir') 384 385 add_test_setup( 386 'default', 387 env: ['TALER_MERCHANT_PREFIX=' + taler_prefix], 388 exclude_suites: ['perf', 'installcheck', 'integrationtests'], 389 is_default: true, 390 ) 391 add_test_setup( 392 'all', 393 env: ['TALER_MERCHANT_PREFIX=' + taler_prefix], 394 ) 395 else 396 subdir('contrib') 397 if not get_option('disable-doc') 398 subdir('doc') 399 endif 400 endif 401 402 run_target( 403 'doxygen', 404 command: 'scripts/doxygen.meson.sh', 405 env: {'PACKAGE_VERSION': meson.project_version()}, 406 ) 407 #meson.add_dist_script('meson-dist-script') 408