anastasis

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

meson.build (11384B)


      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     zlib_dep = dependency('zlib', required: false)
     78     if not zlib_dep.found()
     79         zlib_dep = cc.find_library('zlib', required: true)
     80     endif
     81     dl_dep = dependency('libdl', required: false)
     82     if not dl_dep.found()
     83         dl_dep = cc.find_library('dl', required: true)
     84     endif
     85     m_dep = cc.find_library('m', required: false)
     86     if m_dep.found()
     87         private_config.set('HAVE_LIBM', 1)
     88     endif
     89 
     90 
     91     mhd_dep = dependency('libmicrohttpd', required: false)
     92     if not mhd_dep.found()
     93         mhd_dep = cc.find_library('microhttpd', required: true)
     94     endif
     95 
     96     mhd2_dep = dependency('libmicrohttpd2', required: false)
     97     if not mhd2_dep.found()
     98         mhd_dep2 = cc.find_library('microhttpd2', required: false)
     99     endif
    100 
    101     json_dep = dependency('jansson', required: false)
    102     if not json_dep.found()
    103         json_dep = cc.find_library('jansson', required: true)
    104     endif
    105 
    106     gcrypt_dep = dependency('libgcrypt', required: false)
    107     if not gcrypt_dep.found()
    108         gcrypt_dep = cc.find_library('gcrypt', required: true)
    109     endif
    110 
    111     private_config.set_quoted('NEED_LIBGCRYPT_VERSION', '1.6.1')
    112 
    113     gnunetutil_dep = dependency('gnunetutil', required: false)
    114     if not gnunetutil_dep.found()
    115         gnunetutil_dep = cc.find_library('gnunetutil', required: true)
    116     endif
    117 
    118     cc.has_header_symbol(
    119         'gnunet/gnunet_util_lib.h',
    120         'GNUNET_TIME_round_up',
    121         dependencies: [gnunetutil_dep],
    122         required: true,
    123     )
    124 
    125     gnunetjson_dep = dependency('gnunetjson', required: false)
    126     if not gnunetjson_dep.found()
    127         gnunetjson_dep = cc.find_library('gnunetjson', required: true)
    128     endif
    129     sodium_dep = dependency('libsodium', required: false, version: '>=1.0.18')
    130     if not sodium_dep.found()
    131         sodium_dep = cc.find_library('sodium', required: true)
    132         sodium_version_check = '''#include <sodium.h>
    133   int main(int argc, char **argv) {
    134     #if !((SODIUM_LIBRARY_VERSION_MAJOR > 10) || \
    135          ((SODIUM_LIBRARY_VERSION_MAJOR == 10) && \
    136          (SODIUM_LIBRARY_VERSION_MINOR >= 3)))
    137       #error "libsodium version >= 1.0.18 required"
    138     #endif
    139     return 0
    140     }
    141   '''
    142         if not cc.compiles(
    143             sodium_version_check,
    144             name: 'sodium version check',
    145             dependencies: sodium_dep,
    146         )
    147             error('libsodium version >=1.0.18 required')
    148         endif
    149     endif
    150 
    151     curl_dep = dependency('libcurl', version: '>=7.34.0', required: false)
    152     if not curl_dep.found()
    153         curl_dep = cc.find_library('curl', required: true)
    154         curl_version_check = '''#include <curl/curl.h>
    155   int main(int argc, char **argv) {
    156     #if LIBCURL_VERSION_NUM < 0x073400
    157       #error "cURL version >= 7.34.0 required"
    158     #endif
    159     return 0;
    160     }
    161   '''
    162         if not cc.compiles(
    163             curl_version_check,
    164             name: 'cURL version check',
    165             dependencies: curl_dep,
    166         )
    167             error('cURL version >=7.34.0 required')
    168         endif
    169     endif
    170 
    171     gnunetcurl_dep = dependency('gnunetcurl', required: false)
    172     if not gnunetcurl_dep.found()
    173         gnunetcurl_dep = cc.find_library('gnunetcurl', required: true)
    174     endif
    175     cc.has_header_symbol(
    176         'gnunet/gnunet_curl_lib.h',
    177         'GNUNET_CURL_get_select_info',
    178         dependencies: [gnunetcurl_dep],
    179         required: true,
    180     )
    181     pq_dep = dependency('libpq', required: false)
    182     if not pq_dep.found()
    183         pq_dep = cc.find_library('pq', required: true)
    184     endif
    185 
    186     gnunetpq_dep = dependency('gnunetpq', required: false)
    187     if not gnunetpq_dep.found()
    188         gnunetpq_dep = cc.find_library('gnunetpq', required: true)
    189     endif
    190     cc.has_header_symbol(
    191         'gnunet/gnunet_pq_lib.h',
    192         'GNUNET_PQ_query_param_blind_sign_priv',
    193         required: true,
    194         dependencies: [pq_dep, gnunetpq_dep],
    195     )
    196     private_config.set10('HAVE_GNUNETPQ', gnunetpq_dep.found())
    197 
    198 
    199     talerutil_dep = dependency('talerutil', required: false)
    200     if not talerutil_dep.found()
    201         talerutil_dep = cc.find_library('talerutil', required: true)
    202     endif
    203     cc.has_header_symbol(
    204         'taler/taler_util.h',
    205         'TALER_merchant_instance_auth_hash_with_salt',
    206         required: true,
    207         dependencies: [talerutil_dep],
    208     )
    209     private_config.set10('HAVE_TALERUTIL', talerutil_dep.found())
    210 
    211     talerexchange_dep = dependency('talerexchange', required: false)
    212     if not talerexchange_dep.found()
    213         talerexchange_dep = cc.find_library('talerexchange', required: true)
    214     endif
    215     private_config.set10('HAVE_TALEREXCHANGE', talerexchange_dep.found())
    216 
    217     talercurl_dep = dependency('talercurl', required: false)
    218     if not talercurl_dep.found()
    219         talercurl_dep = cc.find_library('talercurl', required: true)
    220     endif
    221     talertesting_dep = dependency('talertesting', required: false)
    222     if not talertesting_dep.found()
    223         talertesting_dep = cc.find_library('talertesting', required: true)
    224     endif
    225 
    226     talermhd_dep = dependency('talermhd', required: false)
    227     if not talermhd_dep.found()
    228         talermhd_dep = cc.find_library('talermhd', required: true)
    229     endif
    230     cc.has_header_symbol(
    231         'taler/taler_mhd_lib.h',
    232         'TALER_MHD_parse_request_arg_rel_time',
    233         required: true,
    234         dependencies: [talermhd_dep],
    235     )
    236     private_config.set10('HAVE_TALERMHD', talermhd_dep.found())
    237 
    238 
    239     talermerchant_dep = dependency('talermerchant', required: false)
    240     if not talermerchant_dep.found()
    241         talermerchant_dep = cc.find_library('talermerchant', required: true)
    242     endif
    243     cc.has_header_symbol(
    244         'taler/taler_merchant_service.h',
    245         'TALER_MERCHANT_parse_pay_uri',
    246         required: true,
    247         dependencies: [talermerchant_dep],
    248     )
    249     private_config.set10('HAVE_TALERMERCHANT', talermerchant_dep.found())
    250     talermerchanttesting_dep = dependency(
    251         'talermerchanttesting',
    252         required: false,
    253     )
    254     if not talermerchanttesting_dep.found()
    255         talermerchanttesting_dep = cc.find_library(
    256             'talermerchanttesting',
    257             required: true,
    258         )
    259     endif
    260 
    261     talerjson_dep = dependency('talerjson', required: false)
    262     if not talerjson_dep.found()
    263         talerjson_dep = cc.find_library('talerjson', required: true)
    264     endif
    265     cc.has_header_symbol(
    266         'taler/taler_json_lib.h',
    267         'TALER_JSON_currency_specs_to_json',
    268         required: true,
    269         dependencies: [talerjson_dep],
    270     )
    271     private_config.set10('HAVE_TALERJSON', talerjson_dep.found())
    272 
    273 
    274     talerpq_dep = dependency('talerpq', required: false)
    275     if not talerpq_dep.found()
    276         talerpq_dep = cc.find_library('talerpq', required: true)
    277     endif
    278     cc.has_header_symbol(
    279         'taler/taler_pq_lib.h',
    280         'TALER_PQ_query_param_array_blinded_denom_sig',
    281         required: true,
    282         dependencies: [talerpq_dep, pq_dep],
    283     )
    284     private_config.set10('HAVE_TALERPQ', talerpq_dep.found())
    285 
    286     logging_opt = get_option('logging')
    287     logging_verbosity = 0
    288 
    289     if logging_opt == 'yes'
    290         logging_verbosity = 1
    291     endif
    292     if logging_opt == 'no'
    293         add_project_arguments('-DGNUNET_CULL_LOGGING=1', language: 'c')
    294     endif
    295     if logging_opt == 'verbose'
    296         logging_verbosity = 2
    297     endif
    298     if logging_opt == 'veryverbose'
    299         logging_verbosity = 3
    300     endif
    301 
    302     #add_project_arguments('-DGNUNET_EXTRA_LOGGING=@0@'.format(logging_verbosity), language: 'c')
    303 
    304 
    305     # todo gcov has meson builtin
    306 
    307     # Used to populate configuration file and script templates
    308 
    309 
    310     libltversions = [
    311         ['libanastasis', '0:0:0'],
    312         ['libanastasisutil', '0:0:0'],
    313         ['libanastasisauthorization', '0:0:0'],
    314         ['libanastasiseufin', '0:0:0'],
    315         ['libanastasisdb', '2:0:0'],
    316         ['libanastasisrest', '0:0:0'],
    317         ['libanastasistesting', '0:0:0'],
    318         ['libanastasisredux', '0:0:0'],
    319     ]
    320 
    321     solibversions = {}
    322 
    323     foreach libversion : libltversions
    324         ltversion = libversion[1].split(':')
    325         current = ltversion[0].to_int()
    326         revision = ltversion[1].to_int()
    327         age = ltversion[2].to_int()
    328         soversion_str = '@0@'.format(current - age)
    329         ltversion_str = '@0@.@1@.@2@'.format(current - age, age, revision)
    330         solibversions = solibversions + {
    331             libversion[0]: {
    332                 'soversion': soversion_str,
    333                 'version': ltversion_str,
    334             },
    335         }
    336     endforeach
    337 
    338     private_config.set_quoted('PACKAGE', meson.project_name())
    339     private_config.set_quoted('PACKAGE_VERSION', meson.project_version())
    340     # Compatibility. Used in source.
    341     private_config.set_quoted('VERSION', meson.project_version())
    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