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