donau

Donation authority for GNU Taler (experimental)
Log | Files | Refs | Submodules | README | LICENSE

meson.build (10924B)


      1 project(
      2     'donau',
      3     'c',
      4     license: 'AGPLv3',
      5     meson_version: '>=1.1.0',
      6     version: '1.5.1',
      7 )
      8 
      9 cc = meson.get_compiler('c')
     10 incdir = include_directories('src/include', 'src/include/donau-database')
     11 
     12 # Used to populate gnunet_private_config.h
     13 private_config = configuration_data()
     14 
     15 pkgcfgdir = get_option('datadir') / 'donau' / 'config.d'
     16 docdir = get_option('datadir') / 'doc' / 'donau'
     17 
     18 if get_option('install-rpath')
     19     rpath_option = get_option('prefix') / get_option('libdir')
     20 else
     21     rpath_option = ''
     22 endif
     23 
     24 install_emptydir(docdir)
     25 install_data('README', 'COPYING', install_dir: docdir)
     26 
     27 gnunet_user = false
     28 dpkg_architecture_bin = find_program(
     29     'dpkg-architecture',
     30     '/usr/bin/getent',
     31     required: false,
     32 )
     33 if dpkg_architecture_bin.found()
     34     private_config.set(
     35         'MULTIARCH',
     36         dpkg_architecture_bin.full_path() + ' -qDEB_HOST_MULTIARCH',
     37     )
     38 endif
     39 
     40 TALER_PLUGIN_LDFLAGS = [
     41     '-export-dynamic',
     42     '-avoid-version',
     43     '-module',
     44     '--no-undefined',
     45 ]
     46 
     47 if not get_option('only-doc')
     48     add_project_arguments(
     49         '-Wall',
     50         '-Wno-address-of-packed-member',
     51         language: 'c',
     52     )
     53     taler_lib_ldflags = '-export-dynamic -no-undefined'
     54 
     55     check_headers = [
     56         'stdint.h',
     57         'stdlib.h',
     58         'string.h',
     59         'unistd.h',
     60         'sys/socket.h',
     61         'sys/un.h',
     62         'netinet/in.h',
     63         'netinet/ip.h',
     64     ]
     65 
     66     foreach h : check_headers
     67         if cc.check_header(h)
     68             define = 'HAVE_' + h.underscorify().to_upper()
     69             message(define)
     70             private_config.set(define, 1)
     71         endif
     72     endforeach
     73 
     74 
     75     private_config.set10('HAVE_EXPENSIVE_TESTS', get_option('expensivetests'))
     76 
     77     have_epoll = false
     78     if get_option('enable-epoll') != 'no'
     79         have_epoll = cc.has_header('sys/epoll.h')
     80     endif
     81     private_config.set10('EPOLL_SUPPORT', have_epoll)
     82     if have_epoll
     83         private_config.set10(
     84             'HAVE_EPOLL_CREATE1',
     85             cc.has_header_symbol('sys/epoll.h', 'epoll_create1'),
     86         )
     87     elif get_option('enable-epoll') == 'yes'
     88         error(
     89             'Support for epoll was explicitly requested but cannot be enabled on this platform.',
     90         )
     91     endif
     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.0')
    114     #add_project_arguments('-DNEED_LIBGCRYPT_VERSION="1.6.0"', language: 'c')
    115 
    116     gnunetutil_dep = dependency('gnunetutil', required: false)
    117     if not gnunetutil_dep.found()
    118         gnunetutil_dep = cc.find_library('gnunetutil', required: true)
    119     endif
    120 
    121     gnunetjson_dep = dependency('gnunetjson', required: false)
    122     if not gnunetjson_dep.found()
    123         gnunetjson_dep = cc.find_library('gnunetjson', required: true)
    124     endif
    125     cc.has_header_symbol(
    126         'gnunet/gnunet_json_lib.h',
    127         'GNUNET_JSON_spec_string',
    128         dependencies: [gnunetjson_dep],
    129         required: true,
    130     )
    131 
    132     zlib_dep = dependency('zlib', required: false)
    133     if not zlib_dep.found()
    134         zlib_dep = cc.find_library('zlib', required: true)
    135     endif
    136     m_dep = cc.find_library('m', required: false)
    137     if m_dep.found()
    138         private_config.set('HAVE_LIBM', 1)
    139     endif
    140 
    141     curl_dep = dependency('libcurl', version: '>=7.34.0', required: false)
    142     if not curl_dep.found()
    143         curl_dep = cc.find_library('curl', required: true)
    144         curl_version_check = '''#include <curl/curl.h>
    145   int main(int argc, char **argv) {
    146     #if LIBCURL_VERSION_NUM < 0x073400
    147       #error "cURL version >= 7.34.0 required"
    148     #endif
    149     return 0;
    150     }
    151   '''
    152         if not cc.compiles(
    153             curl_version_check,
    154             name: 'cURL version check',
    155             dependencies: curl_dep,
    156         )
    157             error('cURL version >=7.34.0 required')
    158         endif
    159     endif
    160 
    161     gnunetcurl_dep = dependency('gnunetcurl', required: false)
    162     if not gnunetcurl_dep.found()
    163         gnunetcurl_dep = cc.find_library('gnunetcurl', required: true)
    164     endif
    165     cc.has_header_symbol(
    166         'gnunet/gnunet_curl_lib.h',
    167         'GNUNET_CURL_get_select_info',
    168         dependencies: [gnunetcurl_dep],
    169         required: true,
    170     )
    171 
    172     pq_dep = dependency('libpq', required: false)
    173     if not pq_dep.found()
    174         pq_dep = cc.find_library('pq', required: true)
    175     endif
    176 
    177     gnunetpq_dep = dependency('gnunetpq', required: false)
    178     if not gnunetpq_dep.found()
    179         gnunetpq_dep = cc.find_library('gnunetpq', required: true)
    180     endif
    181     cc.has_header_symbol(
    182         'gnunet/gnunet_pq_lib.h',
    183         'GNUNET_PQ_result_spec_blinded_sig',
    184         required: true,
    185         dependencies: [
    186 	    gnunetpq_dep,
    187 	    pq_dep,
    188 	],
    189     )
    190 
    191     talerutil_dep = dependency('talerutil', required: false)
    192     if not talerutil_dep.found()
    193         talerutil_dep = cc.find_library('talerutil', required: true)
    194     endif
    195     talerjson_dep = dependency('talerjson', required: false)
    196     if not talerjson_dep.found()
    197         talerjson_dep = cc.find_library('talerjson', required: true)
    198     endif
    199     talermhd_dep = dependency('talermhd', required: false)
    200     if not talermhd_dep.found()
    201         talermhd_dep = cc.find_library('talermhd', required: true)
    202     endif
    203     talerpq_dep = dependency('talerpq', required: false)
    204     if not talerpq_dep.found()
    205         talerpq_dep = cc.find_library('talerpq', required: true)
    206     endif
    207     talercurl_dep = dependency('talercurl', required: false)
    208     if not talercurl_dep.found()
    209         talercurl_dep = cc.find_library('talercurl', required: true)
    210     endif
    211     talertesting_dep = dependency('talertesting', required: false)
    212     if not talertesting_dep.found()
    213         talertesting_dep = cc.find_library('talertesting', required: true)
    214     endif
    215 
    216     gnunetsq_dep = dependency('gnunetsq', required: false)
    217     if not gnunetsq_dep.found()
    218         gnunetsq_dep = cc.find_library('gnunetsq', required: true)
    219     endif
    220     have_gnunetsq = cc.has_header_symbol(
    221         'gnunet/gnunet_sq_lib.h',
    222         'GNUNET_PQ_result_spec_string',
    223         dependencies: [gnunetsq_dep],
    224         required: false,
    225     )
    226     sodium_dep = dependency('libsodium', required: false, version: '>=1.0.18')
    227     if not sodium_dep.found()
    228         sodium_dep = cc.find_library('sodium', required: true)
    229         sodium_version_check = '''#include <sodium.h>
    230   int main(int argc, char **argv) {
    231     #if !((SODIUM_LIBRARY_VERSION_MAJOR > 10) || \
    232          ((SODIUM_LIBRARY_VERSION_MAJOR == 10) && \
    233          (SODIUM_LIBRARY_VERSION_MINOR >= 3)))
    234       #error "libsodium version >= 1.0.18 required"
    235     #endif
    236     return 0
    237     }
    238   '''
    239         if not cc.compiles(
    240             sodium_version_check,
    241             name: 'sodium version check',
    242             dependencies: sodium_dep,
    243         )
    244             error('libsodium version >=1.0.18 required')
    245         endif
    246     endif
    247 
    248     sqlite_dep = dependency('sqlite3', version: '>=3.35.0', required: false)
    249     # FIXME for fallbacks, we need to manually check version
    250     if not sqlite_dep.found()
    251         sqlite_dep = cc.find_library('sqlite3', required: false)
    252         sqlite_version_check = '''#include <sqlite3.h>
    253   int main(int argc, char **argv) {
    254     #if SQLITE_VERSION_NUMBER < 3035000
    255       #error "SQLite version >= 3.35.0 required"
    256     #endif
    257     return 0;
    258   }
    259   '''
    260         if not cc.compiles(
    261             sqlite_version_check,
    262             name: 'sqlite version check',
    263             dependencies: sqlite_dep,
    264         )
    265             error('Sqlite version >= 3.35.0 requried')
    266         endif
    267     endif
    268 
    269     private_config.set10('HAVE_SQLITE', have_gnunetsq and sqlite_dep.found())
    270     unistr_dep = dependency('libunistring', required: false)
    271     if not unistr_dep.found()
    272         unistr_dep = cc.find_library('unistring', required: true)
    273     endif
    274 
    275     logging_opt = get_option('logging')
    276     logging_verbosity = 0
    277 
    278     if logging_opt == 'yes'
    279         logging_verbosity = 1
    280     endif
    281     if logging_opt == 'no'
    282         add_project_arguments('-DGNUNET_CULL_LOGGING=1', language: 'c')
    283     endif
    284     if logging_opt == 'verbose'
    285         logging_verbosity = 2
    286     endif
    287     if logging_opt == 'veryverbose'
    288         logging_verbosity = 3
    289     endif
    290 
    291     #add_project_arguments('-DGNUNET_EXTRA_LOGGING=@0@'.format(logging_verbosity), language: 'c')
    292 
    293 
    294     # todo gcov has meson builtin
    295 
    296     # Used to populate configuration file and script templates
    297 
    298 
    299     libltversions = [
    300         ['libdonau', '5:0:0'],
    301         ['libdonauutil', '0:0:0'],
    302         ['libdonaujson', '1:0:1'],
    303         ['libdonaupq', '0:0:0'],
    304         ['libdonautesting', '0:0:0'],
    305         ['libdonaudb', '1:0:0'],
    306     ]
    307 
    308     solibversions = {}
    309 
    310     foreach libversion : libltversions
    311         ltversion = libversion[1].split(':')
    312         current = ltversion[0].to_int()
    313         revision = ltversion[1].to_int()
    314         age = ltversion[2].to_int()
    315         soversion_str = '@0@'.format(current - age)
    316         ltversion_str = '@0@.@1@.@2@'.format(current - age, age, revision)
    317         solibversions = solibversions + {
    318             libversion[0]: {
    319                 'soversion': soversion_str,
    320                 'version': ltversion_str,
    321             },
    322         }
    323     endforeach
    324 
    325     private_config.set_quoted('PACKAGE_VERSION', meson.project_version())
    326     # Compatibility. Used in source.
    327     private_config.set_quoted('VERSION', meson.project_version())
    328     private_config.set_quoted('VCS_VERSION', 'mesonbuild')
    329     private_config.set_quoted('PACKAGE_BUGREPORT', 'taler@gnu.org')
    330     configure_file(output: 'donau_config.h', configuration: private_config)
    331     configuration_inc = include_directories('.')
    332 
    333     cdata = configuration_data()
    334     cdata.merge_from(private_config)
    335     add_project_arguments('-DHAVE_CONFIG_H', language: 'c')
    336 
    337     pkg = import('pkgconfig')
    338     subdir('contrib')
    339     subdir('src')
    340     if not get_option('disable-doc')
    341         subdir('doc')
    342     endif
    343 
    344     taler_prefix = get_option('prefix') / get_option('libdir')
    345 
    346     add_test_setup(
    347         'default',
    348         env: ['DONAU_PREFIX=' + taler_prefix],
    349         exclude_suites: ['perf', 'installcheck', 'integrationtests'],
    350         is_default: true,
    351     )
    352 else
    353     subdir('contrib')
    354     if not get_option('disable-doc')
    355         subdir('doc')
    356     endif
    357 endif
    358 
    359 run_target(
    360     'doxygen',
    361     command: 'scripts/doxygen.meson.sh',
    362     env: {'PACKAGE_VERSION': meson.project_version()},
    363 )
    364 #meson.add_dist_script('meson-dist-script')