meson.build (12585B)
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: [ 273 talerpq_dep, 274 pq_dep, 275 ], 276 ) 277 private_config.set10('HAVE_TALERPQ', talerpq_dep.found()) 278 279 # todo talertwister optional 280 twister_dep = cc.find_library('talertwister', required: false) 281 if twister_dep.found() 282 private_config.set10( 283 'HAVE_TWISTER', 284 cc.has_header_symbol( 285 'taler/taler_twister_service.h', 286 'TALER_TWISTER_connect', 287 dependencies: [twister_dep], 288 ), 289 ) 290 endif 291 292 talertwistertesting_dep = dependency('talertwistertesting', required: false) 293 if not talertwistertesting_dep.found() 294 talertwistertesting_dep = cc.find_library( 295 'talertwistertesting', 296 required: false, 297 ) 298 endif 299 cc.has_header_symbol( 300 'taler/taler_twister_testing_lib.h', 301 'TALER_TWISTER_run_twister', 302 required: false, 303 dependencies: [talertwistertesting_dep], 304 ) 305 private_config.set10('HAVE_TWISTER', talertwistertesting_dep.found()) 306 qrencode_dep = dependency('qrencode', required: false) 307 if not qrencode_dep.found() 308 qrencode_dep = cc.find_library('qrencode', required: true) 309 endif 310 m_dep = cc.find_library('m', required: false) 311 if m_dep.found() 312 private_config.set('HAVE_LIBM', 1) 313 endif 314 315 316 logging_opt = get_option('logging') 317 logging_verbosity = 0 318 319 if logging_opt == 'yes' 320 logging_verbosity = 1 321 endif 322 if logging_opt == 'no' 323 add_project_arguments('-DGNUNET_CULL_LOGGING=1', language: 'c') 324 endif 325 if logging_opt == 'verbose' 326 logging_verbosity = 2 327 endif 328 if logging_opt == 'veryverbose' 329 logging_verbosity = 3 330 endif 331 332 #add_project_arguments('-DGNUNET_EXTRA_LOGGING=@0@'.format(logging_verbosity), language: 'c') 333 334 335 # todo gcov has meson builtin 336 337 # Used to populate configuration file and script templates 338 339 340 libltversions = [ 341 ['libtalermerchant', '9:0:1'], 342 ['libtalermerchantutil', '1:1:1'], 343 ['libtalermerchantbank', '0:1:0'], 344 ['libtalermerchantdb', '4:1:2'], 345 ['libtalermerchanttesting', '4:1:1'], 346 ] 347 348 solibversions = {} 349 350 foreach libversion : libltversions 351 ltversion = libversion[1].split(':') 352 current = ltversion[0].to_int() 353 revision = ltversion[1].to_int() 354 age = ltversion[2].to_int() 355 soversion_str = '@0@'.format(current - age) 356 ltversion_str = '@0@.@1@.@2@'.format(current - age, age, revision) 357 solibversions = solibversions + { 358 libversion[0]: { 359 'soversion': soversion_str, 360 'version': ltversion_str, 361 }, 362 } 363 endforeach 364 365 private_config.set_quoted('PACKAGE_VERSION', meson.project_version()) 366 # Compatibility. Used in source. 367 private_config.set_quoted('VERSION', meson.project_version()) 368 private_config.set_quoted('VCS_VERSION', 'mesonbuild') 369 private_config.set_quoted('PACKAGE_BUGREPORT', 'taler@gnu.org') 370 configure_file(output: 'taler_merchant_config.h', configuration: private_config) 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 else 392 subdir('contrib') 393 if not get_option('disable-doc') 394 subdir('doc') 395 endif 396 endif 397 398 run_target( 399 'doxygen', 400 command: 'scripts/doxygen.meson.sh', 401 env: {'PACKAGE_VERSION': meson.project_version()}, 402 ) 403 #meson.add_dist_script('meson-dist-script') 404