2021-10-22 16:38:46 +00:00
project ( 'gstreamer-full' , 'c' ,
2024-03-05 12:58:57 +00:00
version : '1.25.0.1' ,
2024-11-15 14:46:14 +00:00
meson_version : '>= 1.3' ,
2021-10-13 08:05:51 +00:00
default_options : [ 'buildtype=debugoptimized' ,
# Needed due to https://github.com/mesonbuild/meson/issues/1889,
# but this can cause problems in the future. Remove it
# when it's no longer necessary.
'cpp_std=c++14' ] )
2016-08-24 15:10:21 +00:00
2021-09-11 15:17:56 +00:00
apiversion = '1.0'
2016-09-05 14:54:46 +00:00
gst_version = '>= @0@' . format ( meson . project_version ( ) )
2016-08-24 15:10:21 +00:00
2024-08-17 08:58:35 +00:00
host_system = host_machine . system ( )
2018-05-17 08:25:43 +00:00
build_system = build_machine . system ( )
2016-11-19 13:16:03 +00:00
cc = meson . get_compiler ( 'c' )
2018-04-13 09:26:33 +00:00
2021-02-21 15:20:15 +00:00
fs = import ( 'fs' )
2021-09-13 21:20:11 +00:00
gnome = import ( 'gnome' )
2019-09-17 15:52:10 +00:00
pkgconfig = import ( 'pkgconfig' )
2019-06-25 15:25:36 +00:00
python3 = import ( 'python' ) . find_installation ( )
2022-02-21 09:49:15 +00:00
# Ensure that we're not being run from inside the development environment
2019-06-25 15:25:36 +00:00
# because that will confuse meson, and it might find the already-built
# gstreamer. It's fine if people run `ninja` as long as it doesn't run
# reconfigure because ninja doesn't care about the env.
2022-02-21 09:49:15 +00:00
ensure_not_devenv = '' '
2019-06-25 15:25:36 +00:00
import os
assert ( 'GST_ENV' not in os . environ )
'' '
2022-02-21 09:49:15 +00:00
cmdres = run_command ( python3 , '-c' , ensure_not_devenv , check : false )
2019-06-25 15:25:36 +00:00
if cmdres . returncode ( ) != 0
2022-02-21 09:58:28 +00:00
error ( 'Do not run `ninja reconfigure` or `meson` for gst-build inside the development environment, you will run into problems' )
2019-06-25 15:25:36 +00:00
endif
2021-09-24 18:11:13 +00:00
# Install gst-indent pre-commit hook
2022-01-04 20:37:59 +00:00
run_command ( python3 , '-c' , 'import shutil; shutil.copy("scripts/git-hooks/multi-pre-commit.hook", ".git/hooks/pre-commit")' , check : false )
2021-09-24 18:11:13 +00:00
2023-07-18 11:34:14 +00:00
gitlint_req = '>= 0.18'
gitlint = find_program ( 'gitlint' , version : gitlint_req , required : false )
2023-02-16 03:30:15 +00:00
if gitlint . found ( )
run_command ( gitlint , 'install-hook' , check : false )
else
2023-07-18 11:34:14 +00:00
message ( 'gitlint not found or too old, please install it with your package manager or `python3 -m pip install gitlint` to enable the commit message hook' )
2023-02-16 03:30:15 +00:00
endif
2022-07-02 00:03:40 +00:00
# On macOS, you have to run "Install Certificates.command" otherwise Python
# doesn't have access to the latest SSL CA Certificates, and Meson will fail to
# download wrap files from websites that use, for example, Let's Encrypt.
# We already recommend this in the README, but add a warning here as well.
# Can't make this an error because the user might be using XCode's Python
# 3 which doesn't have this script.
if build_system == 'darwin'
python3_cacert_file = python3 . get_path ( 'data' ) / 'etc/openssl/cert.pem'
install_cert_cmd = '/Applications/Python @0@/Install Certificates.command' . format ( python3 . language_version ( ) )
if not fs . is_symlink ( python3_cacert_file ) and fs . is_file ( install_cert_cmd )
warning ( 'Please run "@0@" so that Python has access to the latest SSL certificates. Meson might fail to download some wraps without it.' . format ( install_cert_cmd ) )
endif
endif
2018-10-28 14:06:35 +00:00
documented_projects = ''
2018-04-13 09:26:33 +00:00
# Make it possible to use msys2 built zlib which fails
# when not using the mingw toolchain as it uses unistd.h
2016-11-19 13:16:03 +00:00
if not meson . is_subproject ( ) and cc . get_id ( ) == 'msvc'
2018-04-22 00:50:06 +00:00
uname = find_program ( 'uname' , required : false )
if uname . found ( )
2022-01-04 20:37:59 +00:00
ret = run_command ( uname , '-o' , check : false )
2018-04-22 00:50:06 +00:00
if ret . returncode ( ) == 0 and ret . stdout ( ) . to_lower ( ) == 'msys'
2022-01-04 20:37:59 +00:00
ret = run_command ( uname , '-r' , check : false )
2018-04-22 00:50:06 +00:00
# The kernel version returned by uname is actually the msys version
if ret . returncode ( ) == 0 and ret . stdout ( ) . startswith ( '2' )
# If a system zlib is found, disable UNIX features in zlib.h and zconf.h
if cc . find_library ( 'z' ) . found ( )
add_global_arguments ( '-DZ_SOLO' , language : 'c' )
endif
2018-04-13 09:26:33 +00:00
endif
endif
endif
2020-11-04 10:30:14 +00:00
endif
2019-10-23 07:51:24 +00:00
2021-08-30 11:53:05 +00:00
# Ensure that MSVC interprets all source code as UTF-8. Only do this when we're
# not a subproject, because subprojects are not allowed to call
# add_global_arguments().
if not meson . is_subproject ( ) and cc . get_id ( ) == 'msvc'
2021-08-30 11:51:44 +00:00
add_global_arguments (
cc . get_supported_arguments ( [ '/utf-8' ] ) , # set the input encoding to utf-8
language : [ 'c' , 'cpp' ] )
endif
2024-08-06 21:19:04 +00:00
building_full = get_option ( 'default_library' ) == 'static' and not get_option ( 'gst-full' ) . disabled ( )
2023-07-25 13:16:09 +00:00
building_full_static = false
2023-10-18 21:52:57 +00:00
building_full_options = [ ]
2023-03-07 13:05:54 +00:00
if building_full
2023-07-25 13:16:09 +00:00
building_full_options = [ 'gstreamer-static-full=false' ]
building_full_static = get_option ( 'gst-full-target-type' ) == 'static_library'
if building_full_static
building_full_options = [ 'gstreamer-static-full=true' ]
endif
2021-09-11 15:17:56 +00:00
endif
2023-10-18 21:54:44 +00:00
libnice_options = [ ]
if get_option ( 'webrtc' ) . enabled ( )
libnice_options + = [ 'gstreamer=enabled' ]
endif
2024-08-17 08:58:35 +00:00
gtk_options = [
'build-demos=false' ,
'build-examples=false' ,
'build-testsuite=false' ,
'build-tests=false' ,
]
if host_system == 'windows'
gtk_options + = [ 'vulkan=disabled' ]
elif host_system == 'darwin'
gtk_options + = [ 'x11-backend=false' ]
endif
2023-05-16 14:47:49 +00:00
# Disable gst-python if we've disabled introspection
gst_python_option = get_option ( 'python' ) . disable_if ( get_option ( 'introspection' ) . disabled ( ) )
2019-02-18 16:13:07 +00:00
# Ordered list of subprojects (dict has no ordering guarantees)
subprojects = [
2023-10-18 21:52:57 +00:00
[ 'gstreamer' , { 'build-hotdoc' : true , 'subproject_options' : building_full_options } ] ,
2020-07-15 13:01:37 +00:00
[ 'gst-plugins-base' , { 'option' : get_option ( 'base' ) , 'build-hotdoc' : true } ] ,
[ 'gst-plugins-good' , { 'option' : get_option ( 'good' ) , 'build-hotdoc' : true } ] ,
2023-10-18 21:54:44 +00:00
[ 'libnice' , { 'option' : get_option ( 'libnice' ) , 'match_gst_version' : false , 'subproject_options' : libnice_options } ] ,
2020-07-07 14:36:04 +00:00
[ 'gst-plugins-bad' , { 'option' : get_option ( 'bad' ) , 'build-hotdoc' : true } ] ,
[ 'gst-plugins-ugly' , { 'option' : get_option ( 'ugly' ) , 'build-hotdoc' : true } ] ,
[ 'gst-libav' , { 'option' : get_option ( 'libav' ) , 'build-hotdoc' : true } ] ,
[ 'gst-rtsp-server' , { 'option' : get_option ( 'rtsp_server' ) , 'build-hotdoc' : true } ] ,
2023-03-07 13:05:54 +00:00
[ 'gst-devtools' , { 'option' : get_option ( 'devtools' ) , 'build-hotdoc' : true } ] ,
2019-03-13 22:08:59 +00:00
[ 'gst-integration-testsuites' , { 'option' : get_option ( 'devtools' ) } ] ,
2023-03-07 13:05:54 +00:00
[ 'gst-editing-services' , { 'option' : get_option ( 'ges' ) , 'build-hotdoc' : true } ] ,
2020-07-07 14:36:04 +00:00
[ 'gstreamer-vaapi' , { 'option' : get_option ( 'vaapi' ) , 'build-hotdoc' : true } ] ,
2019-02-18 16:13:07 +00:00
[ 'gstreamer-sharp' , { 'option' : get_option ( 'sharp' ) } ] ,
2021-10-18 20:19:13 +00:00
[ 'pygobject' , { 'option' : get_option ( 'python' ) , 'match_gst_version' : false , 'sysdep' : 'pygobject-3.0' , 'sysdep_version' : '>= 3.8' } ] ,
2023-05-16 14:47:49 +00:00
[ 'gst-python' , { 'option' : gst_python_option } ] ,
2019-11-02 16:18:27 +00:00
[ 'gst-examples' , { 'option' : get_option ( 'gst-examples' ) , 'match_gst_versions' : false } ] ,
2024-08-17 08:58:35 +00:00
[ 'gtk' , { 'option' : get_option ( 'gtk' ) , 'match_gst_version' : false , 'subproject_options' : gtk_options } ] ,
2022-08-26 12:39:00 +00:00
[ 'gst-plugins-rs' , { 'option' : get_option ( 'rs' ) , 'build-hotdoc' : true , 'match_gst_version' : false } ] ,
2019-02-18 16:13:07 +00:00
]
2017-08-22 19:29:58 +00:00
2023-04-14 07:43:24 +00:00
if get_option ( 'build-tools-source' ) == 'subproject'
if build_system == 'windows'
subproject ( 'win-flex-bison-binaries' )
subproject ( 'win-nasm' )
2022-10-19 18:26:21 +00:00
subproject ( 'win-pkgconfig' )
2023-04-14 07:43:24 +00:00
elif build_system == 'darwin'
subproject ( 'macos-bison-binary' )
2023-07-18 15:30:35 +00:00
# Newer macOS provides /usr/lib/pkgconfig/libpcre2-8.pc which is broken
# because it says headers are in /usr/include but that directory doesn't
# exist. It can only be used to find the library, which only exists on
# newer macOS at /usr/lib/libpcre2-8.dylib, so it's also unusable.
#
# jit support requires macOS 11.0 or newer, so disable it by default
subproject ( 'pcre2' , default_options : [ 'default_library=static' , 'jit=disabled' ] )
2023-04-14 07:43:24 +00:00
endif
2018-05-17 08:25:43 +00:00
endif
2022-09-21 16:18:31 +00:00
orc_option = get_option ( 'orc' )
# There is a check below to keep this in sync with subprojects/gst-plugins-base/meson.build
orc_req = '>= 0.4.24'
orc_source_option = get_option ( 'orc-source' )
orc_subproject = disabler ( )
if orc_option . allowed ( )
if orc_source_option == 'subproject'
orc_subproject = subproject ( 'orc' , required : orc_option )
else
dependency ( 'orc-0.4' , version : orc_req , required : orc_option ,
allow_fallback : orc_source_option == 'auto' )
endif
endif
2019-01-29 01:58:21 +00:00
2021-12-12 13:20:55 +00:00
foreach custom_subproj : get_option ( 'custom_subprojects' ) . split ( ',' )
if custom_subproj != ''
message ( 'Adding custom subproject ' + custom_subproj )
subprojects + = [ [ custom_subproj , { 'match_gst_version' : false } ] ]
endif
endforeach
2018-07-12 14:14:33 +00:00
subprojects_names = [ ]
2019-05-16 13:26:47 +00:00
plugins_doc_caches = [ ]
2020-07-04 14:00:35 +00:00
orc_update_targets = [ ]
2019-09-17 19:53:40 +00:00
all_plugins = [ ]
2021-09-11 15:17:56 +00:00
all_tools = { }
2023-03-16 08:39:27 +00:00
all_helpers = { }
gst_tools = [ ]
gst_helpers = [ ]
gst_libraries = [ ]
2021-10-16 01:07:39 +00:00
# Using a list and not a dict to keep the ordering to build the chain of `gir`
# dependencies
2021-09-13 21:20:11 +00:00
all_libraries = [ ]
2019-02-18 16:13:07 +00:00
foreach sp : subprojects
project_name = sp [ 0 ]
build_infos = sp [ 1 ]
2018-10-20 22:04:25 +00:00
is_required = build_infos . get ( 'option' , true )
2021-10-13 10:38:35 +00:00
sysdep = build_infos . get ( 'sysdep' , '' )
sysdep_version = build_infos . get ( 'sysdep_version' , '' )
2019-04-05 13:27:37 +00:00
match_gst_version = build_infos . get ( 'match_gst_version' , true )
2021-09-11 15:17:56 +00:00
default_options = build_infos . get ( 'subproject_options' , [ ] )
2019-04-05 13:27:37 +00:00
if match_gst_version
2021-09-11 15:17:56 +00:00
subproj = subproject ( project_name , version : gst_version , required : is_required , default_options : default_options )
2021-10-13 10:38:35 +00:00
elif sysdep != ''
2023-01-26 14:22:37 +00:00
sysdep_dep = dependency ( sysdep , version : sysdep_version , required : is_required , default_options : default_options )
2019-04-05 13:27:37 +00:00
else
2021-09-11 15:17:56 +00:00
subproj = subproject ( project_name , required : is_required , default_options : default_options )
2019-04-05 13:27:37 +00:00
endif
2023-10-17 18:21:19 +00:00
if project_name == 'gst-plugins-base' and subproj . found ( )
2022-09-21 16:18:31 +00:00
gst_base_orc_req = subproj . get_variable ( 'orc_req' , '' )
if gst_base_orc_req != orc_req
error ( 'orc_req is "@0@" but it should be "@1@" from subprojects/gst-plugins-base/meson.build'
. format ( orc_req , gst_base_orc_req ) )
endif
endif
2019-05-26 13:49:21 +00:00
if subproj . found ( )
2022-08-31 22:44:14 +00:00
plugins = subproj . get_variable ( 'gst_plugins' , [ ] )
2022-09-02 14:46:45 +00:00
legacy_plugins = subproj . get_variable ( 'plugins' , [ ] )
2019-09-17 19:53:40 +00:00
all_plugins + = plugins
2022-09-02 14:46:45 +00:00
if plugins . length ( ) == 0 and legacy_plugins . length ( ) > 0
2022-08-31 22:44:14 +00:00
warning ( f 'DEPRECATED use of the `plugins` variable in @project_name@.' )
warning ( 'The variable should now be called `gst_plugins` and use:' )
warning ( '`declare_dependency( link_with: <plugin_target>, variable: {\'full_path\': <plugin_target>.full_path()})` instead' )
2022-09-02 14:46:45 +00:00
foreach plugin : legacy_plugins
2022-08-31 22:44:14 +00:00
all_plugins + = [ declare_dependency ( link_with : plugin , variables : { 'full_path' : plugin . full_path ( ) } ) ]
endforeach
endif
2022-09-01 15:51:48 +00:00
all_libraries + = subproj . get_variable ( 'gst_libraries' , [ ] )
2022-03-31 09:45:13 +00:00
if not get_option ( 'tools' ) . disabled ( )
all_tools + = subproj . get_variable ( 'gst_tools' , { } )
2023-03-16 08:39:27 +00:00
all_helpers + = subproj . get_variable ( 'gst_helpers' , { } )
2022-03-31 09:45:13 +00:00
endif
2018-10-28 14:06:35 +00:00
2020-07-04 14:00:35 +00:00
orc_update_targets + = subproj . get_variable ( 'orc_update_targets' , [ ] )
2018-10-20 22:04:25 +00:00
subprojects_names + = [ project_name ]
2019-05-26 13:49:21 +00:00
2024-12-04 18:36:58 +00:00
if not meson . is_cross_build ( ) and build_infos . get ( 'build-hotdoc' , false ) and get_option ( 'doc' ) . allowed ( )
2022-09-01 15:51:48 +00:00
plugins_doc_caches + = [ subproj . get_variable ( 'gst_plugins_doc_dep' , [ ] ) ]
2019-05-26 13:49:21 +00:00
if documented_projects != ''
documented_projects + = ','
endif
documented_projects + = project_name
endif
2018-10-20 22:04:25 +00:00
endif
2016-08-24 15:10:21 +00:00
endforeach
2020-07-23 11:01:07 +00:00
# Check if we need to also build glib-networking for TLS modules
2022-06-23 15:50:00 +00:00
giomodules = [ ]
2020-07-23 11:01:07 +00:00
glib_dep = dependency ( 'glib-2.0' )
if glib_dep . type_name ( ) == 'internal'
2022-06-23 15:50:00 +00:00
subp = subproject ( 'glib-networking' , required : get_option ( 'tls' ) ,
2024-06-22 22:14:55 +00:00
default_options : [ 'gnutls=auto' , 'openssl=auto' , 'libproxy=auto' , 'gnome_proxy=auto' ] )
2022-06-23 15:50:00 +00:00
if subp . found ( )
giomodules + = subp . get_variable ( 'giomodules' , [ ] )
endif
2020-07-23 11:01:07 +00:00
endif
2024-12-04 18:36:58 +00:00
if get_option ( 'doc' ) . allowed ( )
gst_plugins_doc_dep = custom_target ( 'plugins-doc-cache' ,
command : [ python3 , '-c' , 'print("Built all doc caches")' ] ,
input : plugins_doc_caches ,
output : 'plugins_doc_caches' ,
capture : true ,
)
else
message ( 'doc option is disabled, will not generate targets for building plugins doc caches' )
endif
2019-05-16 13:26:47 +00:00
2022-08-31 18:15:16 +00:00
gir_files = [ ]
gir_targets = [ ]
foreach pkgname_library : all_libraries
lib_def = pkgname_library [ 1 ]
foreach gir_target : lib_def . get ( 'gir_targets' , [ ] )
gir_files + = [ gir_target [ 0 ] . full_path ( ) ]
gir_targets + = gir_target
endforeach
endforeach
custom_target ( 'update_girs' ,
2023-10-22 07:21:53 +00:00
command : [ find_program ( 'scripts/update-girs.py' ) , meson . global_build_root ( ) ] + gir_files ,
2022-08-31 18:15:16 +00:00
output : 'update_girs' ,
capture : true ,
depends : gir_targets
)
2018-11-12 23:23:14 +00:00
if meson . is_cross_build ( ) or build_machine . system ( ) == 'windows'
if get_option ( 'doc' ) . enabled ( )
error ( 'Documentation enabled but building the doc while cross building or building on windows is not supported yet.' )
endif
2020-04-23 03:48:22 +00:00
documented_projects = ''
2019-05-14 22:21:54 +00:00
message ( 'Documentation not built as building the documentation while cross building or building on windows is not supported yet.' )
2018-10-28 14:06:35 +00:00
else
hotdoc_p = find_program ( 'hotdoc' , required : get_option ( 'doc' ) )
2020-04-23 03:48:22 +00:00
if not hotdoc_p . found ( )
documented_projects = ''
2018-10-28 14:06:35 +00:00
message ( 'Not building documentation as hotdoc was not found' )
endif
endif
2018-07-12 14:14:33 +00:00
2020-04-23 03:48:22 +00:00
write_file_contents = '' '
import os
import sys
assert len ( sys . argv ) > = 3
fname = sys . argv [ 1 ]
contents = sys . argv [ 2 ]
with open ( fname , 'w' ) as f :
f . write ( contents )
'' '
configure_file (
output : 'GstDocumentedSubprojects' ,
command : [ python3 ,
'-c' , write_file_contents ,
'@OUTPUT@' ,
documented_projects ]
)
if documented_projects != ''
2022-11-21 16:21:27 +00:00
gst_doc = subproject ( 'gst-docs' , required : get_option ( 'doc' ) . enabled ( ) )
if gst_doc . found ( )
gst_doc_target = gst_doc . get_variable ( 'gstreamer_doc' )
alias_target ( 'gst-doc' , gst_doc_target )
endif
2020-04-23 03:48:22 +00:00
message ( 'Gst docs subprojects: ' + documented_projects )
endif
2019-09-17 19:53:40 +00:00
all_plugins_paths = [ ]
2021-02-21 15:20:15 +00:00
all_plugins_dirs = [ ]
2022-08-31 22:44:14 +00:00
plugins_names = [ ]
2019-09-17 19:53:40 +00:00
foreach plugin : all_plugins
2022-08-31 22:44:14 +00:00
plugin_path = plugin . get_variable ( 'full_path' )
all_plugins_paths + = plugin_path
all_plugins_dirs + = fs . parent ( plugin_path )
2022-12-05 08:50:43 +00:00
plugins_names + = fs . name ( plugin_path )
2019-09-17 19:53:40 +00:00
endforeach
2022-08-31 22:44:14 +00:00
2020-03-11 17:49:11 +00:00
# Work around meson bug: https://github.com/mesonbuild/meson/pull/6770
pathsep = host_machine . system ( ) == 'windows' ? ';' : ':'
all_plugins_paths = pathsep . join ( all_plugins_paths )
2019-09-17 19:53:40 +00:00
2021-02-21 15:20:15 +00:00
devenv = environment ( )
2022-08-31 01:15:25 +00:00
if not building_full
devenv . prepend ( 'GST_PLUGIN_PATH' , all_plugins_dirs )
else
# Make sure the current build directory is first in PATH so we prefer tools
# built here that links on gst-full instead instead of those built in
# subprojects.
devenv . prepend ( 'PATH' , meson . current_build_dir ( ) )
endif
2021-02-21 15:20:15 +00:00
devenv . set ( 'CURRENT_GST' , meson . current_source_dir ( ) )
devenv . set ( 'GST_VERSION' , meson . project_version ( ) )
devenv . set ( 'GST_ENV' , 'gst-' + meson . project_version ( ) )
devenv . set ( 'GST_REGISTRY' , meson . current_build_dir ( ) / 'registry.dat' )
devenv . set ( 'GST_PLUGIN_SYSTEM_PATH' , '' )
2023-12-01 13:21:03 +00:00
devenv . set ( 'GST_PLUGIN_LOADING_WHITELIST' , '*' )
2021-02-21 15:20:15 +00:00
meson . add_devenv ( devenv )
2019-09-17 19:53:40 +00:00
generate_plugins_paths = find_program ( 'scripts/generate_plugins_path.py' )
configure_file (
output : 'GstPluginsPath.json' ,
command : [ generate_plugins_paths ,
'@OUTPUT@' ,
all_plugins_paths ]
)
2018-11-11 23:06:04 +00:00
2021-09-11 15:17:56 +00:00
if building_full
cdata = configuration_data ( )
cdata . set_quoted ( 'GST_API_VERSION' , apiversion )
cdata . set_quoted ( 'GETTEXT_PACKAGE' , 'gstreamer-full-1.0' )
2023-09-28 16:22:38 +00:00
cdata . set_quoted ( 'PACKAGE_VERSION' , meson . project_version ( ) )
2021-09-11 15:17:56 +00:00
cdata . set_quoted ( 'GST_PACKAGE_ORIGIN' , get_option ( 'package-origin' ) )
2023-09-28 16:22:38 +00:00
cdata . set_quoted ( 'GST_FULL_LICENSE' , get_option ( 'gstreamer-full-license' ) )
cdata . set_quoted ( 'GST_PLUGIN_FULL_FEATURES_NAME' , 'fullstaticfeatures' )
2021-09-11 15:17:56 +00:00
configure_file ( output : 'config.h' , configuration : cdata )
configinc = include_directories ( '.' )
gst_c_args = [ '-DHAVE_CONFIG_H' ]
2019-09-17 15:52:10 +00:00
# Generate a .c file which declare and register all built plugins
2020-07-16 11:18:38 +00:00
static_plugins = get_option ( 'gst-full-plugins' )
2023-08-24 20:22:03 +00:00
plugins_to_be_initialized = [ ]
2020-07-16 11:18:38 +00:00
if static_plugins == '*'
2023-08-24 20:22:03 +00:00
all_plugin_names = ';' . join ( plugins_names )
else
missing_plugins = [ ]
foreach plugin : static_plugins . split ( ';' )
if plugins_names . contains ( plugin )
plugins_to_be_initialized + = [ plugin ]
else
missing_plugins + = [ plugin ]
endif
endforeach
if missing_plugins . length ( ) > 0
error ( 'Some gstreamer-full plugins enabled via the \'gst-full-plugins\' option are not available, please enable the corresponding meson options: @0@' . format ( ', ' . join ( missing_plugins ) ) )
endif
all_plugin_names = ';' . join ( plugins_to_be_initialized )
2020-07-16 11:18:38 +00:00
endif
2019-09-17 15:52:10 +00:00
generate_init_static_plugins = find_program ( 'scripts/generate_init_static_plugins.py' )
init_static_plugins_c = configure_file (
output : 'gstinitstaticplugins.c' ,
command : [ generate_init_static_plugins ,
2020-07-16 11:18:38 +00:00
'-o ' + '@OUTPUT@' ,
2023-08-24 20:22:03 +00:00
'-p ' + all_plugin_names ,
2020-07-16 11:18:38 +00:00
'-e ' + get_option ( 'gst-full-elements' ) ,
'-t ' + get_option ( 'gst-full-typefind-functions' ) ,
'-d ' + get_option ( 'gst-full-device-providers' ) ,
2022-06-23 15:50:00 +00:00
'-T ' + get_option ( 'gst-full-dynamic-types' ) ,
'--giomodules' , ';' . join ( giomodules ) ,
2020-07-16 11:18:38 +00:00
]
2019-09-17 15:52:10 +00:00
)
2020-10-13 14:31:57 +00:00
gstfull_link_args = cc . get_supported_link_arguments ( [ '-Wl,-Bsymbolic-functions' ] )
2019-09-17 15:52:10 +00:00
# Get a list of libraries that needs to be exposed in the ABI.
exposed_libs = [ ]
2021-09-11 15:17:56 +00:00
exposed_deps = [ ]
2021-09-13 21:20:11 +00:00
exposed_girs = [ ]
2020-07-24 15:15:44 +00:00
incdir_deps = [ ]
2021-09-13 21:20:11 +00:00
wanted_libs = [ 'gstreamer-1.0' ] + get_option ( 'gst-full-libraries' )
all_libs = '*' in wanted_libs
foreach pkgname_library : all_libraries
pkg_name = pkgname_library [ 0 ]
2023-03-16 08:39:27 +00:00
gst_libraries + = pkg_name
2021-09-13 21:20:11 +00:00
lib_def = pkgname_library [ 1 ]
if pkg_name in wanted_libs or all_libs
if lib_def . has_key ( 'lib' )
2021-09-11 15:17:56 +00:00
exposed_deps + = dependency ( pkg_name )
2021-09-13 21:20:11 +00:00
incdir_deps + = dependency ( pkg_name ) . partial_dependency ( includes : true , sources : true )
exposed_libs + = [ lib_def [ 'lib' ] ]
endif
if lib_def . has_key ( 'gir' )
exposed_girs + = lib_def [ 'gir' ]
endif
endif
2019-09-17 15:52:10 +00:00
endforeach
# glib and gobject are part of our public API. If we are using glib from the
# system then our pkg-config file must require it. If we built it as
# subproject then we need to link_whole it.
2023-08-17 01:20:06 +00:00
# Note that link_whole dependencies aren't exposed transitively in
# Windows/Cygwin, because symbols from static libraries must
# be manually marked as exported through a module definition file.
# See e.g. https://github.com/FFmpeg/FFmpeg/blob/3057ce797f6e1348b978f5ffe9e2afd2224544f0/configure#L5726
2020-07-24 15:15:44 +00:00
glib_deps = [ ]
glib_dep = dependency ( 'glib-2.0' )
gobject_dep = dependency ( 'gobject-2.0' )
2019-09-17 15:52:10 +00:00
if gobject_dep . type_name ( ) == 'internal'
2020-07-24 15:15:44 +00:00
glib_subproject = subproject ( 'glib' )
exposed_libs + = glib_subproject . get_variable ( 'libglib' )
exposed_libs + = glib_subproject . get_variable ( 'libgobject' )
incdir_deps + = [
glib_dep . partial_dependency ( includes : true ) ,
gobject_dep . partial_dependency ( includes : true ) ,
]
2019-09-17 15:52:10 +00:00
else
2020-07-24 15:15:44 +00:00
glib_deps = [ glib_dep , gobject_dep ]
2019-09-17 15:52:10 +00:00
endif
2020-08-11 13:49:53 +00:00
link_deps = [ ]
if get_option ( 'gst-full-version-script' ) != ''
symbol_map = meson . current_source_dir ( ) / get_option ( 'gst-full-version-script' )
link_arg = '-Wl,--version-script=' + symbol_map
if cc . has_link_argument ( link_arg )
gstfull_link_args + = link_arg
2020-11-18 09:44:34 +00:00
link_deps + = symbol_map
elif cc . get_id ( ) == 'msvc'
warning ( 'FIXME: Provide a def file to publish the public symbols' )
2020-08-11 13:49:53 +00:00
else
2021-10-19 10:32:32 +00:00
warning ( 'FIXME: Linker does not support the supplied version script (' + symbol_map + '), please disable the "gst-full-version-script" option' )
2020-08-11 13:49:53 +00:00
endif
endif
2022-06-23 15:50:00 +00:00
giomodules_deps = [ ]
foreach module : giomodules
giomodules_deps + = dependency ( module )
endforeach
2023-03-07 13:05:54 +00:00
# Build shared library
gstfull = build_target ( 'gstreamer-full-1.0' ,
2019-09-17 15:52:10 +00:00
init_static_plugins_c ,
2023-09-28 16:22:38 +00:00
c_args : [ '-DBUILDING_GST' ] + gst_c_args ,
2023-03-07 13:05:54 +00:00
target_type : get_option ( 'gst-full-target-type' ) ,
2020-07-07 09:13:49 +00:00
link_args : gstfull_link_args ,
2019-09-17 15:52:10 +00:00
link_whole : exposed_libs ,
2022-06-23 15:50:00 +00:00
dependencies : [ incdir_deps , glib_deps , all_plugins , giomodules_deps ] ,
2020-08-11 13:49:53 +00:00
link_depends : link_deps ,
2019-09-17 15:52:10 +00:00
install : true ,
)
2023-07-25 13:16:09 +00:00
gst_full_c_flags = [ '-DGST_STATIC_COMPILATION' ]
2023-03-23 12:03:18 +00:00
2023-08-17 01:20:06 +00:00
gst_full_libs = [ gstfull ]
# See above re: symbol exports in Win32
if [ 'windows' , 'cygwin' ] . contains ( host_machine . system ( ) )
gst_full_libs + = exposed_libs
endif
gst_full_dep = declare_dependency ( link_with : gst_full_libs ,
2023-03-23 12:03:18 +00:00
compile_args : gst_full_c_flags ,
2020-07-24 15:15:44 +00:00
dependencies : incdir_deps + glib_deps ,
2020-07-15 14:57:47 +00:00
include_directories : include_directories ( '.' )
)
2021-09-13 21:20:11 +00:00
2020-10-22 09:55:43 +00:00
gst_full_libs_private = cc . get_supported_link_arguments ( [ '-Wl,--undefined=gst_init_static_plugins' ] )
if gst_full_libs_private == [ ]
warning ( 'The compiler does not support `-Wl,--undefined` linker flag. The method `gst_init_static_plugins` might be dropped during the link stage of an application using libgstreamer-full-1.0.a, preventing plugins registration.' )
endif
2021-09-13 21:20:11 +00:00
2023-03-07 13:05:54 +00:00
if building_full_static
warning ( 'Introspection is enabled in gst-full static build mode but this is not supported by now. gir generation is now disabled.' )
endif
# FIXME: gnome.generate_gir should link with not only gstfull in static gst-full but the whole gstreamer suite.
# tried dependencies without success.
if not get_option ( 'introspection' ) . disabled ( ) and not building_full_static
2021-09-13 21:20:11 +00:00
built_girs = { }
foreach gir : exposed_girs
includes = [ ]
foreach include : gir . get ( 'includes' , [ ] )
includes + = [ built_girs . get ( include , include ) ]
endforeach
gir + = {
'includes' : includes ,
'extra_args' : gir . get ( 'extra_args' , [ ] ) + [ '--add-include-path=' + meson . current_build_dir ( ) ] ,
'install' : true ,
}
built_girs + = { gir . get ( 'namespace' ) + '-' + gir . get ( 'nsversion' ) : gnome . generate_gir ( gstfull , kwargs : gir ) [ 0 ] }
endforeach
endif
2019-09-17 15:52:10 +00:00
pkgconfig . generate ( gstfull ,
2020-07-24 15:15:44 +00:00
requires : glib_deps ,
2020-10-22 09:55:43 +00:00
libraries_private : gst_full_libs_private ,
2023-03-23 12:03:18 +00:00
extra_cflags : gst_full_c_flags ,
2019-09-17 15:52:10 +00:00
subdirs : 'gstreamer-1.0' )
2020-07-15 14:57:47 +00:00
meson . override_dependency ( 'gstreamer-full-1.0' , gst_full_dep )
2021-09-11 15:17:56 +00:00
if not get_option ( 'tools' ) . disabled ( )
2023-03-16 08:39:27 +00:00
# Loop for tools
2021-09-11 15:17:56 +00:00
foreach tool , data : all_tools
2023-03-16 08:39:27 +00:00
gst_tools + = tool
2021-09-11 15:17:56 +00:00
exe_name = '@0@-@1@' . format ( tool , apiversion )
2023-03-07 13:05:54 +00:00
2021-09-11 15:17:56 +00:00
deps = [ ]
foreach d : data . get ( 'deps' , [ ] )
if d not in exposed_deps
deps + = d
endif
endforeach
2023-03-07 13:05:54 +00:00
exe = executable ( exe_name ,
data . get ( 'files' ) ,
install : data . get ( 'install' , true ) ,
install_tag : data . get ( 'install_tag' , 'bin' ) ,
install_dir : data . get ( 'install_dir' , get_option ( 'bindir' ) ) ,
include_directories : data . get ( 'include_directories' , [ configinc ] ) ,
2021-09-11 15:17:56 +00:00
dependencies : [ gst_full_dep ] + deps ,
2023-03-07 13:05:54 +00:00
c_args : data . get ( 'extra_c_args' , [ ] ) + gst_c_args + [ '-DG_LOG_DOMAIN="@0@"' . format ( exe_name ) ] ,
cpp_args : data . get ( 'extra_cpp_args' , [ ] ) ,
objc_args : data . get ( 'extra_objc_args' , [ ] ) ,
override_options : data . get ( 'override_options' , [ ] ) ,
2021-09-11 15:17:56 +00:00
)
2023-03-07 13:05:54 +00:00
if ( data . has_key ( 'env' ) )
env = data . get ( 'env' )
value = env [ 1 ]
if env [ 1 ] == 'exe-full-path'
value = exe . full_path ( )
endif
meson . add_devenv ( { env [ 0 ] : value } )
endif
2021-09-11 15:17:56 +00:00
if data . has_key ( 'man_page' )
install_man ( data . get ( 'man_page' ) )
endif
endforeach
2023-03-16 08:39:27 +00:00
# Loop for helpers tools
foreach helper , data : all_helpers
gst_helpers + = helper
exe_name = '@0@' . format ( helper )
deps = [ ]
foreach d : data . get ( 'deps' , [ ] )
if d not in exposed_deps
deps + = d
endif
endforeach
exe = executable ( exe_name ,
data . get ( 'files' ) ,
install : data . get ( 'install' , true ) ,
install_tag : data . get ( 'install_tag' , 'bin' ) ,
install_dir : data . get ( 'install_dir' , get_option ( 'bindir' ) ) ,
include_directories : data . get ( 'include_directories' , [ configinc ] ) ,
dependencies : [ gst_full_dep ] + deps ,
c_args : data . get ( 'extra_c_args' , [ ] ) + gst_c_args + [ '-DG_LOG_DOMAIN="@0@"' . format ( exe_name ) ] ,
cpp_args : data . get ( 'extra_cpp_args' , [ ] ) ,
objc_args : data . get ( 'extra_objc_args' , [ ] ) ,
override_options : data . get ( 'override_options' , [ ] ) ,
)
if ( data . has_key ( 'env' ) )
env = data . get ( 'env' )
value = env [ 1 ]
if env [ 1 ] == 'exe-full-path'
value = exe . full_path ( )
endif
meson . add_devenv ( { env [ 0 ] : value } )
endif
if data . has_key ( 'man_page' )
install_man ( data . get ( 'man_page' ) )
endif
endforeach
2021-09-11 15:17:56 +00:00
endif
2023-03-16 08:39:27 +00:00
else # not gst_full
foreach tool , data : all_tools
gst_tools + = tool
endforeach
foreach helper , data : all_helpers
gst_helpers + = helper
endforeach
foreach library : all_libraries
gst_libraries = library [ 0 ]
endforeach
2019-09-17 15:52:10 +00:00
endif
2018-10-28 14:06:35 +00:00
message ( 'Building subprojects: ' + ', ' . join ( subprojects_names ) )
2020-07-16 16:13:50 +00:00
2019-08-03 02:19:04 +00:00
setenv = find_program ( 'gst-env.py' )
2022-02-17 20:41:40 +00:00
2022-03-18 08:13:00 +00:00
devenv_cmd = [ setenv , '--builddir=@0@' . format ( meson . global_build_root ( ) ) ,
'--srcdir=@0@' . format ( meson . global_source_root ( ) ) ]
2019-08-03 02:19:04 +00:00
2021-10-14 20:01:01 +00:00
subdir ( 'tests' )
2022-04-06 09:22:44 +00:00
subdir ( 'ci/fuzzing' )
2021-10-18 15:51:37 +00:00
if meson . can_run_host_binaries ( ) and build_machine . system ( ) == 'linux' and host_machine . system ( ) == 'windows'
2019-08-03 02:22:16 +00:00
# FIXME: Ideally we could get the wrapper directly from meson
devenv_cmd + = [ '--wine' , host_machine . cpu_family ( ) == 'x86_64' ? 'wine64' : 'wine32' ]
sysroot = meson . get_cross_property ( 'sys_root' )
if sysroot != ''
# Logic from meson
devenv_cmd + = [ '--winepath' , 'Z:' + join_paths ( sysroot , 'bin' ) ]
endif
endif
2019-08-03 02:19:04 +00:00
run_target ( 'devenv' , command : devenv_cmd )
2016-11-07 21:17:39 +00:00
2020-07-08 10:28:19 +00:00
if orc_subproject . found ( ) and orc_update_targets . length ( ) > 0
2020-07-04 14:00:35 +00:00
alias_target ( 'update-orc-dist' , orc_update_targets )
endif
2021-10-13 00:29:00 +00:00
2022-11-07 00:10:39 +00:00
subdir ( 'scripts' )
2021-09-30 11:01:26 +00:00
dotnet_format = find_program ( 'dotnet-format' , required : false )
if dotnet_format . found ( )
run_target ( 'csharp_format_check' ,
2022-04-11 13:55:07 +00:00
command : [ join_paths ( meson . current_source_dir ( ) , 'scripts' , 'format-csharp' ) ,
2021-09-30 11:01:26 +00:00
'--check'
] ,
)
run_target ( 'csharp_format_apply' ,
2022-04-11 13:55:07 +00:00
command : [ join_paths ( meson . current_source_dir ( ) , 'scripts' , 'format-csharp' ) ,
2021-09-30 11:01:26 +00:00
] ,
)
endif
2021-10-13 00:29:00 +00:00
summary ( {
2022-03-31 09:45:13 +00:00
'gstreamer-full library' : building_full ,
2023-03-07 13:05:54 +00:00
'gstreamer-full target type' : get_option ( 'gst-full-target-type' ) ,
2023-03-16 08:39:27 +00:00
'Tools' : gst_tools ,
'Helpers' : gst_helpers ,
'Libraries' : gst_libraries ,
2023-03-07 13:05:54 +00:00
'Tests and examples disabled' : building_full ,
2021-10-13 00:29:00 +00:00
} , section : 'Build options' , bool_yn : true , list_sep : ' ' )