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