mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-30 12:10:37 +00:00
4e7d3b42ec
This is needed for cross-compiling without a build machine compiler available. The option was added in 0.54, but we only need this in Cerbero and it doesn't affect older versions so it should be ok. Will only cause a spurious warning. Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-base/-/merge_requests/660>
423 lines
15 KiB
Meson
423 lines
15 KiB
Meson
project('gst-plugins-base', 'c',
|
|
version : '1.17.0.1',
|
|
meson_version : '>= 0.48',
|
|
default_options : [ 'warning_level=1',
|
|
'buildtype=debugoptimized' ])
|
|
|
|
gst_version = meson.project_version()
|
|
version_arr = gst_version.split('.')
|
|
gst_version_major = version_arr[0].to_int()
|
|
gst_version_minor = version_arr[1].to_int()
|
|
gst_version_micro = version_arr[2].to_int()
|
|
if version_arr.length() == 4
|
|
gst_version_nano = version_arr[3].to_int()
|
|
else
|
|
gst_version_nano = 0
|
|
endif
|
|
gst_version_is_dev = gst_version_minor % 2 == 1 and gst_version_micro < 90
|
|
|
|
have_cxx = add_languages('cpp', native: false, required: false)
|
|
have_objc = add_languages('objc', native: false, required: false)
|
|
|
|
glib_req = '>= 2.44.0'
|
|
orc_req = '>= 0.4.24'
|
|
gst_req = '>= @0@.@1@.0'.format(gst_version_major, gst_version_minor)
|
|
|
|
api_version = '1.0'
|
|
soversion = 0
|
|
# maintaining compatibility with the previous libtool versioning
|
|
# current = minor * 100 + micro
|
|
curversion = gst_version_minor * 100 + gst_version_micro
|
|
libversion = '@0@.@1@.0'.format(soversion, curversion)
|
|
osxversion = curversion + 1
|
|
|
|
plugins_install_dir = join_paths(get_option('libdir'), 'gstreamer-1.0')
|
|
plugins = []
|
|
|
|
cc = meson.get_compiler('c')
|
|
host_system = host_machine.system()
|
|
|
|
if cc.get_id() == 'msvc'
|
|
# Ignore several spurious warnings for things gstreamer does very commonly
|
|
# If a warning is completely useless and spammy, use '/wdXXXX' to suppress it
|
|
# If a warning is harmless but hard to fix, use '/woXXXX' so it's shown once
|
|
# NOTE: Only add warnings here if you are sure they're spurious
|
|
add_project_arguments(
|
|
'/wd4018', # implicit signed/unsigned conversion
|
|
'/wd4146', # unary minus on unsigned (beware INT_MIN)
|
|
'/wd4244', # lossy type conversion (e.g. double -> int)
|
|
'/wd4305', # truncating type conversion (e.g. double -> float)
|
|
cc.get_supported_arguments(['/utf-8']), # set the input encoding to utf-8
|
|
language : 'c')
|
|
# Disable SAFESEH with MSVC for plugins and libs that use external deps that
|
|
# are built with MinGW
|
|
noseh_link_args = ['/SAFESEH:NO']
|
|
else
|
|
noseh_link_args = []
|
|
endif
|
|
|
|
if cc.has_link_argument('-Wl,-Bsymbolic-functions')
|
|
add_project_link_arguments('-Wl,-Bsymbolic-functions', language : 'c')
|
|
endif
|
|
|
|
core_conf = configuration_data()
|
|
|
|
# Symbol visibility
|
|
if cc.get_id() == 'msvc'
|
|
export_define = '__declspec(dllexport) extern'
|
|
elif cc.has_argument('-fvisibility=hidden')
|
|
add_project_arguments('-fvisibility=hidden', language: 'c')
|
|
if have_objc
|
|
add_project_arguments('-fvisibility=hidden', language: 'objc')
|
|
endif
|
|
export_define = 'extern __attribute__ ((visibility ("default")))'
|
|
else
|
|
export_define = 'extern'
|
|
endif
|
|
|
|
# Passing this through the command line would be too messy
|
|
core_conf.set('GST_API_EXPORT', export_define)
|
|
|
|
# Disable strict aliasing
|
|
if cc.has_argument('-fno-strict-aliasing')
|
|
add_project_arguments('-fno-strict-aliasing', language: 'c')
|
|
endif
|
|
|
|
# Define G_DISABLE_DEPRECATED for development versions
|
|
if gst_version_is_dev
|
|
message('Disabling deprecated GLib API')
|
|
add_project_arguments('-DG_DISABLE_DEPRECATED', language: 'c')
|
|
endif
|
|
|
|
cast_checks = get_option('gobject-cast-checks')
|
|
if cast_checks.disabled() or (cast_checks.auto() and not gst_version_is_dev)
|
|
message('Disabling GLib cast checks')
|
|
add_project_arguments('-DG_DISABLE_CAST_CHECKS', language: 'c')
|
|
endif
|
|
|
|
glib_asserts = get_option('glib-asserts')
|
|
if glib_asserts.disabled() or (glib_asserts.auto() and not gst_version_is_dev)
|
|
message('Disabling GLib asserts')
|
|
add_project_arguments('-DG_DISABLE_ASSERT', language: 'c')
|
|
endif
|
|
|
|
glib_checks = get_option('glib-checks')
|
|
if glib_checks.disabled() or (glib_checks.auto() and not gst_version_is_dev)
|
|
message('Disabling GLib checks')
|
|
add_project_arguments('-DG_DISABLE_CHECKS', language: 'c')
|
|
endif
|
|
|
|
check_headers = [
|
|
['HAVE_DLFCN_H', 'dlfcn.h'],
|
|
['HAVE_EMMINTRIN_H', 'emmintrin.h'],
|
|
['HAVE_INTTYPES_H', 'inttypes.h'],
|
|
['HAVE_MEMORY_H', 'memory.h'],
|
|
['HAVE_NETINET_IN_H', 'netinet/in.h'],
|
|
['HAVE_NETINET_TCP_H', 'netinet/tcp.h'],
|
|
['HAVE_PROCESS_H', 'process.h'],
|
|
['HAVE_SMMINTRIN_H', 'smmintrin.h'],
|
|
['HAVE_STDINT_H', 'stdint.h'],
|
|
['HAVE_STRINGS_H', 'strings.h'],
|
|
['HAVE_STRING_H', 'string.h'],
|
|
['HAVE_SYS_SOCKET_H', 'sys/socket.h'],
|
|
['HAVE_SYS_STAT_H', 'sys/stat.h'],
|
|
['HAVE_SYS_TYPES_H', 'sys/types.h'],
|
|
['HAVE_SYS_WAIT_H', 'sys/wait.h'],
|
|
['HAVE_UNISTD_H', 'unistd.h'],
|
|
['HAVE_WINSOCK2_H', 'winsock2.h'],
|
|
['HAVE_XMMINTRIN_H', 'xmmintrin.h'],
|
|
['HAVE_LINUX_DMA_BUF_H', 'linux/dma-buf.h'],
|
|
]
|
|
foreach h : check_headers
|
|
if cc.has_header(h.get(1))
|
|
core_conf.set(h.get(0), 1)
|
|
endif
|
|
endforeach
|
|
|
|
check_functions = [
|
|
['HAVE_DCGETTEXT', 'dcgettext', '#include<libintl.h>'],
|
|
['HAVE_GMTIME_R', 'gmtime_r', '#include<time.h>'],
|
|
['HAVE_LOCALTIME_R', 'localtime_r', '#include<time.h>'],
|
|
['HAVE_LRINTF', 'lrintf', '#include<math.h>'],
|
|
['HAVE_MMAP', 'mmap', '#include<sys/mman.h>'],
|
|
['HAVE_LOG2', 'log2', '#include<math.h>'],
|
|
]
|
|
|
|
libm = cc.find_library('m', required : false)
|
|
foreach f : check_functions
|
|
if cc.has_function(f.get(1), prefix : f.get(2), dependencies : libm)
|
|
core_conf.set(f.get(0), 1)
|
|
endif
|
|
endforeach
|
|
|
|
core_conf.set('SIZEOF_CHAR', cc.sizeof('char'))
|
|
core_conf.set('SIZEOF_INT', cc.sizeof('int'))
|
|
core_conf.set('SIZEOF_LONG', cc.sizeof('long'))
|
|
core_conf.set('SIZEOF_SHORT', cc.sizeof('short'))
|
|
core_conf.set('SIZEOF_VOIDP', cc.sizeof('void*'))
|
|
|
|
core_conf.set_quoted('GETTEXT_PACKAGE', 'gst-plugins-base-1.0')
|
|
core_conf.set_quoted('LOCALEDIR', join_paths(get_option('prefix'), get_option('localedir')))
|
|
core_conf.set_quoted('PACKAGE', 'gst-plugins-base')
|
|
core_conf.set_quoted('VERSION', gst_version)
|
|
core_conf.set_quoted('PACKAGE_VERSION', gst_version)
|
|
core_conf.set_quoted('GST_API_VERSION', api_version)
|
|
core_conf.set_quoted('GST_DATADIR', join_paths(get_option('prefix'), get_option('datadir')))
|
|
core_conf.set_quoted('GST_LICENSE', 'LGPL')
|
|
|
|
install_plugins_helper = get_option('install_plugins_helper')
|
|
if install_plugins_helper == ''
|
|
install_plugins_helper = join_paths(get_option('prefix'),
|
|
get_option('libexecdir'),
|
|
'gst-install-plugins-helper')
|
|
endif
|
|
core_conf.set_quoted('GST_INSTALL_PLUGINS_HELPER', install_plugins_helper)
|
|
|
|
warning_flags = [
|
|
'-Wmissing-declarations',
|
|
'-Wredundant-decls',
|
|
'-Wundef',
|
|
'-Wwrite-strings',
|
|
'-Wformat',
|
|
'-Wformat-nonliteral',
|
|
'-Wformat-security',
|
|
'-Winit-self',
|
|
'-Wmissing-include-dirs',
|
|
'-Waddress',
|
|
'-Wno-multichar',
|
|
'-Wvla',
|
|
'-Wpointer-arith',
|
|
]
|
|
|
|
warning_c_flags = [
|
|
'-Wmissing-prototypes',
|
|
'-Wdeclaration-after-statement',
|
|
]
|
|
|
|
warning_cxx_flags = [
|
|
'-Waggregate-return',
|
|
]
|
|
|
|
if have_cxx
|
|
cxx = meson.get_compiler('cpp')
|
|
foreach extra_arg : warning_cxx_flags
|
|
if cxx.has_argument (extra_arg)
|
|
add_project_arguments([extra_arg], language: 'cpp')
|
|
endif
|
|
endforeach
|
|
endif
|
|
|
|
foreach extra_arg : warning_flags
|
|
if cc.has_argument (extra_arg)
|
|
add_project_arguments([extra_arg], language: 'c')
|
|
endif
|
|
if have_cxx and cxx.has_argument (extra_arg)
|
|
add_project_arguments([extra_arg], language: 'cpp')
|
|
endif
|
|
endforeach
|
|
|
|
foreach extra_arg : warning_c_flags
|
|
if cc.has_argument (extra_arg)
|
|
add_project_arguments([extra_arg], language: 'c')
|
|
endif
|
|
endforeach
|
|
|
|
# GStreamer package name and origin url
|
|
gst_package_name = get_option('package-name')
|
|
if gst_package_name == ''
|
|
if gst_version_nano == 0
|
|
gst_package_name = 'GStreamer Base Plug-ins source release'
|
|
elif gst_version_nano == 1
|
|
gst_package_name = 'GStreamer Base Plug-ins git'
|
|
else
|
|
gst_package_name = 'GStreamer Base Plug-ins prerelease'
|
|
endif
|
|
endif
|
|
core_conf.set_quoted('GST_PACKAGE_NAME', gst_package_name)
|
|
core_conf.set_quoted('GST_PACKAGE_ORIGIN', get_option('package-origin'))
|
|
|
|
# FIXME: These should be configure options
|
|
core_conf.set_quoted('DEFAULT_VIDEOSINK', 'autovideosink')
|
|
core_conf.set_quoted('DEFAULT_AUDIOSINK', 'autoaudiosink')
|
|
|
|
# Set whether the audioresampling method should be detected at runtime
|
|
core_conf.set('AUDIORESAMPLE_FORMAT_' + get_option('audioresample_format').to_upper(), true)
|
|
|
|
gst_plugins_base_args = ['-DHAVE_CONFIG_H']
|
|
if get_option('default_library') == 'static'
|
|
gst_plugins_base_args += ['-DGST_STATIC_COMPILATION']
|
|
endif
|
|
|
|
# X11 checks are for sys/ and tests/
|
|
x11_dep = dependency('x11', required : get_option('x11'))
|
|
# GLib checks are for the entire project
|
|
# Almost everything that uses glib also uses gobject
|
|
glib_deps = [dependency('glib-2.0', version : glib_req, fallback: ['glib', 'libglib_dep']),
|
|
dependency('gobject-2.0', fallback: ['glib', 'libgobject_dep'])]
|
|
# GIO is used by the GIO plugin, and by the TCP, SDP, and RTSP plugins
|
|
gio_dep = dependency('gio-2.0', fallback: ['glib', 'libgio_dep'])
|
|
giounix_dep = dependency('', required: false)
|
|
if host_system != 'windows'
|
|
giounix_dep = dependency('gio-unix-2.0', version : glib_req,
|
|
fallback: ['glib', 'libgiounix_dep'])
|
|
endif
|
|
gmodule_dep = dependency('gmodule-no-export-2.0',
|
|
fallback: ['glib', 'libgmodule_dep'])
|
|
|
|
# some of the examples can use gdk-pixbuf and GTK+3
|
|
gdk_pixbuf_dep = dependency('gdk-pixbuf-2.0', required : get_option('examples'))
|
|
gtk_dep = dependency('gtk+-3.0', version : '>= 3.10', required : get_option('examples'))
|
|
# TODO: https://github.com/mesonbuild/meson/issues/3941
|
|
if not get_option('x11').disabled()
|
|
gtk_x11_dep = dependency('gtk+-x11-3.0', version : '>= 3.10', required : get_option('examples'))
|
|
else
|
|
gtk_x11_dep = dependency('', required : false)
|
|
endif
|
|
# gtk+ quartz backend is only available on macOS
|
|
if host_system == 'darwin'
|
|
gtk_quartz_dep = dependency('gtk+-quartz-3.0', version : '>= 3.10', required : get_option('examples'))
|
|
else
|
|
gtk_quartz_dep = dependency('', required : false)
|
|
endif
|
|
|
|
core_conf.set('HAVE_X11', x11_dep.found())
|
|
core_conf.set('HAVE_GIO_UNIX_2_0', giounix_dep.found())
|
|
|
|
if gio_dep.type_name() == 'pkgconfig'
|
|
core_conf.set_quoted('GIO_MODULE_DIR',
|
|
gio_dep.get_pkgconfig_variable('giomoduledir'))
|
|
core_conf.set_quoted('GIO_LIBDIR',
|
|
gio_dep.get_pkgconfig_variable('libdir'))
|
|
core_conf.set_quoted('GIO_PREFIX',
|
|
gio_dep.get_pkgconfig_variable('prefix'))
|
|
else
|
|
core_conf.set_quoted('GIO_MODULE_DIR', join_paths(get_option('prefix'),
|
|
get_option('libdir'), 'gio/modules'))
|
|
core_conf.set_quoted('GIO_LIBDIR', join_paths(get_option('prefix'),
|
|
get_option('libdir')))
|
|
core_conf.set_quoted('GIO_PREFIX', get_option('prefix'))
|
|
endif
|
|
|
|
configinc = include_directories('.')
|
|
libsinc = include_directories('gst-libs')
|
|
|
|
# To use the subproject make subprojects directory
|
|
# and put gstreamer meson git there (symlinking is fine)
|
|
gst_dep = dependency('gstreamer-1.0', version : gst_req,
|
|
fallback : ['gstreamer', 'gst_dep'])
|
|
gst_base_dep = dependency('gstreamer-base-1.0', version : gst_req,
|
|
fallback : ['gstreamer', 'gst_base_dep'])
|
|
gst_net_dep = dependency('gstreamer-net-1.0', version : gst_req,
|
|
fallback : ['gstreamer', 'gst_net_dep'])
|
|
gst_check_dep = dependency('gstreamer-check-1.0', version : gst_req,
|
|
required : get_option('tests'),
|
|
fallback : ['gstreamer', 'gst_check_dep'])
|
|
gst_controller_dep = dependency('gstreamer-controller-1.0', version : gst_req,
|
|
fallback : ['gstreamer', 'gst_controller_dep'])
|
|
|
|
have_orcc = false
|
|
orcc_args = []
|
|
# Used by various libraries/elements that use Orc code
|
|
orc_dep = dependency('orc-0.4', version : orc_req, required : get_option('orc'),
|
|
fallback : ['orc', 'orc_dep'])
|
|
orcc = find_program('orcc', required : get_option('orc'))
|
|
if orc_dep.found() and orcc.found()
|
|
have_orcc = true
|
|
orcc_args = [orcc, '--include', 'glib.h']
|
|
core_conf.set('HAVE_ORC', 1)
|
|
else
|
|
message('Orc Compiler not found or disabled, will use backup C code')
|
|
core_conf.set('DISABLE_ORC', 1)
|
|
endif
|
|
|
|
# Used to build SSE* things in audio-resampler
|
|
sse_args = '-msse'
|
|
sse2_args = '-msse2'
|
|
sse41_args = '-msse4.1'
|
|
|
|
have_sse = cc.has_argument(sse_args)
|
|
have_sse2 = cc.has_argument(sse2_args)
|
|
have_sse41 = cc.has_argument(sse41_args)
|
|
|
|
if host_machine.cpu_family() == 'arm'
|
|
if cc.compiles('''
|
|
#include <arm_neon.h>
|
|
int32x4_t testfunc(int16_t *a, int16_t *b) {
|
|
asm volatile ("vmull.s16 q0, d0, d0" : : : "q0");
|
|
return vmull_s16(vld1_s16(a), vld1_s16(b));
|
|
}
|
|
''', name : 'NEON support')
|
|
core_conf.set('HAVE_ARM_NEON', true)
|
|
endif
|
|
endif
|
|
|
|
if gst_dep.type_name() == 'internal'
|
|
gst_proj = subproject('gstreamer')
|
|
|
|
if not gst_proj.get_variable('gst_debug')
|
|
message('GStreamer debug system is disabled')
|
|
add_project_arguments('-Wno-unused', language: 'c')
|
|
else
|
|
message('GStreamer debug system is enabled')
|
|
endif
|
|
else
|
|
# We can't check that in the case of subprojects as we won't
|
|
# be able to build against an internal dependency (which is not built yet)
|
|
if not cc.compiles('''
|
|
#include <gst/gstconfig.h>
|
|
#ifdef GST_DISABLE_GST_DEBUG
|
|
#error "debugging disabled, make compiler fail"
|
|
#endif''' , dependencies: gst_dep)
|
|
message('GStreamer debug system is disabled')
|
|
add_project_arguments('-Wno-unused', language: 'c')
|
|
else
|
|
message('GStreamer debug system is enabled')
|
|
endif
|
|
endif
|
|
|
|
if cc.has_member('struct tcp_info', '__tcpi_reordering', prefix: '#include <netinet/tcp.h>')
|
|
core_conf.set('HAVE_BSD_TCP_INFO', true)
|
|
endif
|
|
|
|
if cc.has_member('struct tcp_info', 'tcpi_reordering', prefix: '#include <netinet/tcp.h>')
|
|
core_conf.set('HAVE_LINUX_TCP_INFO', true)
|
|
endif
|
|
|
|
gir = find_program('g-ir-scanner', required : get_option('introspection'))
|
|
gnome = import('gnome')
|
|
build_gir = gir.found() and (not meson.is_cross_build() or get_option('introspection').enabled())
|
|
gir_init_section = [ '--add-init-section=extern void gst_init(gint*,gchar**);' + \
|
|
'g_setenv("GST_REGISTRY_DISABLE", "yes", TRUE);' + \
|
|
'g_setenv("GST_REGISTRY_1.0", "@0@", TRUE);'.format(meson.current_build_dir() + '/gir_empty_registry.reg') + \
|
|
'g_setenv("GST_PLUGIN_PATH_1_0", "", TRUE);' + \
|
|
'g_setenv("GST_PLUGIN_SYSTEM_PATH_1_0", "", TRUE);' + \
|
|
'gst_init(NULL,NULL);', '--quiet']
|
|
|
|
pkgconfig = import('pkgconfig')
|
|
plugins_pkgconfig_install_dir = join_paths(plugins_install_dir, 'pkgconfig')
|
|
if get_option('default_library') == 'shared'
|
|
# If we don't build static plugins there is no need to generate pc files
|
|
plugins_pkgconfig_install_dir = disabler()
|
|
endif
|
|
|
|
python3 = import('python').find_installation()
|
|
subdir('gst-libs')
|
|
subdir('gst')
|
|
subdir('ext')
|
|
subdir('sys')
|
|
if not get_option('tools').disabled()
|
|
subdir('tools')
|
|
endif
|
|
subdir('tests')
|
|
subdir('pkgconfig')
|
|
# xgettext is optional (on Windows for instance)
|
|
if find_program('xgettext', required : get_option('nls')).found()
|
|
core_conf.set('ENABLE_NLS', 1)
|
|
subdir('po')
|
|
endif
|
|
subdir('docs')
|
|
|
|
# Use core_conf after all subdirs have set values
|
|
configure_file(output : 'config.h', configuration : core_conf)
|
|
|
|
run_command(python3, '-c', 'import shutil; shutil.copy("hooks/pre-commit.hook", ".git/hooks/pre-commit")')
|