1project('gstreamer', 'c', 2 version : '1.16.2', 3 meson_version : '>= 0.47', 4 default_options : [ 'warning_level=1', 5 'buildtype=debugoptimized' ]) 6 7gst_version = meson.project_version() 8version_arr = gst_version.split('.') 9gst_version_major = version_arr[0].to_int() 10gst_version_minor = version_arr[1].to_int() 11gst_version_micro = version_arr[2].to_int() 12if version_arr.length() == 4 13 gst_version_nano = version_arr[3].to_int() 14else 15 gst_version_nano = 0 16endif 17gst_version_is_dev = gst_version_minor % 2 == 1 and gst_version_micro < 90 18 19host_system = host_machine.system() 20 21apiversion = '1.0' 22soversion = 0 23# maintaining compatibility with the previous libtool versioning 24# current = minor * 100 + micro 25curversion = gst_version_minor * 100 + gst_version_micro 26libversion = '@0@.@1@.0'.format(soversion, curversion) 27osxversion = curversion + 1 28 29prefix = get_option('prefix') 30 31libexecdir = get_option('libexecdir') 32helpers_install_dir = join_paths(libexecdir, 'gstreamer-1.0') 33 34cc = meson.get_compiler('c') 35 36cdata = configuration_data() 37 38# Ignore several spurious warnings for things gstreamer does very commonly 39# If a warning is completely useless and spammy, use '/wdXXXX' to suppress it 40# If a warning is harmless but hard to fix, use '/woXXXX' so it's shown once 41# NOTE: Only add warnings here if you are sure they're spurious 42if cc.get_id() == 'msvc' 43 add_project_arguments( 44 '/wd4018', # implicit signed/unsigned conversion 45 '/wd4146', # unary minus on unsigned (beware INT_MIN) 46 '/wd4244', # lossy type conversion (e.g. double -> int) 47 '/wd4305', # truncating type conversion (e.g. double -> float) 48 cc.get_supported_arguments(['/utf-8']), # set the input encoding to utf-8 49 language : 'c') 50elif cc.has_link_argument('-Wl,-Bsymbolic-functions') 51 # FIXME: Add an option for this if people ask for it 52 add_project_link_arguments('-Wl,-Bsymbolic-functions', language : 'c') 53endif 54 55# Symbol visibility 56have_visibility_hidden = false 57if cc.get_id() == 'msvc' 58 export_define = '__declspec(dllexport) extern' 59elif cc.has_argument('-fvisibility=hidden') 60 add_project_arguments('-fvisibility=hidden', language: 'c') 61 export_define = 'extern __attribute__ ((visibility ("default")))' 62 have_visibility_hidden = true 63else 64 export_define = 'extern' 65endif 66 67# Passing this through the command line would be too messy 68cdata.set('GST_API_EXPORT', export_define) 69 70# Disable strict aliasing 71if cc.has_argument('-fno-strict-aliasing') 72 add_project_arguments('-fno-strict-aliasing', language: 'c') 73endif 74 75# Define G_DISABLE_DEPRECATED for development versions 76if gst_version_is_dev 77 message('Disabling deprecated GLib API') 78 add_project_arguments('-DG_DISABLE_DEPRECATED', language: 'c') 79endif 80 81cast_checks = get_option('gobject-cast-checks') 82if cast_checks.disabled() or (cast_checks.auto() and not gst_version_is_dev) 83 message('Disabling GLib cast checks') 84 add_project_arguments('-DG_DISABLE_CAST_CHECKS', language: 'c') 85endif 86 87glib_asserts = get_option('glib-asserts') 88if glib_asserts.disabled() or (glib_asserts.auto() and not gst_version_is_dev) 89 message('Disabling GLib asserts') 90 add_project_arguments('-DG_DISABLE_ASSERT', language: 'c') 91endif 92 93glib_checks = get_option('glib-checks') 94if glib_checks.disabled() or (glib_checks.auto() and not gst_version_is_dev) 95 message('Disabling GLib checks') 96 add_project_arguments('-DG_DISABLE_CHECKS', language: 'c') 97endif 98 99cdata.set_quoted('GST_API_VERSION', apiversion) 100cdata.set_quoted('GST_DATADIR', join_paths(prefix, get_option('datadir'))) 101cdata.set_quoted('LOCALEDIR', join_paths(prefix, get_option('localedir'))) 102cdata.set_quoted('LIBDIR', join_paths(prefix, get_option('libdir'))) 103cdata.set_quoted('GST_API_VERSION', '1.0') 104cdata.set_quoted('GETTEXT_PACKAGE', 'gstreamer-1.0') 105cdata.set_quoted('GST_LICENSE', 'LGPL') 106cdata.set_quoted('PACKAGE', 'gstreamer') 107cdata.set_quoted('PACKAGE_NAME', 'GStreamer') 108cdata.set_quoted('PACKAGE_STRING', 'GStreamer @0@'.format(gst_version)) 109cdata.set_quoted('PACKAGE_TARNAME', 'gstreamer') 110cdata.set_quoted('PACKAGE_BUGREPORT', 'http://bugzilla.gnome.org/enter_bug.cgi?product=GStreamer') 111cdata.set_quoted('PACKAGE_URL', '') 112cdata.set_quoted('PACKAGE_VERSION', gst_version) 113cdata.set_quoted('PLUGINDIR', join_paths(get_option('prefix'), get_option('libdir'), 'gstreamer-1.0')) 114cdata.set_quoted('VERSION', gst_version) 115cdata.set_quoted('GST_PLUGIN_SCANNER_INSTALLED', join_paths(prefix, helpers_install_dir, 'gst-plugin-scanner')) 116cdata.set_quoted('GST_PTP_HELPER_INSTALLED', join_paths(prefix, helpers_install_dir, 'gst-ptp-helper')) 117cdata.set_quoted('GST_PLUGIN_SUBDIR', get_option('libdir'), 118 description: 'plugin directory path component, used to find plugins on relocatable builds on windows') 119cdata.set_quoted('GST_PLUGIN_SCANNER_SUBDIR', libexecdir, 120 description: 'libexecdir path component, used to find plugin-scanner on relocatable builds on windows') 121cdata.set('GST_DISABLE_OPTION_PARSING', not get_option('option-parsing')) 122 123mem_align_opt = get_option('memory-alignment') 124if mem_align_opt == 'malloc' 125 cdata.set('MEMORY_ALIGNMENT_MALLOC', 1) 126elif mem_align_opt == 'pagesize' 127 cdata.set('MEMORY_ALIGNMENT_PAGESIZE', 1) 128else 129 cdata.set('MEMORY_ALIGNMENT', mem_align_opt.to_int()) 130endif 131 132if ['darwin', 'ios'].contains(host_system) 133 cdata.set_quoted('GST_EXTRA_MODULE_SUFFIX', '.dylib') 134endif 135 136if gst_version_nano > 0 137 # Have GST_ERROR message printed when running from git 138 cdata.set('GST_LEVEL_DEFAULT', 'GST_LEVEL_ERROR') 139else 140 cdata.set('GST_LEVEL_DEFAULT', 'GST_LEVEL_NONE') 141endif 142 143# GStreamer package name and origin url 144gst_package_name = get_option('package-name') 145if gst_package_name == '' 146 if gst_version_nano == 0 147 gst_package_name = 'GStreamer source release' 148 elif gst_version_nano == 1 149 gst_package_name = 'GStreamer git' 150 else 151 gst_package_name = 'GStreamer prerelease' 152 endif 153endif 154cdata.set_quoted('GST_PACKAGE_NAME', gst_package_name) 155cdata.set_quoted('GST_PACKAGE_ORIGIN', get_option('package-origin')) 156 157# These are only needed/used by the ABI tests 158host_defines = [ 159 [ 'x86', 'HAVE_CPU_I386' ], 160 [ 'x86_64', 'HAVE_CPU_X86_64' ], 161 [ 'arm', 'HAVE_CPU_ARM' ], 162 [ 'aarch64', 'HAVE_CPU_AARCH64' ], 163 [ 'mips', 'HAVE_CPU_MIPS' ], 164 [ 'powerpc', 'HAVE_CPU_PPC' ], 165 [ 'powerpc64', 'HAVE_CPU_PPC64' ], 166 [ 'alpha', 'HAVE_CPU_ALPHA' ], 167 [ 'sparc', 'HAVE_CPU_SPARC' ], 168 [ 'ia64', 'HAVE_CPU_IA64' ], 169 [ 'hppa', 'HAVE_CPU_HPPA' ], 170 [ 'm68k', 'HAVE_CPU_M68K' ], 171 [ 's390', 'HAVE_CPU_S390' ], 172] 173foreach h : host_defines 174 if h.get(0) == host_machine.cpu() 175 cdata.set(h.get(1), 1) 176 endif 177endforeach 178# FIXME: should really be called HOST_CPU or such 179cdata.set_quoted('TARGET_CPU', host_machine.cpu()) 180 181check_headers = [ 182 'dlfcn.h', 183 'inttypes.h', 184 'memory.h', 185 'poll.h', 186 'stdint.h', 187 'stdio_ext.h', 188 'strings.h', 189 'string.h', 190 'sys/param.h', 191 'sys/poll.h', 192 'sys/prctl.h', 193 'sys/socket.h', 194 'sys/stat.h', 195 'sys/times.h', 196 'sys/time.h', 197 'sys/types.h', 198 'sys/utsname.h', 199 'sys/wait.h', 200 'ucontext.h', 201 'unistd.h', 202 'valgrind/valgrind.h', 203 'sys/resource.h', 204] 205 206if host_system == 'windows' 207 check_headers += ['winsock2.h'] 208endif 209 210foreach h : check_headers 211 if cc.has_header(h) 212 define = 'HAVE_' + h.underscorify().to_upper() 213 cdata.set(define, 1) 214 endif 215endforeach 216 217if cc.has_member('struct tm', 'tm_gmtoff', prefix : '#include <time.h>') 218 cdata.set('HAVE_TM_GMTOFF', 1) 219endif 220 221check_functions = [ 222 'gmtime_r', 223 'sigaction', 224 'getrusage', 225 'fseeko', 226 'ftello', 227 'poll', 228 'ppoll', 229 'pselect', 230 'getpagesize', 231 'clock_gettime', 232 # These are needed by libcheck 233 'getline', 234 'mkstemp', 235 'alarm', 236 'gettimeofday', 237] 238 239foreach f : check_functions 240 if cc.has_function(f) 241 define = 'HAVE_' + f.underscorify().to_upper() 242 cdata.set(define, 1) 243 endif 244endforeach 245 246if cc.has_function('localtime_r', prefix : '#include<time.h>') 247 cdata.set('HAVE_LOCALTIME_R', 1) 248 # Needed by libcheck 249 cdata.set('HAVE_DECL_LOCALTIME_R', 1) 250endif 251 252if cc.links('''#include <pthread.h> 253 int main() { 254 pthread_setname_np("example"); return 0; 255 }''', name : 'pthread_setname_np(const char*)') 256 cdata.set('HAVE_PTHREAD_SETNAME_NP_WITHOUT_TID', 1) 257endif 258 259# Check for posix timers and the monotonic clock 260time_prefix = '#include <time.h>\n' 261if cdata.has('HAVE_UNISTD_H') 262 time_prefix += '#include <unistd.h>' 263endif 264 265posix_timers_src = time_prefix + ''' 266#if !defined(_POSIX_TIMERS) || _POSIX_TIMERS < 0 || !defined(CLOCK_REALTIME) 267#error Either _POSIX_TIMERS or CLOCK_REALTIME not defined 268#endif 269''' 270if cc.compiles(posix_timers_src, name : 'posix timers from time.h') 271 cdata.set('HAVE_POSIX_TIMERS', 1) 272endif 273 274monotonic_clock_src = time_prefix + ''' 275#if !defined(_POSIX_MONOTONIC_CLOCK) || _POSIX_MONOTONIC_CLOCK < 0 || !defined(CLOCK_MONOTONIC) 276#error Either _POSIX_MONOTONIC_CLOCK or CLOCK_MONOTONIC not defined 277#endif 278''' 279if cc.compiles(monotonic_clock_src, name : 'monotonic clock from time.h') 280 cdata.set('HAVE_MONOTONIC_CLOCK', 1) 281endif 282 283# Check for __uint128_t (gcc) by checking for 128-bit division 284uint128_t_src = '''int main() { 285static __uint128_t v1 = 100; 286static __uint128_t v2 = 10; 287static __uint128_t u; 288u = v1 / v2; 289}''' 290if cc.compiles(uint128_t_src, name : '__uint128_t available') 291 cdata.set('HAVE_UINT128_T', 1) 292endif 293 294# All supported platforms have long long now 295cdata.set('HAVE_LONG_LONG', 1) 296 297# We only want to use the __declspec(dllexport/import) dance in GST_EXPORT when 298# building with MSVC 299if cc.get_id() == 'msvc' 300 cdata.set('GSTCONFIG_BUILT_WITH_MSVC', 1) 301else 302 cdata.set('GSTCONFIG_BUILT_WITH_MSVC', 0) 303endif 304 305# ------------------------------------------------------------------------------------- 306# config.h things needed by libcheck 307# ------------------------------------------------------------------------------------- 308if cc.has_function('getpid') 309 cdata.set('HAVE_GETPID', 1) 310elif host_system == 'windows' and cc.has_function('_getpid') 311 cdata.set('HAVE_PROCESS_H', 1) # Used by gstreamer too 312 cdata.set('HAVE__GETPID', 1) 313endif 314if cc.has_function('strdup') 315 cdata.set('HAVE_DECL_STRDUP', 1) 316elif host_system == 'windows' and cc.has_function('_strdup') 317 cdata.set('HAVE__STRDUP', 1) # Windows (MSVC) 318endif 319if host_system != 'windows' 320 cdata.set('HAVE_FORK', 1) 321else 322 # libcheck requires HAVE_FORK to be 0 when fork() is not available 323 cdata.set('HAVE_FORK', 0) 324endif 325if cc.has_function('strsignal') 326 cdata.set('HAVE_DECL_STRSIGNAL', 1) 327endif 328# Check for availability of types 329if not cc.has_type('clockid_t', prefix : '#include <time.h>') 330 cdata.set('clockid_t', 'int') 331endif 332if not cc.has_type('timer_t', prefix : '#include <time.h>') 333 cdata.set('timer_t', 'int') 334endif 335if not cc.has_members('struct timespec', 'tv_sec', 'tv_nsec', 336 prefix : '#include <time.h>') 337 cdata.set('STRUCT_TIMESPEC_DEFINITION_MISSING', 1) 338endif 339if not cc.has_members('struct itimerspec', 'it_interval', 'it_value', 340 prefix : '#include <time.h>') 341 cdata.set('STRUCT_ITIMERSPEC_DEFINITION_MISSING', 1) 342endif 343 344# Platform deps; only ws2_32 and execinfo for now 345platform_deps = [] 346if host_system == 'windows' 347 platform_deps = [cc.find_library('ws2_32')] 348endif 349 350backtrace_deps = [] 351unwind_dep = dependency('libunwind', required : get_option('libunwind')) 352dw_dep = dependency('libdw', required: get_option('libdw')) 353dbghelp_dep = dependency('DbgHelp', required : get_option('dbghelp')) 354backtrace_deps = [unwind_dep, dw_dep, dbghelp_dep] 355if unwind_dep.found() 356 cdata.set('HAVE_UNWIND', 1) 357 if dw_dep.found() 358 cdata.set('HAVE_DW', 1) 359 else 360 message('Support for backtraces is partial only.') 361 endif 362elif cc.has_function('backtrace') 363 cdata.set('HAVE_BACKTRACE', 1) 364elif dbghelp_dep.found() 365 cdata.set('HAVE_DBGHELP', 1) 366else 367 message('NO backtraces support.') 368endif 369 370if cc.has_header('execinfo.h') 371 if cc.has_function('backtrace', prefix : '#include <execinfo.h>') 372 cdata.set('HAVE_BACKTRACE', 1) 373 else 374 execinfo_dep = cc.find_library('execinfo', required : false) 375 if execinfo_dep.found() and cc.has_function('backtrace', prefix : '#include <execinfo.h>', dependencies : execinfo_dep) 376 cdata.set('HAVE_BACKTRACE', 1) 377 platform_deps += execinfo_dep 378 endif 379 endif 380endif 381 382gst_debug = get_option('gst_debug') 383if not gst_debug 384 add_project_arguments(['-Wno-unused'], language: 'c') 385endif 386 387warning_flags = [ 388 '-Wmissing-declarations', 389 '-Wmissing-prototypes', 390 '-Wredundant-decls', 391 '-Wundef', 392 '-Wwrite-strings', 393 '-Wformat', 394 '-Wformat-nonliteral', 395 '-Wformat-security', 396 '-Wold-style-definition', 397 '-Winit-self', 398 '-Wmissing-include-dirs', 399 '-Waddress', 400 '-Waggregate-return', 401 '-Wno-multichar', 402 '-Wdeclaration-after-statement', 403 '-Wvla', 404 '-Wpointer-arith', 405] 406 407foreach extra_arg : warning_flags 408 if cc.has_argument (extra_arg) 409 add_project_arguments([extra_arg], language: 'c') 410 endif 411endforeach 412 413# Used by the gstutils test 414gmp_dep = cc.find_library('gmp', required : false) 415cdata.set('HAVE_GMP', gmp_dep.found()) 416gsl_dep = cc.find_library('gsl', required : false) 417gslcblas_dep = cc.find_library('gslcblas', required : false) 418cdata.set('HAVE_GSL', gsl_dep.found() and gslcblas_dep.found()) 419test_deps = [gmp_dep, gsl_dep, gslcblas_dep] 420 421# Used by gstinfo.c 422dl_dep = cc.find_library('dl', required : false) 423cdata.set('HAVE_DLADDR', cc.has_function('dladdr', dependencies : dl_dep)) 424cdata.set('GST_ENABLE_EXTRA_CHECKS', get_option('extra-checks')) 425cdata.set('USE_POISONING', get_option('poisoning')) 426 427configinc = include_directories('.') 428libsinc = include_directories('libs') 429privinc = include_directories('gst') 430 431# Find dependencies 432glib_dep = dependency('glib-2.0', version : '>=2.40.0', 433 fallback: ['glib', 'libglib_dep']) 434gobject_dep = dependency('gobject-2.0', 435 fallback: ['glib', 'libgobject_dep']) 436gmodule_dep = dependency('gmodule-2.0', 437 fallback: ['glib', 'libgmodule_dep']) 438if host_system == 'windows' 439 gio_dep = dependency('gio-2.0', 440 fallback: ['glib', 'libgio_dep']) 441else 442 gio_dep = [dependency('gio-2.0', 443 fallback: ['glib', 'libgio_dep']), 444 dependency('gio-unix-2.0', 445 fallback: ['glib', 'libgio_dep'])] 446endif 447 448mathlib = cc.find_library('m', required : false) 449# Needed for timer_create/settime/delete 450# Also provides clock_gettime in glibc < 2.17 451rt_lib = cc.find_library('rt', required : false) 452 453gir = find_program('g-ir-scanner', required : get_option('introspection')) 454gnome = import('gnome') 455 456build_gir = gir.found() and not meson.is_cross_build() 457 458gir_init_section = [ '--add-init-section=extern void gst_init(gint*,gchar**);' + \ 459 'g_setenv("GST_REGISTRY_DISABLE", "yes", TRUE);' + \ 460 'g_setenv("GST_REGISTRY_1.0", "/no/way/this/exists.reg", TRUE);' + \ 461 'g_setenv("GST_PLUGIN_PATH_1_0", "", TRUE);' + \ 462 'g_setenv("GST_PLUGIN_SYSTEM_PATH_1_0", "", TRUE);' + \ 463 'gst_init(NULL,NULL);', '--quiet'] 464 465gst_c_args = ['-DHAVE_CONFIG_H'] 466 467# FIXME: This is only needed on windows and probably breaks when 468# default_library = 'both'. We should add this flag to static_c_args instead 469# when Meson supports it: https://github.com/mesonbuild/meson/issues/3304 470if get_option('default_library') == 'static' 471 gst_c_args += ['-DGST_STATIC_COMPILATION'] 472endif 473 474# Used in gst/parse/meson.build and below 475python3 = import('python').find_installation() 476 477bashcomp_option = get_option('bash-completion') 478bashcomp_dep = dependency('bash-completion', version : '>= 2.0', required : bashcomp_option) 479bash_completions_dir = '' 480bash_helpers_dir = '' 481 482bashcomp_found = false 483if bashcomp_dep.found() 484 bashcomp_found = true 485 bash_completions_dir = bashcomp_dep.get_pkgconfig_variable('completionsdir', define_variable: ['prefix', '.']) 486 if bash_completions_dir == '' 487 msg = 'Found bash-completion but the .pc file did not set \'completionsdir\'.' 488 if bashcomp_option.enabled() 489 error(msg) 490 else 491 message(msg) 492 endif 493 bashcomp_found = false 494 endif 495 496 bash_helpers_dir = bashcomp_dep.get_pkgconfig_variable('helpersdir', define_variable: ['prefix', '.']) 497 if bash_helpers_dir == '' 498 msg = 'Found bash-completion, but the .pc file did not set \'helpersdir\'.' 499 if bashcomp_option.enabled() 500 error(msg) 501 else 502 message(msg) 503 endif 504 bashcomp_found = false 505 endif 506endif 507 508plugins_install_dir = join_paths(get_option('libdir'), 'gstreamer-1.0') 509 510pkgconfig = import('pkgconfig') 511plugins_pkgconfig_install_dir = join_paths(plugins_install_dir, 'pkgconfig') 512if get_option('default_library') == 'shared' 513 # If we don't build static plugins there is no need to generate pc files 514 plugins_pkgconfig_install_dir = disabler() 515endif 516 517subdir('gst') 518subdir('libs') 519subdir('plugins') 520if not get_option('tools').disabled() 521 subdir('tools') 522endif 523subdir('pkgconfig') 524subdir('tests') 525subdir('data') 526 527# xgettext is optional (on Windows for instance) 528if find_program('xgettext', required : get_option('nls')).found() 529 cdata.set('ENABLE_NLS', 1) 530 subdir('po') 531endif 532 533configure_file(output : 'config.h', configuration : cdata) 534 535if build_machine.system() == 'windows' 536 message('Disabling gtk-doc while building on Windows') 537else 538 if find_program('gtkdoc-scan', required : get_option('gtk_doc')).found() 539 subdir('docs') 540 else 541 message('Not building documentation as gtk-doc was not found') 542 endif 543endif 544 545run_command(python3, '-c', 'import shutil; shutil.copy("hooks/pre-commit.hook", ".git/hooks/pre-commit")') 546 547install_data('gst-element-check-1.0.m4', install_dir : join_paths(get_option('datadir'), 'aclocal')) 548