1project('gst-plugins-base', 'c', 2 version : '1.20.3', 3 meson_version : '>= 0.59', 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_stable = gst_version_minor.is_even() 18gst_version_is_dev = gst_version_minor % 2 == 1 and gst_version_micro < 90 19 20host_system = host_machine.system() 21 22have_cxx = add_languages('cpp', native: false, required: false) 23 24if host_system in ['ios', 'darwin'] 25 have_objc = add_languages('objc', native: false) 26else 27 have_objc = false 28endif 29 30glib_req = '>= 2.56.0' 31orc_req = '>= 0.4.24' 32 33if gst_version_is_stable 34 gst_req = '>= @0@.@1@.0'.format(gst_version_major, gst_version_minor) 35else 36 gst_req = '>= ' + gst_version 37endif 38 39api_version = '1.0' 40soversion = 0 41# maintaining compatibility with the previous libtool versioning 42# current = minor * 100 + micro 43curversion = gst_version_minor * 100 + gst_version_micro 44libversion = '@0@.@1@.0'.format(soversion, curversion) 45osxversion = curversion + 1 46 47plugins_install_dir = join_paths(get_option('libdir'), 'gstreamer-1.0') 48static_build = get_option('default_library') == 'static' 49plugins = [] 50libraries = [] 51 52cc = meson.get_compiler('c') 53 54if cc.get_id() == 'msvc' 55 msvc_args = [ 56 # Ignore several spurious warnings for things gstreamer does very commonly 57 # If a warning is completely useless and spammy, use '/wdXXXX' to suppress it 58 # If a warning is harmless but hard to fix, use '/woXXXX' so it's shown once 59 # NOTE: Only add warnings here if you are sure they're spurious 60 '/wd4018', # implicit signed/unsigned conversion 61 '/wd4146', # unary minus on unsigned (beware INT_MIN) 62 '/wd4244', # lossy type conversion (e.g. double -> int) 63 '/wd4305', # truncating type conversion (e.g. double -> float) 64 cc.get_supported_arguments(['/utf-8']), # set the input encoding to utf-8 65 66 # Enable some warnings on MSVC to match GCC/Clang behaviour 67 '/w14062', # enumerator 'identifier' in switch of enum 'enumeration' is not handled 68 '/w14101', # 'identifier' : unreferenced local variable 69 '/w14189', # 'identifier' : local variable is initialized but not referenced 70 ] 71 add_project_arguments(msvc_args, language: ['c', 'cpp']) 72 # Disable SAFESEH with MSVC for plugins and libs that use external deps that 73 # are built with MinGW 74 noseh_link_args = ['/SAFESEH:NO'] 75else 76 noseh_link_args = [] 77endif 78 79if cc.has_link_argument('-Wl,-Bsymbolic-functions') 80 add_project_link_arguments('-Wl,-Bsymbolic-functions', language : 'c') 81endif 82 83core_conf = configuration_data() 84 85# Symbol visibility 86if cc.get_id() == 'msvc' 87 export_define = '__declspec(dllexport) extern' 88elif cc.has_argument('-fvisibility=hidden') 89 add_project_arguments('-fvisibility=hidden', language: 'c') 90 if have_objc 91 add_project_arguments('-fvisibility=hidden', language: 'objc') 92 endif 93 export_define = 'extern __attribute__ ((visibility ("default")))' 94else 95 export_define = 'extern' 96endif 97 98# Passing this through the command line would be too messy 99core_conf.set('GST_API_EXPORT', export_define) 100 101# Disable strict aliasing 102if cc.has_argument('-fno-strict-aliasing') 103 add_project_arguments('-fno-strict-aliasing', language: 'c') 104endif 105 106# Define G_DISABLE_DEPRECATED for development versions 107if gst_version_is_dev 108 message('Disabling deprecated GLib API') 109 add_project_arguments('-DG_DISABLE_DEPRECATED', language: 'c') 110endif 111 112cast_checks = get_option('gobject-cast-checks') 113if cast_checks.disabled() or (cast_checks.auto() and not gst_version_is_dev) 114 message('Disabling GLib cast checks') 115 add_project_arguments('-DG_DISABLE_CAST_CHECKS', language: 'c') 116endif 117 118glib_asserts = get_option('glib-asserts') 119if glib_asserts.disabled() or (glib_asserts.auto() and not gst_version_is_dev) 120 message('Disabling GLib asserts') 121 add_project_arguments('-DG_DISABLE_ASSERT', language: 'c') 122endif 123 124glib_checks = get_option('glib-checks') 125if glib_checks.disabled() or (glib_checks.auto() and not gst_version_is_dev) 126 message('Disabling GLib checks') 127 add_project_arguments('-DG_DISABLE_CHECKS', language: 'c') 128endif 129 130# These are only needed/used by the ABI tests from core 131host_defines = [ 132 [ 'x86', 'HAVE_CPU_I386' ], 133 [ 'x86_64', 'HAVE_CPU_X86_64' ], 134 [ 'arm', 'HAVE_CPU_ARM' ], 135 [ 'aarch64', 'HAVE_CPU_AARCH64' ], 136 [ 'mips', 'HAVE_CPU_MIPS' ], 137 [ 'powerpc', 'HAVE_CPU_PPC' ], 138 [ 'powerpc64', 'HAVE_CPU_PPC64' ], 139 [ 'alpha', 'HAVE_CPU_ALPHA' ], 140 [ 'sparc', 'HAVE_CPU_SPARC' ], 141 [ 'ia64', 'HAVE_CPU_IA64' ], 142 [ 'hppa', 'HAVE_CPU_HPPA' ], 143 [ 'm68k', 'HAVE_CPU_M68K' ], 144 [ 's390', 'HAVE_CPU_S390' ], 145] 146foreach h : host_defines 147 if h.get(0) == host_machine.cpu_family() 148 core_conf.set(h.get(1), 1) 149 endif 150endforeach 151# FIXME: should really be called HOST_CPU or such 152core_conf.set_quoted('TARGET_CPU', host_machine.cpu()) 153 154check_headers = [ 155 ['HAVE_DLFCN_H', 'dlfcn.h'], 156 ['HAVE_EMMINTRIN_H', 'emmintrin.h'], 157 ['HAVE_INTTYPES_H', 'inttypes.h'], 158 ['HAVE_MEMORY_H', 'memory.h'], 159 ['HAVE_NETINET_IN_H', 'netinet/in.h'], 160 ['HAVE_NETINET_TCP_H', 'netinet/tcp.h'], 161 ['HAVE_PROCESS_H', 'process.h'], 162 ['HAVE_SMMINTRIN_H', 'smmintrin.h'], 163 ['HAVE_STDINT_H', 'stdint.h'], 164 ['HAVE_STRINGS_H', 'strings.h'], 165 ['HAVE_STRING_H', 'string.h'], 166 ['HAVE_SYS_SOCKET_H', 'sys/socket.h'], 167 ['HAVE_SYS_STAT_H', 'sys/stat.h'], 168 ['HAVE_SYS_TYPES_H', 'sys/types.h'], 169 ['HAVE_SYS_WAIT_H', 'sys/wait.h'], 170 ['HAVE_UNISTD_H', 'unistd.h'], 171 ['HAVE_WINSOCK2_H', 'winsock2.h'], 172 ['HAVE_XMMINTRIN_H', 'xmmintrin.h'], 173 ['HAVE_LINUX_DMA_BUF_H', 'linux/dma-buf.h'], 174] 175foreach h : check_headers 176 if cc.has_header(h.get(1)) 177 core_conf.set(h.get(0), 1) 178 endif 179endforeach 180 181check_functions = [ 182 ['HAVE_DCGETTEXT', 'dcgettext', '#include<libintl.h>'], 183 ['HAVE_GMTIME_R', 'gmtime_r', '#include<time.h>'], 184 ['HAVE_LOCALTIME_R', 'localtime_r', '#include<time.h>'], 185 ['HAVE_LRINTF', 'lrintf', '#include<math.h>'], 186 ['HAVE_MMAP', 'mmap', '#include<sys/mman.h>'], 187 ['HAVE_LOG2', 'log2', '#include<math.h>'], 188] 189 190libm = cc.find_library('m', required : false) 191foreach f : check_functions 192 if cc.has_function(f.get(1), prefix : f.get(2), dependencies : libm) 193 core_conf.set(f.get(0), 1) 194 endif 195endforeach 196 197core_conf.set('SIZEOF_CHAR', cc.sizeof('char')) 198core_conf.set('SIZEOF_INT', cc.sizeof('int')) 199core_conf.set('SIZEOF_LONG', cc.sizeof('long')) 200core_conf.set('SIZEOF_SHORT', cc.sizeof('short')) 201core_conf.set('SIZEOF_VOIDP', cc.sizeof('void*')) 202 203core_conf.set_quoted('GETTEXT_PACKAGE', 'gst-plugins-base-1.0') 204core_conf.set_quoted('LOCALEDIR', join_paths(get_option('prefix'), get_option('localedir'))) 205core_conf.set_quoted('PACKAGE', 'gst-plugins-base') 206core_conf.set_quoted('VERSION', gst_version) 207core_conf.set_quoted('PACKAGE_VERSION', gst_version) 208core_conf.set_quoted('GST_API_VERSION', api_version) 209core_conf.set_quoted('GST_DATADIR', join_paths(get_option('prefix'), get_option('datadir'))) 210core_conf.set_quoted('GST_LICENSE', 'LGPL') 211 212install_plugins_helper = get_option('install_plugins_helper') 213if install_plugins_helper == '' 214 install_plugins_helper = join_paths(get_option('prefix'), 215 get_option('libexecdir'), 216 'gst-install-plugins-helper') 217endif 218core_conf.set_quoted('GST_INSTALL_PLUGINS_HELPER', install_plugins_helper) 219 220warning_flags = [ 221 '-Wmissing-declarations', 222 '-Wredundant-decls', 223 '-Wundef', 224 '-Wwrite-strings', 225 '-Wformat', 226 '-Wformat-nonliteral', 227 '-Wformat-security', 228 '-Winit-self', 229 '-Wmissing-include-dirs', 230 '-Waddress', 231 '-Wno-multichar', 232 '-Wvla', 233 '-Wpointer-arith', 234] 235 236warning_c_flags = [ 237 '-Wmissing-prototypes', 238 '-Wdeclaration-after-statement', 239] 240 241warning_cxx_flags = [ 242 '-Waggregate-return', 243] 244 245if have_cxx 246 cxx = meson.get_compiler('cpp') 247 foreach extra_arg : warning_cxx_flags 248 if cxx.has_argument (extra_arg) 249 add_project_arguments([extra_arg], language: 'cpp') 250 endif 251 endforeach 252endif 253 254foreach extra_arg : warning_flags 255 if cc.has_argument (extra_arg) 256 add_project_arguments([extra_arg], language: 'c') 257 endif 258 if have_cxx and cxx.has_argument (extra_arg) 259 add_project_arguments([extra_arg], language: 'cpp') 260 endif 261endforeach 262 263foreach extra_arg : warning_c_flags 264 if cc.has_argument (extra_arg) 265 add_project_arguments([extra_arg], language: 'c') 266 endif 267endforeach 268 269# GStreamer package name and origin url 270gst_package_name = get_option('package-name') 271if gst_package_name == '' 272 if gst_version_nano == 0 273 gst_package_name = 'GStreamer Base Plug-ins source release' 274 elif gst_version_nano == 1 275 gst_package_name = 'GStreamer Base Plug-ins git' 276 else 277 gst_package_name = 'GStreamer Base Plug-ins prerelease' 278 endif 279endif 280core_conf.set_quoted('GST_PACKAGE_NAME', gst_package_name) 281core_conf.set_quoted('GST_PACKAGE_ORIGIN', get_option('package-origin')) 282 283# FIXME: These should be configure options 284core_conf.set_quoted('DEFAULT_VIDEOSINK', 'autovideosink') 285core_conf.set_quoted('DEFAULT_AUDIOSINK', 'autoaudiosink') 286 287# Set whether the audioresampling method should be detected at runtime 288core_conf.set('AUDIORESAMPLE_FORMAT_' + get_option('audioresample_format').to_upper(), true) 289 290gst_plugins_base_args = ['-DHAVE_CONFIG_H'] 291if get_option('default_library') == 'static' 292 gst_plugins_base_args += ['-DGST_STATIC_COMPILATION'] 293endif 294 295# X11 checks are for sys/ and tests/ 296x11_dep = dependency('x11', required : get_option('x11')) 297# GLib checks are for the entire project 298# Almost everything that uses glib also uses gobject 299glib_deps = [dependency('glib-2.0', version : glib_req, fallback: ['glib', 'libglib_dep']), 300 dependency('gobject-2.0', fallback: ['glib', 'libgobject_dep'])] 301# GIO is used by the GIO plugin, and by the TCP, SDP, and RTSP plugins 302gio_dep = dependency('gio-2.0', fallback: ['glib', 'libgio_dep']) 303giounix_dep = dependency('', required: false) 304if host_system != 'windows' 305 giounix_dep = dependency('gio-unix-2.0', version : glib_req, 306 fallback: ['glib', 'libgiounix_dep']) 307endif 308gmodule_dep = dependency('gmodule-no-export-2.0', 309 fallback: ['glib', 'libgmodule_dep']) 310 311# some of the examples can use gdk-pixbuf and GTK+3 312gdk_pixbuf_dep = dependency('gdk-pixbuf-2.0', required : get_option('examples')) 313gtk_dep = dependency('gtk+-3.0', version : '>= 3.10', required : get_option('examples')) 314# TODO: https://github.com/mesonbuild/meson/issues/3941 315if not get_option('x11').disabled() 316 gtk_x11_dep = dependency('gtk+-x11-3.0', version : '>= 3.10', required : get_option('examples')) 317else 318 gtk_x11_dep = dependency('', required : false) 319endif 320# gtk+ quartz backend is only available on macOS 321if host_system == 'darwin' 322 gtk_quartz_dep = dependency('gtk+-quartz-3.0', version : '>= 3.10', required : get_option('examples')) 323else 324 gtk_quartz_dep = dependency('', required : false) 325endif 326 327core_conf.set('HAVE_X11', x11_dep.found()) 328core_conf.set('HAVE_GIO_UNIX_2_0', giounix_dep.found()) 329 330if gio_dep.type_name() == 'pkgconfig' 331 core_conf.set_quoted('GIO_MODULE_DIR', 332 gio_dep.get_variable('giomoduledir')) 333 core_conf.set_quoted('GIO_LIBDIR', 334 gio_dep.get_variable('libdir')) 335 core_conf.set_quoted('GIO_PREFIX', 336 gio_dep.get_variable('prefix')) 337else 338 core_conf.set_quoted('GIO_MODULE_DIR', join_paths(get_option('prefix'), 339 get_option('libdir'), 'gio/modules')) 340 core_conf.set_quoted('GIO_LIBDIR', join_paths(get_option('prefix'), 341 get_option('libdir'))) 342 core_conf.set_quoted('GIO_PREFIX', join_paths(get_option('prefix'))) 343endif 344 345configinc = include_directories('.') 346libsinc = include_directories('gst-libs') 347 348# To use the subproject make subprojects directory 349# and put gstreamer meson git there (symlinking is fine) 350gst_dep = dependency('gstreamer-1.0', version : gst_req, 351 fallback : ['gstreamer', 'gst_dep']) 352gst_base_dep = dependency('gstreamer-base-1.0', version : gst_req, 353 fallback : ['gstreamer', 'gst_base_dep']) 354gst_net_dep = dependency('gstreamer-net-1.0', version : gst_req, 355 fallback : ['gstreamer', 'gst_net_dep']) 356gst_check_dep = dependency('gstreamer-check-1.0', version : gst_req, 357 required : get_option('tests'), 358 fallback : ['gstreamer', 'gst_check_dep']) 359gst_controller_dep = dependency('gstreamer-controller-1.0', version : gst_req, 360 fallback : ['gstreamer', 'gst_controller_dep']) 361 362have_orcc = false 363orcc_args = [] 364orc_targets = [] 365# Used by various libraries/elements that use Orc code 366orc_dep = dependency('orc-0.4', version : orc_req, required : get_option('orc'), 367 fallback : ['orc', 'orc_dep']) 368orcc = find_program('orcc', required : get_option('orc')) 369if orc_dep.found() and orcc.found() 370 have_orcc = true 371 orcc_args = [orcc, '--include', 'glib.h'] 372 core_conf.set('HAVE_ORC', 1) 373else 374 message('Orc Compiler not found or disabled, will use backup C code') 375 core_conf.set('DISABLE_ORC', 1) 376endif 377 378# Used to build SSE* things in audio-resampler 379sse_args = '-msse' 380sse2_args = '-msse2' 381sse41_args = '-msse4.1' 382 383have_sse = cc.has_argument(sse_args) 384have_sse2 = cc.has_argument(sse2_args) 385have_sse41 = cc.has_argument(sse41_args) 386 387if host_machine.cpu_family() == 'arm' 388 if cc.compiles(''' 389#include <arm_neon.h> 390int32x4_t testfunc(int16_t *a, int16_t *b) { 391 asm volatile ("vmull.s16 q0, d0, d0" : : : "q0"); 392 return vmull_s16(vld1_s16(a), vld1_s16(b)); 393} 394''', name : 'NEON support') 395 core_conf.set('HAVE_ARM_NEON', true) 396 endif 397endif 398 399if gst_dep.type_name() == 'internal' 400 gst_proj = subproject('gstreamer') 401 402 if not gst_proj.get_variable('gst_debug') 403 message('GStreamer debug system is disabled') 404 add_project_arguments('-Wno-unused', language: 'c') 405 else 406 message('GStreamer debug system is enabled') 407 endif 408else 409 # We can't check that in the case of subprojects as we won't 410 # be able to build against an internal dependency (which is not built yet) 411 if not cc.compiles(''' 412#include <gst/gstconfig.h> 413#ifdef GST_DISABLE_GST_DEBUG 414#error "debugging disabled, make compiler fail" 415#endif''' , dependencies: gst_dep) 416 message('GStreamer debug system is disabled') 417 add_project_arguments('-Wno-unused', language: 'c') 418 else 419 message('GStreamer debug system is enabled') 420 endif 421endif 422 423if cc.has_member('struct tcp_info', '__tcpi_reordering', prefix: '#include <netinet/tcp.h>') 424 core_conf.set('HAVE_BSD_TCP_INFO', true) 425endif 426 427if cc.has_member('struct tcp_info', 'tcpi_reordering', prefix: '#include <netinet/tcp.h>') 428 core_conf.set('HAVE_LINUX_TCP_INFO', true) 429endif 430 431gir = find_program('g-ir-scanner', required : get_option('introspection')) 432gnome = import('gnome') 433build_gir = gir.found() and (not meson.is_cross_build() or get_option('introspection').enabled()) 434gir_init_section = [ '--add-init-section=extern void gst_init(gint*,gchar**);' + \ 435 'g_setenv("GST_REGISTRY_DISABLE", "yes", TRUE);' + \ 436 'g_setenv("GST_REGISTRY_1.0", "@0@", TRUE);'.format(meson.current_build_dir() + '/gir_empty_registry.reg') + \ 437 'g_setenv("GST_PLUGIN_PATH_1_0", "", TRUE);' + \ 438 'g_setenv("GST_PLUGIN_SYSTEM_PATH_1_0", "", TRUE);' + \ 439 'gst_init(NULL,NULL);', '--quiet'] 440 441pkgconfig = import('pkgconfig') 442plugins_pkgconfig_install_dir = join_paths(plugins_install_dir, 'pkgconfig') 443if get_option('default_library') == 'shared' 444 # If we don't build static plugins there is no need to generate pc files 445 plugins_pkgconfig_install_dir = disabler() 446endif 447 448pkgconfig_variables = ['exec_prefix=${prefix}', 449 'toolsdir=${exec_prefix}/bin', 450 'pluginsdir=${libdir}/gstreamer-1.0', 451 'datarootdir=${prefix}/share', 452 'datadir=${datarootdir}', 453 'girdir=${datadir}/gir-1.0', 454 'typelibdir=${libdir}/girepository-1.0', 455 'libexecdir=${prefix}/libexec'] 456pkgconfig_subdirs = ['gstreamer-1.0'] 457 458meson_pkg_config_file_fixup_script = find_program('scripts/meson-pkg-config-file-fixup.py') 459 460python3 = import('python').find_installation() 461subdir('gst-libs') 462subdir('gst') 463subdir('ext') 464subdir('sys') 465if not get_option('tools').disabled() 466 subdir('tools') 467endif 468subdir('tests') 469 470# xgettext is optional (on Windows for instance) 471if find_program('xgettext', required : get_option('nls')).found() 472 core_conf.set('ENABLE_NLS', 1) 473 subdir('po') 474endif 475subdir('docs') 476subdir('scripts') 477 478base_libraries = ['allocators', 'app', 'audio', 'fft', 'pbutils', 'riff', 'rtp', 'rtsp', 'sdp', 'tag', 'video'] 479if build_gstgl 480 base_libraries += 'gl' 481endif 482 483pkgconfig_plugins_base_libs_variables = [ 484 'libraries=' + ' '.join(base_libraries), 485] 486 487pkgconfig.generate( 488 libraries : [gst_dep], 489 variables : pkgconfig_variables + pkgconfig_plugins_base_libs_variables, 490 uninstalled_variables : pkgconfig_plugins_base_libs_variables, 491 subdirs : pkgconfig_subdirs, 492 name : 'gstreamer-plugins-base-1.0', 493 description : 'Streaming media framework, base plugins libraries', 494) 495 496# Desperate times, desperate measures... fix up escaping of our variables 497run_command(meson_pkg_config_file_fixup_script, 498 'gstreamer-plugins-base-1.0', 'libraries', 499 check: true) 500 501if have_orcc 502 update_orc_dist_files = find_program('scripts/update-orc-dist-files.py') 503 504 orc_update_targets = [] 505 foreach t : orc_targets 506 orc_name = t.get('name') 507 orc_file = t.get('orc-source') 508 header = t.get('header') 509 source = t.get('source') 510 # alias_target() only works with build targets, so can't use run_target() here 511 orc_update_targets += [ 512 custom_target('update-orc-@0@'.format(orc_name), 513 input: [header, source], 514 command: [update_orc_dist_files, orc_file, header, source], 515 output: ['@0@-dist.c'.format(orc_name)]) # not entirely true 516 ] 517 endforeach 518 519 if orc_update_targets.length() > 0 520 update_orc_dist_target = alias_target('update-orc-dist', orc_update_targets) 521 endif 522endif 523 524# Set release date 525if gst_version_nano == 0 526 extract_release_date = find_program('scripts/extract-release-date-from-doap-file.py') 527 run_result = run_command(extract_release_date, gst_version, files('gst-plugins-base.doap'), check: true) 528 release_date = run_result.stdout().strip() 529 core_conf.set_quoted('GST_PACKAGE_RELEASE_DATETIME', release_date) 530 message('Package release date: ' + release_date) 531endif 532 533if gio_dep.version().version_compare('< 2.67.4') 534 core_conf.set('g_memdup2(ptr,sz)', '(G_LIKELY(((guint64)(sz)) < G_MAXUINT)) ? g_memdup(ptr,sz) : (g_abort(),NULL)') 535endif 536 537# Use core_conf after all subdirs have set values 538configure_file(output : 'config.h', configuration : core_conf) 539 540plugin_names = [] 541foreach plugin: plugins 542 if plugin.name().startswith('gst') 543 plugin_names += [plugin.name().substring(3)] 544 else 545 plugin_names += [plugin.name()] 546 endif 547endforeach 548 549summary({ 550 'Plugins': plugin_names, 551}, list_sep: ', ') 552