anastasis

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

meson.build (11356B)


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