merchant

Merchant backend to process payments, run by merchants
Log | Files | Refs | Submodules | README | LICENSE

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