sync

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

meson.build (11788B)


      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     mhd_dep = dependency('libmicrohttpd', required: false)
     72     if not mhd_dep.found()
     73         mhd_dep = cc.find_library('microhttpd', required: true)
     74     endif
     75 
     76     # sync-httpd2 is the only daemon we build, so MHD2 is mandatory.
     77     mhd2_dep = dependency('libmicrohttpd2', required: false)
     78     if not mhd2_dep.found()
     79         mhd2_dep = cc.find_library('microhttpd2', 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     gnunetmhd_dep = dependency('gnunetmhd', required: false)
    112     if not gnunetmhd_dep.found()
    113         gnunetmhd_dep = cc.find_library('gnunetmhd', required: true)
    114     endif
    115     cc.has_header_symbol(
    116         'gnunet/gnunet_mhd_lib.h',
    117         'GNUNET_MHD_post_parser',
    118         dependencies: [gnunetmhd_dep],
    119         required: true,
    120     )
    121 
    122     curl_dep = dependency('libcurl', version: '>=7.34.0', required: false)
    123     if not curl_dep.found()
    124         curl_dep = cc.find_library('curl', required: true)
    125         curl_version_check = '''#include <curl/curl.h>
    126   int main(int argc, char **argv) {
    127     #if LIBCURL_VERSION_NUM < 0x073400
    128       #error "cURL version >= 7.34.0 required"
    129     #endif
    130     return 0;
    131     }
    132   '''
    133         if not cc.compiles(
    134             curl_version_check,
    135             name: 'cURL version check',
    136             dependencies: curl_dep,
    137         )
    138             error('cURL version >=7.34.0 required')
    139         endif
    140     endif
    141 
    142     gnunetcurl_dep = dependency('gnunetcurl', required: false)
    143     if not gnunetcurl_dep.found()
    144         gnunetcurl_dep = cc.find_library('gnunetcurl', required: true)
    145     endif
    146     cc.has_header_symbol(
    147         'gnunet/gnunet_curl_lib.h',
    148         'GNUNET_CURL_get_select_info',
    149         dependencies: [gnunetcurl_dep],
    150         required: true,
    151     )
    152 
    153     pq_dep = dependency('libpq', required: false)
    154     if not pq_dep.found()
    155         pq_dep = cc.find_library('pq', required: true)
    156     endif
    157 
    158     gnunetpq_dep = dependency('gnunetpq', required: false)
    159     if not gnunetpq_dep.found()
    160         gnunetpq_dep = cc.find_library('gnunetpq', required: true)
    161     endif
    162     cc.has_header_symbol(
    163         'gnunet/gnunet_pq_lib.h',
    164         'GNUNET_PQ_query_param_blind_sign_priv',
    165         required: true,
    166         dependencies: [pq_dep, gnunetpq_dep],
    167     )
    168     private_config.set10('HAVE_GNUNETPQ', gnunetpq_dep.found())
    169 
    170     talerutil_dep = dependency('talerutil', required: false)
    171     if not talerutil_dep.found()
    172         talerutil_dep = cc.find_library('talerutil', required: true)
    173     endif
    174     cc.has_header_symbol(
    175         'taler/taler_util.h',
    176         'TALER_merchant_instance_auth_hash_with_salt',
    177         required: true,
    178         dependencies: [talerutil_dep],
    179     )
    180     private_config.set10('HAVE_TALERUTIL', talerutil_dep.found())
    181 
    182     talercurl_dep = dependency('talercurl', required: false)
    183     if not talercurl_dep.found()
    184         talercurl_dep = cc.find_library('talercurl', required: true)
    185     endif
    186     talerkyclogic_dep = dependency('talerkyclogic', required: false)
    187     if not talerkyclogic_dep.found()
    188         talerkyclogic_dep = cc.find_library('talerkyclogic', required: true)
    189     endif
    190     talerbank_dep = dependency('talerbank', required: false)
    191     if not talerbank_dep.found()
    192         talerbank_dep = cc.find_library('talerbank', required: true)
    193     endif
    194     talerfakebank_dep = dependency('talerfakebank', required: false)
    195     if not talerfakebank_dep.found()
    196         talerfakebank_dep = cc.find_library('talerfakebank', required: false)
    197     endif
    198     talertemplating_dep = dependency('talertemplating', required: false)
    199     if not talertemplating_dep.found()
    200         talertemplating_dep = cc.find_library('talertemplating', required: true)
    201     endif
    202     talertesting_dep = dependency('talertesting', required: false)
    203     if not talertesting_dep.found()
    204         talertesting_dep = cc.find_library('talertesting', required: true)
    205     endif
    206 
    207     talerexchange_dep = dependency('talerexchange', required: false)
    208     if not talerexchange_dep.found()
    209         talerexchange_dep = cc.find_library('talerexchange', required: true)
    210     endif
    211     cc.has_header_symbol(
    212         'taler/taler_exchange_service.h',
    213         'TALER_EXCHANGE_keys_test_account_allowed',
    214         required: true,
    215         dependencies: [talerexchange_dep],
    216     )
    217     private_config.set10('HAVE_TALEREXCHANGE', talerexchange_dep.found())
    218 
    219     talermhd_dep = dependency('talermhd', required: false)
    220     if not talermhd_dep.found()
    221         talermhd_dep = cc.find_library('talermhd', required: true)
    222     endif
    223     cc.has_header_symbol(
    224         'taler/taler_mhd_lib.h',
    225         'TALER_MHD_parse_request_arg_rel_time',
    226         required: true,
    227         dependencies: [talermhd_dep],
    228     )
    229     private_config.set10('HAVE_TALERMHD', talermhd_dep.found())
    230 
    231     talermhd2_dep = dependency('talermhd2', required: false)
    232     if not talermhd2_dep.found()
    233         talermhd2_dep = cc.find_library('talermhd2', required: true)
    234     endif
    235     cc.has_header_symbol(
    236         'taler/taler_mhd2_lib.h',
    237         'TALER_MHD2_get_date_string',
    238         required: true,
    239         dependencies: [talermhd2_dep],
    240     )
    241     private_config.set10('HAVE_TALERMHD2', talermhd2_dep.found())
    242 
    243     talerjson_dep = dependency('talerjson', required: false)
    244     if not talerjson_dep.found()
    245         talerjson_dep = cc.find_library('talerjson', required: true)
    246     endif
    247     cc.has_header_symbol(
    248         'taler/taler_json_lib.h',
    249         'TALER_JSON_currency_specs_to_json',
    250         required: true,
    251         dependencies: [talerjson_dep],
    252     )
    253     private_config.set10('HAVE_TALERJSON', talerjson_dep.found())
    254 
    255 
    256     talerpq_dep = dependency('talerpq', required: false)
    257     if not talerpq_dep.found()
    258         talerpq_dep = cc.find_library('talerpq', required: true)
    259     endif
    260     cc.has_header_symbol(
    261         'taler/taler_pq_lib.h',
    262         'TALER_PQ_query_param_array_blinded_denom_sig',
    263         required: true,
    264         dependencies: [talerpq_dep, pq_dep],
    265     )
    266     private_config.set10('HAVE_TALERPQ', talerpq_dep.found())
    267 
    268     talermerchant_dep = dependency('talermerchant', required: false)
    269     if not talermerchant_dep.found()
    270         talermerchant_dep = cc.find_library('talermerchant', required: true)
    271     endif
    272     cc.has_header_symbol(
    273         'taler/taler_merchant_service.h',
    274         'TALER_MERCHANT_get_private_order_create',
    275         required: true,
    276         dependencies: [talermerchant_dep],
    277     )
    278     talermerchanttesting_dep = dependency(
    279         'talermerchanttesting',
    280         required: false,
    281     )
    282     if not talermerchanttesting_dep.found()
    283         talermerchanttesting_dep = cc.find_library(
    284             'talermerchanttesting',
    285             required: true,
    286         )
    287     endif
    288     m_dep = cc.find_library('m', required: false)
    289     if m_dep.found()
    290         private_config.set('HAVE_LIBM', 1)
    291     endif
    292 
    293 
    294     logging_opt = get_option('logging')
    295     logging_verbosity = 0
    296 
    297     if logging_opt == 'yes'
    298         logging_verbosity = 1
    299     endif
    300     if logging_opt == 'no'
    301         add_project_arguments('-DGNUNET_CULL_LOGGING=1', language: 'c')
    302     endif
    303     if logging_opt == 'verbose'
    304         logging_verbosity = 2
    305     endif
    306     if logging_opt == 'veryverbose'
    307         logging_verbosity = 3
    308     endif
    309 
    310     libltversions = [
    311         ['libsync', '0:1:0'],
    312         ['libsyncutil', '0:1:0'],
    313         ['libsynctesting', '0:1:0'],
    314         ['libsyncdb', '1:0:0'],
    315     ]
    316 
    317     solibversions = {}
    318 
    319     foreach libversion : libltversions
    320         ltversion = libversion[1].split(':')
    321         current = ltversion[0].to_int()
    322         revision = ltversion[1].to_int()
    323         age = ltversion[2].to_int()
    324         soversion_str = '@0@'.format(current - age)
    325         ltversion_str = '@0@.@1@.@2@'.format(current - age, age, revision)
    326         solibversions = solibversions + {
    327             libversion[0]: {
    328                 'soversion': soversion_str,
    329                 'version': ltversion_str,
    330             },
    331         }
    332     endforeach
    333 
    334     private_config.set_quoted('PACKAGE_VERSION', meson.project_version())
    335     # Compatibility. Used in source.
    336     private_config.set_quoted('VERSION', meson.project_version())
    337     private_config.set_quoted('PACKAGE_BUGREPORT', 'taler@gnu.org')
    338     configure_file(output: 'sync_config.h', configuration: private_config)
    339     configuration_inc = include_directories('.')
    340 
    341     cdata.merge_from(private_config)
    342     add_project_arguments('-DHAVE_CONFIG_H', language: 'c')
    343 
    344     pkg = import('pkgconfig')
    345     subdir('contrib')
    346     subdir('src')
    347     if get_option('doc')
    348         subdir('doc')
    349     endif
    350 
    351     # The variable name must match GNUNET_OS_ProjectData.env_varname in
    352     # src/util/os_installation.c.  Otherwise GNUnet falls back to locating
    353     # $DATADIR relative to libsyncutil, which under the build-tree
    354     # LD_LIBRARY_PATH that meson injects resolves into the build directory,
    355     # and the tests fail to find the installed SQL files.
    356     sync_prefix = get_option('prefix') / get_option('libdir')
    357 
    358     add_test_setup(
    359         'default',
    360         env: ['SYNC_PREFIX=' + sync_prefix],
    361         exclude_suites: ['perf', 'installcheck', 'integrationtests'],
    362         is_default: true,
    363     )
    364 else
    365     subdir('contrib')
    366     if get_option('doc')
    367         subdir('doc')
    368     endif
    369 endif
    370 
    371 run_target(
    372     'doxygen',
    373     command: 'scripts/doxygen.meson.sh',
    374     env: {'PACKAGE_VERSION': meson.project_version()},
    375 )
    376 
    377 meson.add_dist_script('meson-dist-script')
    378