anastasis

Credential backup and recovery protocol and service
Log | Files | Refs | Submodules | README | LICENSE

meson.build (11402B)


      1 project(
      2     'anastasis',
      3     'c',
      4     license: 'AGPLv3',
      5     meson_version: '>=1.1.0',
      6     version: '0.7.1',
      7     version: run_command('sh', 'scripts/get_version.sh', check: true).stdout().strip(),
      8 )
      9 
     10 cc = meson.get_compiler('c')
     11 incdir = include_directories('src/include')
     12 
     13 # Used to populate gnunet_private_config.h
     14 private_config = configuration_data()
     15 
     16 
     17 plugindir = get_option('libdir') / 'anastasis'
     18 pkgdatadir = get_option('datadir') / 'anastasis'
     19 pkgcfgdir = pkgdatadir / 'config.d'
     20 docdir = get_option('datadir') / 'doc' / 'anastasis'
     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/dpkg-architecture',
     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     # Gettext
     71     i18n = import('i18n')
     72 
     73     gettext_package = 'anastasis'
     74     add_project_arguments('-DGETTEXT_PACKAGE=' + gettext_package, language: 'c')
     75     add_project_arguments('-DENABLE_NLS=1', language: 'c')
     76 
     77     subdir('po')
     78 
     79     zlib_dep = dependency('zlib', required: false)
     80     if not zlib_dep.found()
     81         zlib_dep = cc.find_library('zlib', required: true)
     82     endif
     83     dl_dep = dependency('libdl', required: false)
     84     if not dl_dep.found()
     85         dl_dep = cc.find_library('dl', required: true)
     86     endif
     87     m_dep = cc.find_library('m', required: false)
     88     if m_dep.found()
     89         private_config.set('HAVE_LIBM', 1)
     90     endif
     91 
     92 
     93     mhd_dep = dependency('libmicrohttpd', required: false)
     94     if not mhd_dep.found()
     95         mhd_dep = cc.find_library('microhttpd', required: true)
     96     endif
     97 
     98     mhd2_dep = dependency('libmicrohttpd2', required: false)
     99     if not mhd2_dep.found()
    100         mhd_dep2 = cc.find_library('microhttpd2', required: false)
    101     endif
    102 
    103     json_dep = dependency('jansson', required: false)
    104     if not json_dep.found()
    105         json_dep = cc.find_library('jansson', required: true)
    106     endif
    107 
    108     gcrypt_dep = dependency('libgcrypt', required: false)
    109     if not gcrypt_dep.found()
    110         gcrypt_dep = cc.find_library('gcrypt', required: true)
    111     endif
    112 
    113     private_config.set_quoted('NEED_LIBGCRYPT_VERSION', '1.6.1')
    114 
    115     gnunetutil_dep = dependency('gnunetutil', required: false)
    116     if not gnunetutil_dep.found()
    117         gnunetutil_dep = cc.find_library('gnunetutil', required: true)
    118     endif
    119 
    120     cc.has_header_symbol(
    121         'gnunet/gnunet_util_lib.h',
    122         'GNUNET_TIME_round_up',
    123         dependencies: [gnunetutil_dep],
    124         required: true,
    125     )
    126 
    127     gnunetjson_dep = dependency('gnunetjson', required: false)
    128     if not gnunetjson_dep.found()
    129         gnunetjson_dep = cc.find_library('gnunetjson', required: true)
    130     endif
    131     sodium_dep = dependency('libsodium', required: false, version: '>=1.0.18')
    132     if not sodium_dep.found()
    133         sodium_dep = cc.find_library('sodium', required: true)
    134         sodium_version_check = '''#include <sodium.h>
    135   int main(int argc, char **argv) {
    136     #if !((SODIUM_LIBRARY_VERSION_MAJOR > 10) || \
    137          ((SODIUM_LIBRARY_VERSION_MAJOR == 10) && \
    138          (SODIUM_LIBRARY_VERSION_MINOR >= 3)))
    139       #error "libsodium version >= 1.0.18 required"
    140     #endif
    141     return 0
    142     }
    143   '''
    144         if not cc.compiles(
    145             sodium_version_check,
    146             name: 'sodium version check',
    147             dependencies: sodium_dep,
    148         )
    149             error('libsodium version >=1.0.18 required')
    150         endif
    151     endif
    152 
    153     curl_dep = dependency('libcurl', version: '>=7.34.0', required: false)
    154     if not curl_dep.found()
    155         curl_dep = cc.find_library('curl', required: true)
    156         curl_version_check = '''#include <curl/curl.h>
    157   int main(int argc, char **argv) {
    158     #if LIBCURL_VERSION_NUM < 0x073400
    159       #error "cURL version >= 7.34.0 required"
    160     #endif
    161     return 0;
    162     }
    163   '''
    164         if not cc.compiles(
    165             curl_version_check,
    166             name: 'cURL version check',
    167             dependencies: curl_dep,
    168         )
    169             error('cURL version >=7.34.0 required')
    170         endif
    171     endif
    172 
    173     gnunetcurl_dep = dependency('gnunetcurl', required: false)
    174     if not gnunetcurl_dep.found()
    175         gnunetcurl_dep = cc.find_library('gnunetcurl', required: true)
    176     endif
    177     cc.has_header_symbol(
    178         'gnunet/gnunet_curl_lib.h',
    179         'GNUNET_CURL_get_select_info',
    180         dependencies: [gnunetcurl_dep],
    181         required: true,
    182     )
    183     pq_dep = dependency('libpq', required: false)
    184     if not pq_dep.found()
    185         pq_dep = cc.find_library('pq', required: true)
    186     endif
    187 
    188     gnunetpq_dep = dependency('gnunetpq', required: false)
    189     if not gnunetpq_dep.found()
    190         gnunetpq_dep = cc.find_library('gnunetpq', required: true)
    191     endif
    192     cc.has_header_symbol(
    193         'gnunet/gnunet_pq_lib.h',
    194         'GNUNET_PQ_query_param_blind_sign_priv',
    195         required: true,
    196         dependencies: [pq_dep, gnunetpq_dep],
    197     )
    198     private_config.set10('HAVE_GNUNETPQ', gnunetpq_dep.found())
    199 
    200 
    201     talerutil_dep = dependency('talerutil', required: false)
    202     if not talerutil_dep.found()
    203         talerutil_dep = cc.find_library('talerutil', required: true)
    204     endif
    205     cc.has_header_symbol(
    206         'taler/taler_util.h',
    207         'TALER_merchant_instance_auth_hash_with_salt',
    208         required: true,
    209         dependencies: [talerutil_dep],
    210     )
    211     private_config.set10('HAVE_TALERUTIL', talerutil_dep.found())
    212 
    213     talerexchange_dep = dependency('talerexchange', required: false)
    214     if not talerexchange_dep.found()
    215         talerexchange_dep = cc.find_library('talerexchange', required: true)
    216     endif
    217     private_config.set10('HAVE_TALEREXCHANGE', talerexchange_dep.found())
    218 
    219     talercurl_dep = dependency('talercurl', required: false)
    220     if not talercurl_dep.found()
    221         talercurl_dep = cc.find_library('talercurl', required: true)
    222     endif
    223     talertesting_dep = dependency('talertesting', required: false)
    224     if not talertesting_dep.found()
    225         talertesting_dep = cc.find_library('talertesting', required: true)
    226     endif
    227 
    228     talermhd_dep = dependency('talermhd', required: false)
    229     if not talermhd_dep.found()
    230         talermhd_dep = cc.find_library('talermhd', required: true)
    231     endif
    232     cc.has_header_symbol(
    233         'taler/taler_mhd_lib.h',
    234         'TALER_MHD_parse_request_arg_rel_time',
    235         required: true,
    236         dependencies: [talermhd_dep],
    237     )
    238     private_config.set10('HAVE_TALERMHD', talermhd_dep.found())
    239 
    240 
    241     talermerchant_dep = dependency('talermerchant', required: false)
    242     if not talermerchant_dep.found()
    243         talermerchant_dep = cc.find_library('talermerchant', required: true)
    244     endif
    245     cc.has_header_symbol(
    246         'taler/taler_merchant_service.h',
    247         'TALER_MERCHANT_parse_pay_uri',
    248         required: true,
    249         dependencies: [talermerchant_dep],
    250     )
    251     private_config.set10('HAVE_TALERMERCHANT', talermerchant_dep.found())
    252     talermerchanttesting_dep = dependency(
    253         'talermerchanttesting',
    254         required: false,
    255     )
    256     if not talermerchanttesting_dep.found()
    257         talermerchanttesting_dep = cc.find_library(
    258             'talermerchanttesting',
    259             required: true,
    260         )
    261     endif
    262 
    263     talerjson_dep = dependency('talerjson', required: false)
    264     if not talerjson_dep.found()
    265         talerjson_dep = cc.find_library('talerjson', required: true)
    266     endif
    267     cc.has_header_symbol(
    268         'taler/taler_json_lib.h',
    269         'TALER_JSON_currency_specs_to_json',
    270         required: true,
    271         dependencies: [talerjson_dep],
    272     )
    273     private_config.set10('HAVE_TALERJSON', talerjson_dep.found())
    274 
    275 
    276     talerpq_dep = dependency('talerpq', required: false)
    277     if not talerpq_dep.found()
    278         talerpq_dep = cc.find_library('talerpq', required: true)
    279     endif
    280     cc.has_header_symbol(
    281         'taler/taler_pq_lib.h',
    282         'TALER_PQ_query_param_array_blinded_denom_sig',
    283         required: true,
    284         dependencies: [talerpq_dep, pq_dep],
    285     )
    286     private_config.set10('HAVE_TALERPQ', talerpq_dep.found())
    287 
    288     logging_opt = get_option('logging')
    289     logging_verbosity = 0
    290 
    291     if logging_opt == 'yes'
    292         logging_verbosity = 1
    293     endif
    294     if logging_opt == 'no'
    295         add_project_arguments('-DGNUNET_CULL_LOGGING=1', language: 'c')
    296     endif
    297     if logging_opt == 'verbose'
    298         logging_verbosity = 2
    299     endif
    300     if logging_opt == 'veryverbose'
    301         logging_verbosity = 3
    302     endif
    303 
    304     #add_project_arguments('-DGNUNET_EXTRA_LOGGING=@0@'.format(logging_verbosity), language: 'c')
    305 
    306 
    307     # todo gcov has meson builtin
    308 
    309     # Used to populate configuration file and script templates
    310 
    311 
    312     libltversions = [
    313         ['libanastasis', '0:0:0'],
    314         ['libanastasisutil', '0:0:0'],
    315         ['libanastasisauthorization', '0:0:0'],
    316         ['libanastasiseufin', '0:0:0'],
    317         ['libanastasisdb', '2:0:0'],
    318         ['libanastasisrest', '0:0:0'],
    319         ['libanastasistesting', '0:0:0'],
    320         ['libanastasisredux', '0:0:0'],
    321     ]
    322 
    323     solibversions = {}
    324 
    325     foreach libversion : libltversions
    326         ltversion = libversion[1].split(':')
    327         current = ltversion[0].to_int()
    328         revision = ltversion[1].to_int()
    329         age = ltversion[2].to_int()
    330         soversion_str = '@0@'.format(current - age)
    331         ltversion_str = '@0@.@1@.@2@'.format(current - age, age, revision)
    332         solibversions = solibversions + {
    333             libversion[0]: {
    334                 'soversion': soversion_str,
    335                 'version': ltversion_str,
    336             },
    337         }
    338     endforeach
    339 
    340     private_config.set_quoted('PACKAGE', meson.project_name())
    341     private_config.set_quoted('PACKAGE_VERSION', meson.project_version())
    342     # Compatibility. Used in source.
    343     private_config.set_quoted('VERSION', meson.project_version())
    344     private_config.set_quoted('PACKAGE_BUGREPORT', 'taler@gnu.org')
    345     configure_file(output: 'anastasis_config.h', configuration: private_config)
    346     configuration_inc = include_directories('.')
    347 
    348     cdata.merge_from(private_config)
    349     add_project_arguments('-DHAVE_CONFIG_H', language: 'c')
    350 
    351     pkg = import('pkgconfig')
    352     subdir('contrib')
    353     subdir('src')
    354     if not get_option('disable-doc')
    355         subdir('doc')
    356     endif
    357 
    358     taler_prefix = get_option('prefix') / get_option('libdir')
    359 
    360     add_test_setup(
    361         'default',
    362         env: ['ANASTASIS_PREFIX=' + taler_prefix],
    363         exclude_suites: ['perf', 'installcheck', 'integrationtests'],
    364         is_default: true,
    365     )
    366 else
    367     subdir('contrib')
    368     if not get_option('disable-doc')
    369         subdir('doc')
    370     endif
    371 endif
    372 
    373 meson.add_dist_script('meson-dist-script')
    374