sync

Backup service to store encrypted wallet databases (experimental)
Log | Files | Refs | Submodules | README | LICENSE

meson.build (10623B)


      1 project(
      2     'sync',
      3     'c',
      4     license: 'AGPLv3',
      5     meson_version: '>=1.1.0',
      6     version: run_command('sh', 'scripts/get_version.sh', check: true).stdout().strip(),
      7 )
      8 
      9 cc = meson.get_compiler('c')
     10 incdir = include_directories(
     11     'src/include',
     12     'src/include/sync',
     13     'src/include/sync/sync-database',
     14 )
     15 
     16 # Used to populate gnunet_private_config.h
     17 private_config = configuration_data()
     18 
     19 pkgcfgdir = get_option('datadir') / 'sync' / 'config.d'
     20 docdir = get_option('datadir') / 'doc' / 'sync'
     21 
     22 if get_option('install-rpath')
     23     rpath_option = get_option('prefix') / get_option('libdir')
     24 else
     25     rpath_option = ''
     26 endif
     27 
     28 install_emptydir(docdir)
     29 install_data('README', 'COPYING', install_dir: docdir)
     30 
     31 gnunet_user = false
     32 dpkg_architecture_bin = find_program(
     33     'dpkg-architecture',
     34     '/usr/bin/getent',
     35     required: false,
     36 )
     37 if dpkg_architecture_bin.found()
     38     private_config.set(
     39         'MULTIARCH',
     40         dpkg_architecture_bin.full_path() + ' -qDEB_HOST_MULTIARCH',
     41     )
     42 endif
     43 
     44 TALER_PLUGIN_LDFLAGS = [
     45     '-export-dynamic',
     46     '-avoid-version',
     47     '-module',
     48     '--no-undefined',
     49 ]
     50 
     51 cdata = configuration_data()
     52 if not get_option('only-doc')
     53     add_project_arguments(
     54         '-Wall',
     55         '-Wno-address-of-packed-member',
     56         language: 'c',
     57     )
     58     taler_lib_ldflags = '-export-dynamic -no-undefined'
     59 
     60     check_headers = ['stdint.h', 'stdlib.h', 'string.h', 'unistd.h']
     61 
     62     foreach h : check_headers
     63         if cc.check_header(h)
     64             define = 'HAVE_' + h.underscorify().to_upper()
     65             message(define)
     66             private_config.set(define, 1)
     67         endif
     68     endforeach
     69 
     70 
     71     # sync-httpd2 is the only daemon we build, so MHD2 is mandatory.
     72     mhd2_dep = dependency('libmicrohttpd2', required: false)
     73     if not mhd2_dep.found()
     74         mhd2_dep = cc.find_library('microhttpd2', required: true)
     75     endif
     76 
     77     zlib_dep = dependency('zlib', required: false)
     78     if not zlib_dep.found()
     79         zlib_dep = cc.find_library('zlib', required: true)
     80     endif
     81 
     82     json_dep = dependency('jansson', required: false)
     83     if not json_dep.found()
     84         json_dep = cc.find_library('jansson', required: true)
     85     endif
     86 
     87     gcrypt_dep = dependency('libgcrypt', required: false)
     88     if not gcrypt_dep.found()
     89         gcrypt_dep = cc.find_library('gcrypt', required: true)
     90     endif
     91 
     92     private_config.set_quoted('NEED_LIBGCRYPT_VERSION', '1.6.1')
     93 
     94     gnunetutil_dep = dependency('gnunetutil', required: false)
     95     if not gnunetutil_dep.found()
     96         gnunetutil_dep = cc.find_library('gnunetutil', required: true)
     97     endif
     98 
     99     cc.has_header_symbol(
    100         'gnunet/gnunet_util_lib.h',
    101         'GNUNET_TIME_round_up',
    102         dependencies: [gnunetutil_dep],
    103         required: true,
    104     )
    105 
    106     gnunetjson_dep = dependency('gnunetjson', required: false)
    107     if not gnunetjson_dep.found()
    108         gnunetjson_dep = cc.find_library('gnunetjson', required: true)
    109     endif
    110 
    111     curl_dep = dependency('libcurl', version: '>=7.34.0', required: false)
    112     if not curl_dep.found()
    113         curl_dep = cc.find_library('curl', required: true)
    114         curl_version_check = '''#include <curl/curl.h>
    115   int main(int argc, char **argv) {
    116     #if LIBCURL_VERSION_NUM < 0x073400
    117       #error "cURL version >= 7.34.0 required"
    118     #endif
    119     return 0;
    120     }
    121   '''
    122         if not cc.compiles(
    123             curl_version_check,
    124             name: 'cURL version check',
    125             dependencies: curl_dep,
    126         )
    127             error('cURL version >=7.34.0 required')
    128         endif
    129     endif
    130 
    131     gnunetcurl_dep = dependency('gnunetcurl', required: false)
    132     if not gnunetcurl_dep.found()
    133         gnunetcurl_dep = cc.find_library('gnunetcurl', required: true)
    134     endif
    135     cc.has_header_symbol(
    136         'gnunet/gnunet_curl_lib.h',
    137         'GNUNET_CURL_get_select_info',
    138         dependencies: [gnunetcurl_dep],
    139         required: true,
    140     )
    141 
    142     pq_dep = dependency('libpq', required: false)
    143     if not pq_dep.found()
    144         pq_dep = cc.find_library('pq', required: true)
    145     endif
    146 
    147     gnunetpq_dep = dependency('gnunetpq', required: false)
    148     if not gnunetpq_dep.found()
    149         gnunetpq_dep = cc.find_library('gnunetpq', required: true)
    150     endif
    151     cc.has_header_symbol(
    152         'gnunet/gnunet_pq_lib.h',
    153         'GNUNET_PQ_query_param_blind_sign_priv',
    154         required: true,
    155         dependencies: [pq_dep, gnunetpq_dep],
    156     )
    157     private_config.set10('HAVE_GNUNETPQ', gnunetpq_dep.found())
    158 
    159     talerutil_dep = dependency('talerutil', required: false)
    160     if not talerutil_dep.found()
    161         talerutil_dep = cc.find_library('talerutil', required: true)
    162     endif
    163     cc.has_header_symbol(
    164         'taler/taler_util.h',
    165         'TALER_merchant_instance_auth_hash_with_salt',
    166         required: true,
    167         dependencies: [talerutil_dep],
    168     )
    169     private_config.set10('HAVE_TALERUTIL', talerutil_dep.found())
    170 
    171     talercurl_dep = dependency('talercurl', required: false)
    172     if not talercurl_dep.found()
    173         talercurl_dep = cc.find_library('talercurl', required: true)
    174     endif
    175     talerkyclogic_dep = dependency('talerkyclogic', required: false)
    176     if not talerkyclogic_dep.found()
    177         talerkyclogic_dep = cc.find_library('talerkyclogic', required: true)
    178     endif
    179     talerbank_dep = dependency('talerbank', required: false)
    180     if not talerbank_dep.found()
    181         talerbank_dep = cc.find_library('talerbank', required: true)
    182     endif
    183     talerfakebank_dep = dependency('talerfakebank', required: false)
    184     if not talerfakebank_dep.found()
    185         talerfakebank_dep = cc.find_library('talerfakebank', required: false)
    186     endif
    187     talertemplating_dep = dependency('talertemplating', required: false)
    188     if not talertemplating_dep.found()
    189         talertemplating_dep = cc.find_library('talertemplating', required: true)
    190     endif
    191     talertesting_dep = dependency('talertesting', required: false)
    192     if not talertesting_dep.found()
    193         talertesting_dep = cc.find_library('talertesting', required: true)
    194     endif
    195 
    196     talerexchange_dep = dependency('talerexchange', required: false)
    197     if not talerexchange_dep.found()
    198         talerexchange_dep = cc.find_library('talerexchange', required: true)
    199     endif
    200     cc.has_header_symbol(
    201         'taler/taler_exchange_service.h',
    202         'TALER_EXCHANGE_keys_test_account_allowed',
    203         required: true,
    204         dependencies: [talerexchange_dep],
    205     )
    206     private_config.set10('HAVE_TALEREXCHANGE', talerexchange_dep.found())
    207 
    208     talerjson_dep = dependency('talerjson', required: false)
    209     if not talerjson_dep.found()
    210         talerjson_dep = cc.find_library('talerjson', required: true)
    211     endif
    212     cc.has_header_symbol(
    213         'taler/taler_json_lib.h',
    214         'TALER_JSON_currency_specs_to_json',
    215         required: true,
    216         dependencies: [talerjson_dep],
    217     )
    218     private_config.set10('HAVE_TALERJSON', talerjson_dep.found())
    219 
    220 
    221     talerpq_dep = dependency('talerpq', required: false)
    222     if not talerpq_dep.found()
    223         talerpq_dep = cc.find_library('talerpq', required: true)
    224     endif
    225     cc.has_header_symbol(
    226         'taler/taler_pq_lib.h',
    227         'TALER_PQ_query_param_array_blinded_denom_sig',
    228         required: true,
    229         dependencies: [talerpq_dep, pq_dep],
    230     )
    231     private_config.set10('HAVE_TALERPQ', talerpq_dep.found())
    232 
    233     talermerchant_dep = dependency('talermerchant', required: false)
    234     if not talermerchant_dep.found()
    235         talermerchant_dep = cc.find_library('talermerchant', required: true)
    236     endif
    237     cc.has_header_symbol(
    238         'taler/taler_merchant_service.h',
    239         'TALER_MERCHANT_get_private_order_create',
    240         required: true,
    241         dependencies: [talermerchant_dep],
    242     )
    243     talermerchanttesting_dep = dependency(
    244         'talermerchanttesting',
    245         required: false,
    246     )
    247     if not talermerchanttesting_dep.found()
    248         talermerchanttesting_dep = cc.find_library(
    249             'talermerchanttesting',
    250             required: true,
    251         )
    252     endif
    253     m_dep = cc.find_library('m', required: false)
    254     if m_dep.found()
    255         private_config.set('HAVE_LIBM', 1)
    256     endif
    257 
    258 
    259     logging_opt = get_option('logging')
    260     logging_verbosity = 0
    261 
    262     if logging_opt == 'yes'
    263         logging_verbosity = 1
    264     endif
    265     if logging_opt == 'no'
    266         add_project_arguments('-DGNUNET_CULL_LOGGING=1', language: 'c')
    267     endif
    268     if logging_opt == 'verbose'
    269         logging_verbosity = 2
    270     endif
    271     if logging_opt == 'veryverbose'
    272         logging_verbosity = 3
    273     endif
    274 
    275     libltversions = [
    276         ['libsync', '0:1:0'],
    277         ['libsyncutil', '0:1:0'],
    278         ['libsynctesting', '0:1:0'],
    279         ['libsyncdb', '1:0:0'],
    280     ]
    281 
    282     solibversions = {}
    283 
    284     foreach libversion : libltversions
    285         ltversion = libversion[1].split(':')
    286         current = ltversion[0].to_int()
    287         revision = ltversion[1].to_int()
    288         age = ltversion[2].to_int()
    289         soversion_str = '@0@'.format(current - age)
    290         ltversion_str = '@0@.@1@.@2@'.format(current - age, age, revision)
    291         solibversions = solibversions + {
    292             libversion[0]: {
    293                 'soversion': soversion_str,
    294                 'version': ltversion_str,
    295             },
    296         }
    297     endforeach
    298 
    299     private_config.set_quoted('PACKAGE_VERSION', meson.project_version())
    300     # Compatibility. Used in source.
    301     private_config.set_quoted('VERSION', meson.project_version())
    302     private_config.set_quoted('PACKAGE_BUGREPORT', 'taler@gnu.org')
    303     configure_file(output: 'sync_config.h', configuration: private_config)
    304     configuration_inc = include_directories('.')
    305 
    306     cdata.merge_from(private_config)
    307     add_project_arguments('-DHAVE_CONFIG_H', language: 'c')
    308 
    309     pkg = import('pkgconfig')
    310     subdir('contrib')
    311     subdir('src')
    312     if get_option('doc')
    313         subdir('doc')
    314     endif
    315 
    316     # The variable name must match GNUNET_OS_ProjectData.env_varname in
    317     # src/util/os_installation.c.  Otherwise GNUnet falls back to locating
    318     # $DATADIR relative to libsyncutil, which under the build-tree
    319     # LD_LIBRARY_PATH that meson injects resolves into the build directory,
    320     # and the tests fail to find the installed SQL files.
    321     sync_prefix = get_option('prefix') / get_option('libdir')
    322 
    323     add_test_setup(
    324         'default',
    325         env: ['SYNC_PREFIX=' + sync_prefix],
    326         exclude_suites: ['perf', 'installcheck', 'integrationtests'],
    327         is_default: true,
    328     )
    329 else
    330     subdir('contrib')
    331     if get_option('doc')
    332         subdir('doc')
    333     endif
    334 endif
    335 
    336 run_target(
    337     'doxygen',
    338     command: 'scripts/doxygen.meson.sh',
    339     env: {'PACKAGE_VERSION': meson.project_version()},
    340 )
    341 
    342 meson.add_dist_script('meson-dist-script')
    343