1project('gst-plugins-base', '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 19have_cxx = add_languages('cpp', required : false) 20have_objc = add_languages('objc', required : false) 21 22glib_req = '>= 2.40.0' 23orc_req = '>= 0.4.24' 24gst_req = '>= @0@.@1@.0'.format(gst_version_major, gst_version_minor) 25 26api_version = '1.0' 27soversion = 0 28# maintaining compatibility with the previous libtool versioning 29# current = minor * 100 + micro 30curversion = gst_version_minor * 100 + gst_version_micro 31libversion = '@0@.@1@.0'.format(soversion, curversion) 32osxversion = curversion + 1 33 34plugins_install_dir = join_paths(get_option('libdir'), 'gstreamer-1.0') 35 36cc = meson.get_compiler('c') 37host_system = host_machine.system() 38 39if cc.get_id() == 'msvc' 40 # Ignore several spurious warnings for things gstreamer does very commonly 41 # If a warning is completely useless and spammy, use '/wdXXXX' to suppress it 42 # If a warning is harmless but hard to fix, use '/woXXXX' so it's shown once 43 # NOTE: Only add warnings here if you are sure they're spurious 44 add_project_arguments( 45 '/wd4018', # implicit signed/unsigned conversion 46 '/wd4146', # unary minus on unsigned (beware INT_MIN) 47 '/wd4244', # lossy type conversion (e.g. double -> int) 48 '/wd4305', # truncating type conversion (e.g. double -> float) 49 cc.get_supported_arguments(['/utf-8']), # set the input encoding to utf-8 50 language : 'c') 51 # Disable SAFESEH with MSVC for plugins and libs that use external deps that 52 # are built with MinGW 53 noseh_link_args = ['/SAFESEH:NO'] 54else 55 noseh_link_args = [] 56endif 57 58if cc.has_link_argument('-Wl,-Bsymbolic-functions') 59 add_project_link_arguments('-Wl,-Bsymbolic-functions', language : 'c') 60endif 61 62core_conf = configuration_data() 63 64# Symbol visibility 65if cc.get_id() == 'msvc' 66 export_define = '__declspec(dllexport) extern' 67elif cc.has_argument('-fvisibility=hidden') 68 add_project_arguments('-fvisibility=hidden', language: 'c') 69 export_define = 'extern __attribute__ ((visibility ("default")))' 70else 71 export_define = 'extern' 72endif 73 74# Passing this through the command line would be too messy 75core_conf.set('GST_API_EXPORT', export_define) 76 77# Disable strict aliasing 78if cc.has_argument('-fno-strict-aliasing') 79 add_project_arguments('-fno-strict-aliasing', language: 'c') 80endif 81 82# Define G_DISABLE_DEPRECATED for development versions 83if gst_version_is_dev 84 message('Disabling deprecated GLib API') 85 add_project_arguments('-DG_DISABLE_DEPRECATED', language: 'c') 86endif 87 88cast_checks = get_option('gobject-cast-checks') 89if cast_checks.disabled() or (cast_checks.auto() and not gst_version_is_dev) 90 message('Disabling GLib cast checks') 91 add_project_arguments('-DG_DISABLE_CAST_CHECKS', language: 'c') 92endif 93 94glib_asserts = get_option('glib-asserts') 95if glib_asserts.disabled() or (glib_asserts.auto() and not gst_version_is_dev) 96 message('Disabling GLib asserts') 97 add_project_arguments('-DG_DISABLE_ASSERT', language: 'c') 98endif 99 100glib_checks = get_option('glib-checks') 101if glib_checks.disabled() or (glib_checks.auto() and not gst_version_is_dev) 102 message('Disabling GLib checks') 103 add_project_arguments('-DG_DISABLE_CHECKS', language: 'c') 104endif 105 106check_headers = [ 107 ['HAVE_DLFCN_H', 'dlfcn.h'], 108 ['HAVE_EMMINTRIN_H', 'emmintrin.h'], 109 ['HAVE_INTTYPES_H', 'inttypes.h'], 110 ['HAVE_MEMORY_H', 'memory.h'], 111 ['HAVE_PROCESS_H', 'process.h'], 112 ['HAVE_SMMINTRIN_H', 'smmintrin.h'], 113 ['HAVE_STDINT_H', 'stdint.h'], 114 ['HAVE_STDLIB_H', 'stdlib.h'], 115 ['HAVE_STRINGS_H', 'strings.h'], 116 ['HAVE_STRING_H', 'string.h'], 117 ['HAVE_SYS_SOCKET_H', 'sys/socket.h'], 118 ['HAVE_SYS_STAT_H', 'sys/stat.h'], 119 ['HAVE_SYS_TYPES_H', 'sys/types.h'], 120 ['HAVE_SYS_WAIT_H', 'sys/wait.h'], 121 ['HAVE_UNISTD_H', 'unistd.h'], 122 ['HAVE_WINSOCK2_H', 'winsock2.h'], 123 ['HAVE_XMMINTRIN_H', 'xmmintrin.h'], 124 ['HAVE_LINUX_DMA_BUF_H', 'linux/dma-buf.h'], 125] 126foreach h : check_headers 127 if cc.has_header(h.get(1)) 128 core_conf.set(h.get(0), 1) 129 endif 130endforeach 131 132check_functions = [ 133 ['HAVE_DCGETTEXT', 'dcgettext', '#include<libintl.h>'], 134 ['HAVE_GMTIME_R', 'gmtime_r', '#include<time.h>'], 135 ['HAVE_LRINTF', 'lrintf', '#include<math.h>'], 136 ['HAVE_MMAP', 'mmap', '#include<sys/mman.h>'], 137 ['HAVE_LOG2', 'log2', '#include<math.h>'], 138] 139 140libm = cc.find_library('m', required : false) 141foreach f : check_functions 142 if cc.has_function(f.get(1), prefix : f.get(2), dependencies : libm) 143 core_conf.set(f.get(0), 1) 144 endif 145endforeach 146 147core_conf.set('SIZEOF_CHAR', cc.sizeof('char')) 148core_conf.set('SIZEOF_INT', cc.sizeof('int')) 149core_conf.set('SIZEOF_LONG', cc.sizeof('long')) 150core_conf.set('SIZEOF_SHORT', cc.sizeof('short')) 151core_conf.set('SIZEOF_VOIDP', cc.sizeof('void*')) 152 153core_conf.set_quoted('GETTEXT_PACKAGE', 'gst-plugins-base-1.0') 154core_conf.set_quoted('LOCALEDIR', join_paths(get_option('prefix'), get_option('localedir'))) 155core_conf.set_quoted('PACKAGE', 'gst-plugins-base') 156core_conf.set_quoted('VERSION', gst_version) 157core_conf.set_quoted('PACKAGE_VERSION', gst_version) 158core_conf.set_quoted('GST_API_VERSION', api_version) 159core_conf.set_quoted('GST_DATADIR', join_paths(get_option('prefix'), get_option('datadir'))) 160core_conf.set_quoted('GST_LICENSE', 'LGPL') 161 162install_plugins_helper = get_option('install_plugins_helper') 163if install_plugins_helper == '' 164 install_plugins_helper = join_paths(get_option('prefix'), 165 get_option('libexecdir'), 166 'gst-install-plugins-helper') 167endif 168core_conf.set_quoted('GST_INSTALL_PLUGINS_HELPER', install_plugins_helper) 169 170warning_flags = [ 171 '-Wmissing-declarations', 172 '-Wredundant-decls', 173 '-Wundef', 174 '-Wwrite-strings', 175 '-Wformat', 176 '-Wformat-nonliteral', 177 '-Wformat-security', 178 '-Winit-self', 179 '-Wmissing-include-dirs', 180 '-Waddress', 181 '-Wno-multichar', 182 '-Wvla', 183 '-Wpointer-arith', 184] 185 186warning_c_flags = [ 187 '-Wmissing-prototypes', 188 '-Wdeclaration-after-statement', 189] 190 191warning_cxx_flags = [ 192 '-Waggregate-return', 193] 194 195if have_cxx 196 cxx = meson.get_compiler('cpp') 197 foreach extra_arg : warning_cxx_flags 198 if cxx.has_argument (extra_arg) 199 add_project_arguments([extra_arg], language: 'cpp') 200 endif 201 endforeach 202endif 203 204foreach extra_arg : warning_flags 205 if cc.has_argument (extra_arg) 206 add_project_arguments([extra_arg], language: 'c') 207 endif 208 if have_cxx and cxx.has_argument (extra_arg) 209 add_project_arguments([extra_arg], language: 'cpp') 210 endif 211endforeach 212 213foreach extra_arg : warning_c_flags 214 if cc.has_argument (extra_arg) 215 add_project_arguments([extra_arg], language: 'c') 216 endif 217endforeach 218 219# GStreamer package name and origin url 220gst_package_name = get_option('package-name') 221if gst_package_name == '' 222 if gst_version_nano == 0 223 gst_package_name = 'GStreamer Base Plug-ins source release' 224 elif gst_version_nano == 1 225 gst_package_name = 'GStreamer Base Plug-ins git' 226 else 227 gst_package_name = 'GStreamer Base Plug-ins prerelease' 228 endif 229endif 230core_conf.set_quoted('GST_PACKAGE_NAME', gst_package_name) 231core_conf.set_quoted('GST_PACKAGE_ORIGIN', get_option('package-origin')) 232 233# FIXME: These should be configure options 234core_conf.set_quoted('DEFAULT_VIDEOSINK', 'autovideosink') 235core_conf.set_quoted('DEFAULT_AUDIOSINK', 'autoaudiosink') 236 237# Set whether the audioresampling method should be detected at runtime 238core_conf.set('AUDIORESAMPLE_FORMAT_' + get_option('audioresample_format').to_upper(), true) 239 240gst_plugins_base_args = ['-DHAVE_CONFIG_H'] 241if get_option('default_library') == 'static' 242 gst_plugins_base_args += ['-DGST_STATIC_COMPILATION'] 243endif 244 245# X11 checks are for sys/ and tests/ 246x11_dep = dependency('x11', required : get_option('x11')) 247# GLib checks are for the entire project 248# Almost everything that uses glib also uses gobject 249glib_deps = [dependency('glib-2.0', version : glib_req, fallback: ['glib', 'libglib_dep']), 250 dependency('gobject-2.0', fallback: ['glib', 'libgobject_dep'])] 251# GIO is used by the GIO plugin, and by the TCP, SDP, and RTSP plugins 252gio_dep = dependency('gio-2.0', fallback: ['glib', 'libgio_dep']) 253giounix_dep = dependency('', required: false) 254if host_system != 'windows' 255 giounix_dep = dependency('gio-unix-2.0', version : glib_req, 256 fallback: ['glib', 'libgiounix_dep']) 257endif 258gmodule_dep = dependency('gmodule-no-export-2.0', 259 fallback: ['glib', 'libgmodule_dep']) 260 261# some of the examples can use gdk-pixbuf and GTK+3 262gdk_pixbuf_dep = dependency('gdk-pixbuf-2.0', required : get_option('examples')) 263gtk_dep = dependency('gtk+-3.0', version : '>= 3.10', required : get_option('examples')) 264# TODO: https://github.com/mesonbuild/meson/issues/3941 265if not get_option('x11').disabled() 266 gtk_x11_dep = dependency('gtk+-x11-3.0', version : '>= 3.10', required : get_option('examples')) 267else 268 gtk_x11_dep = dependency('', required : false) 269endif 270# gtk+ quartz backend is only available on macOS 271if host_system == 'darwin' 272 gtk_quartz_dep = dependency('gtk+-quartz-3.0', version : '>= 3.10', required : get_option('examples')) 273else 274 gtk_quartz_dep = dependency('', required : false) 275endif 276 277core_conf.set('HAVE_X', x11_dep.found()) 278core_conf.set('HAVE_GIO_UNIX_2_0', giounix_dep.found()) 279 280if gio_dep.type_name() == 'pkgconfig' 281 core_conf.set_quoted('GIO_MODULE_DIR', 282 gio_dep.get_pkgconfig_variable('giomoduledir')) 283 core_conf.set_quoted('GIO_LIBDIR', 284 gio_dep.get_pkgconfig_variable('libdir')) 285 core_conf.set_quoted('GIO_PREFIX', 286 gio_dep.get_pkgconfig_variable('prefix')) 287else 288 core_conf.set_quoted('GIO_MODULE_DIR', join_paths(get_option('prefix'), 289 get_option('libdir'), 'gio/modules')) 290 core_conf.set_quoted('GIO_LIBDIR', join_paths(get_option('prefix'), 291 get_option('libdir'))) 292 core_conf.set_quoted('GIO_PREFIX', get_option('prefix')) 293endif 294 295configinc = include_directories('.') 296libsinc = include_directories('gst-libs') 297 298# To use the subproject make subprojects directory 299# and put gstreamer meson git there (symlinking is fine) 300gst_dep = dependency('gstreamer-1.0', version : gst_req, 301 fallback : ['gstreamer', 'gst_dep']) 302gst_base_dep = dependency('gstreamer-base-1.0', version : gst_req, 303 fallback : ['gstreamer', 'gst_base_dep']) 304gst_net_dep = dependency('gstreamer-net-1.0', version : gst_req, 305 fallback : ['gstreamer', 'gst_net_dep']) 306gst_check_dep = dependency('gstreamer-check-1.0', version : gst_req, 307 required : get_option('tests'), 308 fallback : ['gstreamer', 'gst_check_dep']) 309gst_controller_dep = dependency('gstreamer-controller-1.0', version : gst_req, 310 fallback : ['gstreamer', 'gst_controller_dep']) 311 312have_orcc = false 313orcc_args = [] 314# Used by various libraries/elements that use Orc code 315orc_dep = dependency('orc-0.4', version : orc_req, required : get_option('orc'), 316 fallback : ['orc', 'orc_dep']) 317orcc = find_program('orcc', required : get_option('orc')) 318if orc_dep.found() and orcc.found() 319 have_orcc = true 320 orcc_args = [orcc, '--include', 'glib.h'] 321 core_conf.set('HAVE_ORC', 1) 322else 323 message('Orc Compiler not found or disabled, will use backup C code') 324 core_conf.set('DISABLE_ORC', 1) 325endif 326 327# Used to build SSE* things in audio-resampler 328sse_args = '-msse' 329sse2_args = '-msse2' 330sse41_args = '-msse4.1' 331 332have_sse = cc.has_argument(sse_args) 333have_sse2 = cc.has_argument(sse2_args) 334have_sse41 = cc.has_argument(sse41_args) 335 336if host_machine.cpu_family() == 'arm' 337 if cc.compiles(''' 338#include <arm_neon.h> 339int32x4_t testfunc(int16_t *a, int16_t *b) { 340 asm volatile ("vmull.s16 q0, d0, d0" : : : "q0"); 341 return vmull_s16(vld1_s16(a), vld1_s16(b)); 342} 343''', name : 'NEON support') 344 core_conf.set('HAVE_ARM_NEON', true) 345 endif 346endif 347 348if gst_dep.type_name() == 'internal' 349 gst_proj = subproject('gstreamer') 350 351 if not gst_proj.get_variable('gst_debug') 352 message('GStreamer debug system is disabled') 353 add_project_arguments('-Wno-unused', language: 'c') 354 else 355 message('GStreamer debug system is enabled') 356 endif 357else 358 # We can't check that in the case of subprojects as we won't 359 # be able to build against an internal dependency (which is not built yet) 360 if not cc.compiles(''' 361#include <gst/gstconfig.h> 362#ifdef GST_DISABLE_GST_DEBUG 363#error "debugging disabled, make compiler fail" 364#endif''' , dependencies: gst_dep) 365 message('GStreamer debug system is disabled') 366 add_project_arguments('-Wno-unused', language: 'c') 367 else 368 message('GStreamer debug system is enabled') 369 endif 370endif 371 372gir = find_program('g-ir-scanner', required : get_option('introspection')) 373gnome = import('gnome') 374build_gir = gir.found() and not meson.is_cross_build() 375gir_init_section = [ '--add-init-section=extern void gst_init(gint*,gchar**);' + \ 376 'g_setenv("GST_REGISTRY_DISABLE", "yes", TRUE);' + \ 377 'g_setenv("GST_REGISTRY_1.0", "@0@", TRUE);'.format(meson.current_build_dir() + '/gir_empty_registry.reg') + \ 378 'g_setenv("GST_PLUGIN_PATH_1_0", "", TRUE);' + \ 379 'g_setenv("GST_PLUGIN_SYSTEM_PATH_1_0", "", TRUE);' + \ 380 'gst_init(NULL,NULL);', '--quiet'] 381 382pkgconfig = import('pkgconfig') 383plugins_pkgconfig_install_dir = join_paths(plugins_install_dir, 'pkgconfig') 384if get_option('default_library') == 'shared' 385 # If we don't build static plugins there is no need to generate pc files 386 plugins_pkgconfig_install_dir = disabler() 387endif 388 389subdir('gst-libs') 390subdir('gst') 391subdir('ext') 392subdir('sys') 393if not get_option('tools').disabled() 394 subdir('tools') 395endif 396subdir('tests') 397subdir('pkgconfig') 398 399# xgettext is optional (on Windows for instance) 400if find_program('xgettext', required : get_option('nls')).found() 401 core_conf.set('ENABLE_NLS', 1) 402 subdir('po') 403endif 404 405if build_machine.system() == 'windows' 406 message('Disabling gtk-doc while building on Windows') 407else 408 if find_program('gtkdoc-scan', required : get_option('gtk_doc')).found() 409 subdir('docs') 410 else 411 message('Not building documentation as gtk-doc was not found') 412 endif 413endif 414 415# Use core_conf after all subdirs have set values 416configure_file(output : 'config.h', configuration : core_conf) 417 418python3 = import('python').find_installation() 419run_command(python3, '-c', 'import shutil; shutil.copy("hooks/pre-commit.hook", ".git/hooks/pre-commit")') 420