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')