2019-11-19 08:56:01 +00:00
|
|
|
project('gst-plugins-rs',
|
|
|
|
'rust',
|
2020-01-10 01:52:31 +00:00
|
|
|
'c',
|
2019-11-19 08:56:01 +00:00
|
|
|
version: '0.13.0',
|
2021-01-07 09:03:01 +00:00
|
|
|
meson_version : '>= 0.56')
|
2019-11-19 08:56:01 +00:00
|
|
|
|
|
|
|
if get_option('debug')
|
|
|
|
target = 'debug'
|
|
|
|
else
|
|
|
|
target = 'release'
|
|
|
|
endif
|
|
|
|
|
2020-02-25 12:44:46 +00:00
|
|
|
cargo = find_program('cargo', version:'>=1.40')
|
2020-01-02 16:07:47 +00:00
|
|
|
cargo_wrapper = find_program('cargo_wrapper.py')
|
2021-01-04 14:19:23 +00:00
|
|
|
cargo_c = find_program('cargo-cbuild', required: false)
|
|
|
|
|
|
|
|
if not cargo_c.found()
|
|
|
|
error('cargo-c missing, install it with: \'cargo install cargo-c\'')
|
|
|
|
endif
|
2019-11-19 08:56:01 +00:00
|
|
|
|
|
|
|
system = build_machine.system()
|
|
|
|
if system == 'windows'
|
2020-11-16 14:23:51 +00:00
|
|
|
ext_dynamic = 'dll'
|
|
|
|
ext_static = 'lib'
|
2019-11-19 08:56:01 +00:00
|
|
|
elif system == 'darwin'
|
2020-11-16 14:23:51 +00:00
|
|
|
ext_dynamic = 'dylib'
|
|
|
|
ext_static = 'a'
|
2019-11-19 08:56:01 +00:00
|
|
|
else
|
2020-11-16 14:23:51 +00:00
|
|
|
ext_dynamic = 'so'
|
|
|
|
ext_static = 'a'
|
2019-11-19 08:56:01 +00:00
|
|
|
endif
|
|
|
|
|
|
|
|
plugins_rep = {
|
2020-11-26 15:12:42 +00:00
|
|
|
'audio/audiofx': 'libgstrsaudiofx',
|
|
|
|
'video/cdg': 'libgstcdg',
|
|
|
|
'audio/claxon': 'libgstclaxon',
|
|
|
|
'video/closedcaption': 'libgstrsclosedcaption',
|
|
|
|
'utils/fallbackswitch': 'libgstfallbackswitch',
|
|
|
|
'generic/file': 'libgstrsfile',
|
|
|
|
'video/flavors': 'libgstrsflv',
|
|
|
|
'video/gif': 'libgstgif',
|
|
|
|
'audio/lewton': 'libgstlewton',
|
|
|
|
'video/rav1e': 'libgstrav1e',
|
|
|
|
'net/reqwest': 'libgstreqwest',
|
|
|
|
'video/rspng': 'libgstrspng',
|
|
|
|
'net/rusoto': 'libgstrusoto',
|
|
|
|
'text/wrap': 'libgstrstextwrap',
|
|
|
|
'generic/threadshare': 'libgstthreadshare',
|
|
|
|
'utils/togglerecord': 'libgsttogglerecord',
|
|
|
|
'video/hsv': 'libgsthsv',
|
2020-12-04 22:21:57 +00:00
|
|
|
'text/json': 'libgstrsjson',
|
text: new element for text processing: regex
The element expects an array of "commands", as GstStructures,
in the form:
operation, pattern=<pattern>, ...
The only operation implemented for now is replace-all, eg:
replace-all, pattern=foo, replacement=bar
Other operations can be implemented if useful in the future,
eg. "match" could post a message to the bus when the pattern
is encountered.
The main use case for this is automatic speech recognition,
as implemented by eg awstranscribe as users may want to replace
swear words with tamer language.
Commands are applied in order.
The interface is usable through the CLI with the usual escaping
strategies, though trying to pass in actual regular expressions
through it is a bit tricky, as this introduces yet another
level of escaping.
2021-02-18 23:45:34 +00:00
|
|
|
'text/regex': 'libgstrsregex',
|
2021-03-16 22:43:55 +00:00
|
|
|
# FIXME: libwebp-sys2 will build its bundled version on msvc and apple platforms
|
|
|
|
# https://github.com/qnighy/libwebp-sys2-rs/issues/4
|
|
|
|
'video/webp': 'libgstrswebp',
|
2019-11-19 08:56:01 +00:00
|
|
|
}
|
|
|
|
|
2020-01-02 04:07:55 +00:00
|
|
|
exclude = []
|
2020-01-17 04:53:43 +00:00
|
|
|
extra_env = {}
|
2020-01-02 04:07:55 +00:00
|
|
|
|
2020-01-03 04:16:29 +00:00
|
|
|
if dependency('dav1d', required : get_option('dav1d')).found()
|
2020-11-26 15:12:42 +00:00
|
|
|
plugins_rep += {'video/dav1d' : 'libgstrsdav1d'}
|
2020-01-02 04:07:55 +00:00
|
|
|
else
|
2020-11-26 15:12:42 +00:00
|
|
|
exclude += ['video/dav1d']
|
2020-01-02 04:07:55 +00:00
|
|
|
endif
|
|
|
|
|
2020-01-17 04:53:43 +00:00
|
|
|
sodium = get_option ('sodium')
|
|
|
|
if sodium == 'system'
|
|
|
|
dependency('libsodium')
|
2020-11-26 15:12:42 +00:00
|
|
|
plugins_rep += {'generic/sodium': 'libgstsodium'}
|
2020-01-17 04:53:43 +00:00
|
|
|
extra_env += {'SODIUM_USE_PKG_CONFIG': '1'}
|
|
|
|
elif sodium == 'built-in'
|
2020-11-26 15:12:42 +00:00
|
|
|
plugins_rep += {'generic/sodium': 'libgstsodium'}
|
2020-01-17 04:53:43 +00:00
|
|
|
else
|
2020-11-26 15:12:42 +00:00
|
|
|
exclude += ['generic/sodium']
|
2020-01-17 04:53:43 +00:00
|
|
|
endif
|
|
|
|
|
2020-01-10 01:52:31 +00:00
|
|
|
cc = meson.get_compiler('c')
|
|
|
|
csound_option = get_option('csound')
|
|
|
|
csound_dep = dependency('', required: false) # not-found dependency
|
|
|
|
if not csound_option.disabled()
|
|
|
|
csound_dep = cc.find_library('csound64', required: false)
|
|
|
|
if not csound_dep.found()
|
|
|
|
python3 = import('python').find_installation('python3')
|
|
|
|
res = run_command(python3, '-c', 'import os; print(os.environ["CSOUND_LIB_DIR"])')
|
|
|
|
if res.returncode() == 0
|
|
|
|
csound_dep = cc.find_library('csound64', dirs: res.stdout(), required: csound_option)
|
|
|
|
elif csound_option.enabled()
|
|
|
|
error('csound option is enabled, but csound64 library could not be found and CSOUND_LIB_DIR was not set')
|
|
|
|
endif
|
|
|
|
endif
|
|
|
|
endif
|
|
|
|
|
2020-04-23 20:05:57 +00:00
|
|
|
if csound_dep.found()
|
2020-11-26 15:12:42 +00:00
|
|
|
plugins_rep += {'audio/csound' : 'libgstcsound'}
|
2020-01-10 01:52:31 +00:00
|
|
|
else
|
2020-11-26 15:12:42 +00:00
|
|
|
exclude += ['audio/csound']
|
2020-01-10 01:52:31 +00:00
|
|
|
endif
|
|
|
|
|
2019-11-19 08:56:01 +00:00
|
|
|
output = []
|
|
|
|
|
2020-11-16 14:23:51 +00:00
|
|
|
extensions = []
|
|
|
|
|
|
|
|
# Add the plugin file as output
|
|
|
|
if get_option('default_library') == 'shared' or get_option('default_library') == 'both'
|
|
|
|
extensions += [ext_dynamic]
|
|
|
|
foreach p, lib : plugins_rep
|
|
|
|
output += [lib + '.' + ext_dynamic]
|
|
|
|
endforeach
|
|
|
|
endif
|
|
|
|
|
|
|
|
if get_option('default_library') == 'static' or get_option('default_library') == 'both'
|
|
|
|
extensions += [ext_static]
|
|
|
|
foreach p, lib : plugins_rep
|
|
|
|
output += [lib + '.' + ext_static]
|
|
|
|
endforeach
|
|
|
|
endif
|
2019-11-19 08:56:01 +00:00
|
|
|
|
2020-11-26 15:50:04 +00:00
|
|
|
pc_files = []
|
|
|
|
foreach p, lib : plugins_rep
|
|
|
|
# skip the 'lib' prefix in plugin name
|
|
|
|
pc_files += [lib.substring(3) + '.pc']
|
|
|
|
endforeach
|
|
|
|
|
2019-12-23 05:51:55 +00:00
|
|
|
# Need to depends on all gstreamer-rs deps to ensure they are built
|
|
|
|
# before gstreamer-rs when building with gst-build.
|
|
|
|
# Custom targets can't depend on dependency() objects so we have to depend
|
|
|
|
# on the library variable from the subproject instead.
|
|
|
|
gst_req = '>= 1.14.0'
|
|
|
|
depends = []
|
|
|
|
|
|
|
|
deps = [
|
|
|
|
# name, subproject name, subproject dep, library object
|
|
|
|
['gstreamer-1.0', 'gstreamer', 'gst_dep', 'libgst'],
|
|
|
|
['gstreamer-app-1.0', 'gst-plugins-base', 'app_dep', 'gstapp'],
|
|
|
|
['gstreamer-audio-1.0', 'gst-plugins-base', 'audio_dep', 'gstaudio'],
|
|
|
|
['gstreamer-base-1.0', 'gstreamer', 'gst_base_dep', 'gst_base'],
|
|
|
|
['gstreamer-check-1.0', 'gstreamer', 'gst_check_dep', 'gst_check'],
|
|
|
|
['gstreamer-net-1.0', 'gstreamer', 'gst_net_dep', 'gst_net'],
|
|
|
|
['gstreamer-rtp-1.0', 'gst-plugins-base', 'rtp_dep', 'gst_rtp'],
|
|
|
|
['gstreamer-video-1.0', 'gst-plugins-base', 'video_dep', 'gstvideo'],
|
|
|
|
]
|
|
|
|
|
|
|
|
foreach d: deps
|
|
|
|
dep = dependency(d[0], version : gst_req,
|
|
|
|
fallback : [d[1], d[2]])
|
|
|
|
if dep.type_name() == 'internal'
|
|
|
|
lib = subproject(d[1]).get_variable(d[3])
|
|
|
|
depends += lib
|
|
|
|
endif
|
|
|
|
endforeach
|
|
|
|
|
2020-01-07 08:36:39 +00:00
|
|
|
exclude = ','.join(exclude)
|
|
|
|
|
2020-01-17 04:53:43 +00:00
|
|
|
# serialize extra_env
|
|
|
|
extra_env_list = []
|
|
|
|
foreach key, value : extra_env
|
|
|
|
extra_env_list += key + ':' + value
|
|
|
|
endforeach
|
|
|
|
extra_env_str = ','.join(extra_env_list)
|
|
|
|
|
2020-07-29 13:41:30 +00:00
|
|
|
plugins_install_dir = get_option('libdir') / 'gstreamer-1.0'
|
2020-11-26 15:50:04 +00:00
|
|
|
pkgconfig_install_dir = get_option('libdir') / 'pkgconfig'
|
2020-07-29 13:41:30 +00:00
|
|
|
|
2019-11-19 08:56:01 +00:00
|
|
|
# Always build the target so we don't have to list all source files as input
|
|
|
|
rs_plugins = custom_target('gst-plugins-rs',
|
|
|
|
build_by_default: true,
|
|
|
|
output: output,
|
|
|
|
console: true,
|
2020-07-29 13:41:30 +00:00
|
|
|
install: true,
|
|
|
|
install_dir: plugins_install_dir,
|
2019-11-19 08:56:01 +00:00
|
|
|
build_always_stale: true,
|
2019-12-23 05:51:55 +00:00
|
|
|
depends: depends,
|
2020-01-02 16:07:47 +00:00
|
|
|
command: [cargo_wrapper,
|
2020-01-07 06:10:12 +00:00
|
|
|
'build',
|
2019-11-19 08:56:01 +00:00
|
|
|
meson.current_build_dir(),
|
|
|
|
meson.current_source_dir(),
|
|
|
|
meson.build_root(),
|
|
|
|
target,
|
2020-01-07 08:36:39 +00:00
|
|
|
exclude,
|
2020-01-17 04:53:43 +00:00
|
|
|
extra_env_str,
|
2020-11-26 15:50:04 +00:00
|
|
|
get_option('prefix'),
|
|
|
|
get_option('libdir'),
|
2020-11-16 14:23:51 +00:00
|
|
|
extensions])
|
2019-11-19 08:56:01 +00:00
|
|
|
|
2020-11-17 08:22:03 +00:00
|
|
|
plugins = rs_plugins.to_list()
|
2020-01-07 08:36:39 +00:00
|
|
|
|
2020-11-26 15:50:04 +00:00
|
|
|
# We don't need to pass a command as we depends on the target above
|
|
|
|
# but it is currently mandatory ( https://github.com/mesonbuild/meson/issues/8059 )
|
|
|
|
# so use python as it's guaranteed to be present on any setup
|
|
|
|
python = import('python').find_installation()
|
|
|
|
custom_target('gst-plugins-rs-pc-files',
|
|
|
|
build_by_default: true,
|
|
|
|
output: pc_files,
|
|
|
|
console: true,
|
|
|
|
install: true,
|
|
|
|
install_dir: pkgconfig_install_dir,
|
|
|
|
depends: rs_plugins,
|
|
|
|
command: [python, '-c', '""'])
|
|
|
|
|
2020-01-07 08:36:39 +00:00
|
|
|
test('tests',
|
|
|
|
cargo_wrapper,
|
|
|
|
args: ['test',
|
|
|
|
meson.current_build_dir(),
|
|
|
|
meson.current_source_dir(),
|
|
|
|
meson.build_root(),
|
|
|
|
target,
|
2020-01-17 04:53:43 +00:00
|
|
|
exclude,
|
2020-11-26 15:50:04 +00:00
|
|
|
extra_env_str,
|
|
|
|
get_option('prefix'),
|
|
|
|
get_option('libdir')],
|
2020-01-07 08:36:39 +00:00
|
|
|
timeout: 600)
|