meson.build (11788B)
1 project( 2 'sync', 3 'c', 4 license: 'AGPLv3', 5 meson_version: '>=1.1.0', 6 version: run_command('sh', 'scripts/get_version.sh', check: true).stdout().strip(), 7 ) 8 9 cc = meson.get_compiler('c') 10 incdir = include_directories( 11 'src/include', 12 'src/include/sync', 13 'src/include/sync/sync-database', 14 ) 15 16 # Used to populate gnunet_private_config.h 17 private_config = configuration_data() 18 19 pkgcfgdir = get_option('datadir') / 'sync' / 'config.d' 20 docdir = get_option('datadir') / 'doc' / 'sync' 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/getent', 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 71 mhd_dep = dependency('libmicrohttpd', required: false) 72 if not mhd_dep.found() 73 mhd_dep = cc.find_library('microhttpd', required: true) 74 endif 75 76 # sync-httpd2 is the only daemon we build, so MHD2 is mandatory. 77 mhd2_dep = dependency('libmicrohttpd2', required: false) 78 if not mhd2_dep.found() 79 mhd2_dep = cc.find_library('microhttpd2', required: true) 80 endif 81 82 json_dep = dependency('jansson', required: false) 83 if not json_dep.found() 84 json_dep = cc.find_library('jansson', required: true) 85 endif 86 87 gcrypt_dep = dependency('libgcrypt', required: false) 88 if not gcrypt_dep.found() 89 gcrypt_dep = cc.find_library('gcrypt', required: true) 90 endif 91 92 private_config.set_quoted('NEED_LIBGCRYPT_VERSION', '1.6.1') 93 94 gnunetutil_dep = dependency('gnunetutil', required: false) 95 if not gnunetutil_dep.found() 96 gnunetutil_dep = cc.find_library('gnunetutil', required: true) 97 endif 98 99 cc.has_header_symbol( 100 'gnunet/gnunet_util_lib.h', 101 'GNUNET_TIME_round_up', 102 dependencies: [gnunetutil_dep], 103 required: true, 104 ) 105 106 gnunetjson_dep = dependency('gnunetjson', required: false) 107 if not gnunetjson_dep.found() 108 gnunetjson_dep = cc.find_library('gnunetjson', required: true) 109 endif 110 111 gnunetmhd_dep = dependency('gnunetmhd', required: false) 112 if not gnunetmhd_dep.found() 113 gnunetmhd_dep = cc.find_library('gnunetmhd', required: true) 114 endif 115 cc.has_header_symbol( 116 'gnunet/gnunet_mhd_lib.h', 117 'GNUNET_MHD_post_parser', 118 dependencies: [gnunetmhd_dep], 119 required: true, 120 ) 121 122 curl_dep = dependency('libcurl', version: '>=7.34.0', required: false) 123 if not curl_dep.found() 124 curl_dep = cc.find_library('curl', required: true) 125 curl_version_check = '''#include <curl/curl.h> 126 int main(int argc, char **argv) { 127 #if LIBCURL_VERSION_NUM < 0x073400 128 #error "cURL version >= 7.34.0 required" 129 #endif 130 return 0; 131 } 132 ''' 133 if not cc.compiles( 134 curl_version_check, 135 name: 'cURL version check', 136 dependencies: curl_dep, 137 ) 138 error('cURL version >=7.34.0 required') 139 endif 140 endif 141 142 gnunetcurl_dep = dependency('gnunetcurl', required: false) 143 if not gnunetcurl_dep.found() 144 gnunetcurl_dep = cc.find_library('gnunetcurl', required: true) 145 endif 146 cc.has_header_symbol( 147 'gnunet/gnunet_curl_lib.h', 148 'GNUNET_CURL_get_select_info', 149 dependencies: [gnunetcurl_dep], 150 required: true, 151 ) 152 153 pq_dep = dependency('libpq', required: false) 154 if not pq_dep.found() 155 pq_dep = cc.find_library('pq', required: true) 156 endif 157 158 gnunetpq_dep = dependency('gnunetpq', required: false) 159 if not gnunetpq_dep.found() 160 gnunetpq_dep = cc.find_library('gnunetpq', required: true) 161 endif 162 cc.has_header_symbol( 163 'gnunet/gnunet_pq_lib.h', 164 'GNUNET_PQ_query_param_blind_sign_priv', 165 required: true, 166 dependencies: [pq_dep, gnunetpq_dep], 167 ) 168 private_config.set10('HAVE_GNUNETPQ', gnunetpq_dep.found()) 169 170 talerutil_dep = dependency('talerutil', required: false) 171 if not talerutil_dep.found() 172 talerutil_dep = cc.find_library('talerutil', required: true) 173 endif 174 cc.has_header_symbol( 175 'taler/taler_util.h', 176 'TALER_merchant_instance_auth_hash_with_salt', 177 required: true, 178 dependencies: [talerutil_dep], 179 ) 180 private_config.set10('HAVE_TALERUTIL', talerutil_dep.found()) 181 182 talercurl_dep = dependency('talercurl', required: false) 183 if not talercurl_dep.found() 184 talercurl_dep = cc.find_library('talercurl', required: true) 185 endif 186 talerkyclogic_dep = dependency('talerkyclogic', required: false) 187 if not talerkyclogic_dep.found() 188 talerkyclogic_dep = cc.find_library('talerkyclogic', required: true) 189 endif 190 talerbank_dep = dependency('talerbank', required: false) 191 if not talerbank_dep.found() 192 talerbank_dep = cc.find_library('talerbank', required: true) 193 endif 194 talerfakebank_dep = dependency('talerfakebank', required: false) 195 if not talerfakebank_dep.found() 196 talerfakebank_dep = cc.find_library('talerfakebank', required: false) 197 endif 198 talertemplating_dep = dependency('talertemplating', required: false) 199 if not talertemplating_dep.found() 200 talertemplating_dep = cc.find_library('talertemplating', required: true) 201 endif 202 talertesting_dep = dependency('talertesting', required: false) 203 if not talertesting_dep.found() 204 talertesting_dep = cc.find_library('talertesting', required: true) 205 endif 206 207 talerexchange_dep = dependency('talerexchange', required: false) 208 if not talerexchange_dep.found() 209 talerexchange_dep = cc.find_library('talerexchange', required: true) 210 endif 211 cc.has_header_symbol( 212 'taler/taler_exchange_service.h', 213 'TALER_EXCHANGE_keys_test_account_allowed', 214 required: true, 215 dependencies: [talerexchange_dep], 216 ) 217 private_config.set10('HAVE_TALEREXCHANGE', talerexchange_dep.found()) 218 219 talermhd_dep = dependency('talermhd', required: false) 220 if not talermhd_dep.found() 221 talermhd_dep = cc.find_library('talermhd', required: true) 222 endif 223 cc.has_header_symbol( 224 'taler/taler_mhd_lib.h', 225 'TALER_MHD_parse_request_arg_rel_time', 226 required: true, 227 dependencies: [talermhd_dep], 228 ) 229 private_config.set10('HAVE_TALERMHD', talermhd_dep.found()) 230 231 talermhd2_dep = dependency('talermhd2', required: false) 232 if not talermhd2_dep.found() 233 talermhd2_dep = cc.find_library('talermhd2', required: true) 234 endif 235 cc.has_header_symbol( 236 'taler/taler_mhd2_lib.h', 237 'TALER_MHD2_get_date_string', 238 required: true, 239 dependencies: [talermhd2_dep], 240 ) 241 private_config.set10('HAVE_TALERMHD2', talermhd2_dep.found()) 242 243 talerjson_dep = dependency('talerjson', required: false) 244 if not talerjson_dep.found() 245 talerjson_dep = cc.find_library('talerjson', required: true) 246 endif 247 cc.has_header_symbol( 248 'taler/taler_json_lib.h', 249 'TALER_JSON_currency_specs_to_json', 250 required: true, 251 dependencies: [talerjson_dep], 252 ) 253 private_config.set10('HAVE_TALERJSON', talerjson_dep.found()) 254 255 256 talerpq_dep = dependency('talerpq', required: false) 257 if not talerpq_dep.found() 258 talerpq_dep = cc.find_library('talerpq', required: true) 259 endif 260 cc.has_header_symbol( 261 'taler/taler_pq_lib.h', 262 'TALER_PQ_query_param_array_blinded_denom_sig', 263 required: true, 264 dependencies: [talerpq_dep, pq_dep], 265 ) 266 private_config.set10('HAVE_TALERPQ', talerpq_dep.found()) 267 268 talermerchant_dep = dependency('talermerchant', required: false) 269 if not talermerchant_dep.found() 270 talermerchant_dep = cc.find_library('talermerchant', required: true) 271 endif 272 cc.has_header_symbol( 273 'taler/taler_merchant_service.h', 274 'TALER_MERCHANT_get_private_order_create', 275 required: true, 276 dependencies: [talermerchant_dep], 277 ) 278 talermerchanttesting_dep = dependency( 279 'talermerchanttesting', 280 required: false, 281 ) 282 if not talermerchanttesting_dep.found() 283 talermerchanttesting_dep = cc.find_library( 284 'talermerchanttesting', 285 required: true, 286 ) 287 endif 288 m_dep = cc.find_library('m', required: false) 289 if m_dep.found() 290 private_config.set('HAVE_LIBM', 1) 291 endif 292 293 294 logging_opt = get_option('logging') 295 logging_verbosity = 0 296 297 if logging_opt == 'yes' 298 logging_verbosity = 1 299 endif 300 if logging_opt == 'no' 301 add_project_arguments('-DGNUNET_CULL_LOGGING=1', language: 'c') 302 endif 303 if logging_opt == 'verbose' 304 logging_verbosity = 2 305 endif 306 if logging_opt == 'veryverbose' 307 logging_verbosity = 3 308 endif 309 310 libltversions = [ 311 ['libsync', '0:1:0'], 312 ['libsyncutil', '0:1:0'], 313 ['libsynctesting', '0:1:0'], 314 ['libsyncdb', '1:0:0'], 315 ] 316 317 solibversions = {} 318 319 foreach libversion : libltversions 320 ltversion = libversion[1].split(':') 321 current = ltversion[0].to_int() 322 revision = ltversion[1].to_int() 323 age = ltversion[2].to_int() 324 soversion_str = '@0@'.format(current - age) 325 ltversion_str = '@0@.@1@.@2@'.format(current - age, age, revision) 326 solibversions = solibversions + { 327 libversion[0]: { 328 'soversion': soversion_str, 329 'version': ltversion_str, 330 }, 331 } 332 endforeach 333 334 private_config.set_quoted('PACKAGE_VERSION', meson.project_version()) 335 # Compatibility. Used in source. 336 private_config.set_quoted('VERSION', meson.project_version()) 337 private_config.set_quoted('PACKAGE_BUGREPORT', 'taler@gnu.org') 338 configure_file(output: 'sync_config.h', configuration: private_config) 339 configuration_inc = include_directories('.') 340 341 cdata.merge_from(private_config) 342 add_project_arguments('-DHAVE_CONFIG_H', language: 'c') 343 344 pkg = import('pkgconfig') 345 subdir('contrib') 346 subdir('src') 347 if get_option('doc') 348 subdir('doc') 349 endif 350 351 # The variable name must match GNUNET_OS_ProjectData.env_varname in 352 # src/util/os_installation.c. Otherwise GNUnet falls back to locating 353 # $DATADIR relative to libsyncutil, which under the build-tree 354 # LD_LIBRARY_PATH that meson injects resolves into the build directory, 355 # and the tests fail to find the installed SQL files. 356 sync_prefix = get_option('prefix') / get_option('libdir') 357 358 add_test_setup( 359 'default', 360 env: ['SYNC_PREFIX=' + sync_prefix], 361 exclude_suites: ['perf', 'installcheck', 'integrationtests'], 362 is_default: true, 363 ) 364 else 365 subdir('contrib') 366 if get_option('doc') 367 subdir('doc') 368 endif 369 endif 370 371 run_target( 372 'doxygen', 373 command: 'scripts/doxygen.meson.sh', 374 env: {'PACKAGE_VERSION': meson.project_version()}, 375 ) 376 377 meson.add_dist_script('meson-dist-script') 378