+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
+
+
+subprojects_names = []
+plugins_doc_caches = []
+orc_update_targets = []
+all_plugins = []
+all_tools = {}
+# Using a list and not a dict to keep the ordering to build the chain of `gir`
+# dependencies
+all_libraries = []
+foreach sp : subprojects
+ project_name = sp[0]
+ build_infos = sp[1]
+ is_required = build_infos.get('option', true)
+ sysdep = build_infos.get('sysdep', '')
+ sysdep_version = build_infos.get('sysdep_version', '')
+ match_gst_version = build_infos.get('match_gst_version', true)
+ default_options = build_infos.get('subproject_options', [])
+
+ if match_gst_version
+ subproj = subproject(project_name, version: gst_version, required: is_required, default_options: default_options)
+ elif sysdep != ''
+ sysdep_dep = dependency(sysdep, version: sysdep_version, required: false, default_options: default_options)
+ if not sysdep_dep.found()
+ subproj = subproject(project_name, required: is_required, default_options: default_options)
+ endif
+ else
+ subproj = subproject(project_name, required: is_required, default_options: default_options)
+ endif
+
+ if project_name == 'gst-plugins-base'
+ 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
+
+ if subproj.found()
+ plugins = subproj.get_variable('gst_plugins', [])
+ legacy_plugins = subproj.get_variable('plugins', [])
+ all_plugins += plugins
+ if plugins.length() == 0 and legacy_plugins.length() > 0
+ 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')
+ foreach plugin: legacy_plugins
+ all_plugins += [declare_dependency(link_with: plugin, variables: {'full_path': plugin.full_path()})]
+ endforeach
+ endif
+
+ all_libraries += subproj.get_variable('gst_libraries', [])
+ if not get_option('tools').disabled()
+ all_tools += subproj.get_variable('gst_tools', {})
+ endif
+
+ orc_update_targets += subproj.get_variable('orc_update_targets', [])
+
+ subprojects_names += [project_name]
+
+ if not meson.is_cross_build() and build_infos.get('build-hotdoc', false)
+ plugins_doc_caches += [subproj.get_variable('gst_plugins_doc_dep', [])]
+ if documented_projects != ''
+ documented_projects += ','
+ endif
+ documented_projects += project_name
+ endif
+ endif
+endforeach
+
+# Check if we need to also build glib-networking for TLS modules
+giomodules = []
+glib_dep = dependency('glib-2.0')
+if glib_dep.type_name() == 'internal'
+ subp = subproject('glib-networking', required : get_option('tls'),
+ default_options: ['gnutls=auto', 'openssl=auto'])
+ if subp.found()
+ giomodules += subp.get_variable('giomodules', [])
+ endif
+endif
+
+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,
+)
+
+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
+
+ documented_projects = ''
+ message('Documentation not built as building the documentation while cross building or building on windows is not supported yet.')
+else
+ hotdoc_p = find_program('hotdoc', required : get_option('doc'))
+ if not hotdoc_p.found()
+ documented_projects = ''
+ message('Not building documentation as hotdoc was not found')
+ endif
+endif
+
+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 != ''
+ subproject('gst-docs', required: get_option('doc').enabled())
+ message('Gst docs subprojects: ' + documented_projects)
+endif
+
+all_plugins_paths = []
+all_plugins_dirs = []
+plugins_names = []
+foreach plugin: all_plugins
+ plugin_path = plugin.get_variable('full_path')
+ all_plugins_paths += plugin_path
+ all_plugins_dirs += fs.parent(plugin_path)
+ plugins_names += plugin_path
+endforeach
+
+# Work around meson bug: https://github.com/mesonbuild/meson/pull/6770
+pathsep = host_machine.system() == 'windows' ? ';' : ':'
+all_plugins_paths = pathsep.join(all_plugins_paths)
+
+devenv = environment()
+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
+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', '')
+meson.add_devenv(devenv)
+
+generate_plugins_paths = find_program('scripts/generate_plugins_path.py')
+configure_file(
+ output : 'GstPluginsPath.json',
+ command : [generate_plugins_paths,
+ '@OUTPUT@',
+ all_plugins_paths]
+)
+
+if building_full
+ cdata = configuration_data()
+ cdata.set_quoted('GST_API_VERSION', apiversion)
+ cdata.set_quoted('GETTEXT_PACKAGE', 'gstreamer-full-1.0')
+ cdata.set_quoted('PACKAGE_VERSION', gst_version)
+ cdata.set_quoted('GST_PACKAGE_ORIGIN', get_option('package-origin'))
+ configure_file(output : 'config.h', configuration : cdata)
+ configinc = include_directories('.')
+ gst_c_args = ['-DHAVE_CONFIG_H']
+
+ # Generate a .c file which declare and register all built plugins
+ all_plugin_names = ';'.join(plugins_names)
+
+ static_plugins = get_option('gst-full-plugins')
+ if static_plugins == '*'
+ static_plugins = all_plugin_names
+ endif
+ 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,
+ '-o ' + '@OUTPUT@',
+ '-p ' + static_plugins,
+ '-e ' + get_option('gst-full-elements'),
+ '-t ' + get_option('gst-full-typefind-functions'),
+ '-d ' + get_option('gst-full-device-providers'),
+ '-T ' + get_option('gst-full-dynamic-types'),
+ '--giomodules', ';'.join(giomodules),
+ ]
+ )
+
+ gstfull_link_args = cc.get_supported_link_arguments(['-Wl,-Bsymbolic-functions'])
+
+ # Get a list of libraries that needs to be exposed in the ABI.
+ exposed_libs = []
+ exposed_deps = []
+ exposed_girs = []
+ incdir_deps = []
+ 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]
+ lib_def = pkgname_library[1]
+
+ if pkg_name in wanted_libs or all_libs
+ if lib_def.has_key('lib')
+ exposed_deps += dependency(pkg_name)
+ 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
+ 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.
+ glib_deps = []
+ glib_dep = dependency('glib-2.0')
+ gobject_dep = dependency('gobject-2.0')
+ if gobject_dep.type_name() == 'internal'
+ 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),
+ ]
+ else
+ glib_deps = [glib_dep, gobject_dep]
+ endif
+
+ 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
+ link_deps += symbol_map
+ elif cc.get_id() == 'msvc'
+ warning('FIXME: Provide a def file to publish the public symbols')
+ else
+ warning('FIXME: Linker does not support the supplied version script (' + symbol_map + '), please disable the "gst-full-version-script" option')
+ endif
+ endif