diff --git a/dependencies.py b/dependencies.py index eff6729b..9955a5df 100755 --- a/dependencies.py +++ b/dependencies.py @@ -19,6 +19,8 @@ except ImportError: PARSER = ArgumentParser() PARSER.add_argument('src_dir', type=Path) PARSER.add_argument('plugins', nargs='*') +PARSER.add_argument('--features', action="store_true", help="Get list of features to activate") +PARSER.add_argument('--gst-version', help="Get list of features to activate") # Map plugin name to directory name, for those that does not match. @@ -38,27 +40,73 @@ RENAMES = { 'textwrap': 'wrap', } +class CargoAnalyzer: + def __init__(self): + self.src_dir = None + self.plugins = None + self.features = False + self.gst_version = "1.18" + + def extract_version(self, feature_name): + if feature_name.startswith('v'): + verindex = 1 + elif feature_name.startswith('gst'): + verindex = 3 + else: + return None + + (majver, minver) = feature_name[verindex:].split("_") + return (int(majver), int(minver)) + + def extract_features(self, cargo_data): + features = cargo_data['features'] + wanted_features = set() + gst_version_major = int(self.gst_version.split('.')[0]) + gst_version_minor = int(self.gst_version.split('.')[1]) + for (name, value) in features.items(): + version = self.extract_version(name) + + if version is None: + continue + (majver, minver) = version + + if gst_version_major < majver or gst_version_minor < minver: + continue + wanted_features |= set(value) + if name.startswith("gst"): + # Required for some reason for rswebrtc which has a specific feature + wanted_features |= {f"{cargo_data['package']['name']}/{name}"} + + return wanted_features + + def run(self): + with (opts.src_dir / 'Cargo.toml').open('rb') as f: + crates = tomllib.load(f)['workspace']['members'] + res = set() + for name in opts.plugins: + if name.startswith('gst'): + name = name[3:] + + name = RENAMES.get(name, name) + crate_path = None + for crate in crates: + if Path(crate).name == name: + crate_path = opts.src_dir / crate / 'Cargo.toml' + assert crate_path + with crate_path.open('rb') as f: + data = tomllib.load(f) + if opts.features: + res |= self.extract_features(data) + else: + try: + requires = data['package']['metadata']['capi']['pkg_config']['requires_private'] + except KeyError: + continue + res.update([i.strip().replace('>', "|>").replace('<', "|<").replace("==", "|==") for i in requires.split(',')]) + return res if __name__ == "__main__": - opts = PARSER.parse_args() + analyzer = CargoAnalyzer() + opts = PARSER.parse_args(namespace=analyzer) - with (opts.src_dir / 'Cargo.toml').open('rb') as f: - crates = tomllib.load(f)['workspace']['members'] - deps = set() - for p in opts.plugins: - assert p.startswith('gst') - name = p[3:] - name = RENAMES.get(name, name) - crate_path = None - for crate in crates: - if Path(crate).name == name: - crate_path = opts.src_dir / crate / 'Cargo.toml' - assert crate_path - with crate_path.open('rb') as f: - data = tomllib.load(f) - try: - requires = data['package']['metadata']['capi']['pkg_config']['requires_private'] - except KeyError: - continue - deps.update([i.strip().replace('>', "|>").replace('<', "|<").replace("==", "|==") for i in requires.split(',')]) - print(','.join(deps)) + print(','.join(analyzer.run())) diff --git a/meson.build b/meson.build index 03c8cbbb..942d64eb 100644 --- a/meson.build +++ b/meson.build @@ -315,28 +315,6 @@ if get_option('gtk4').allowed() endif endif -if gst_dep.version().version_compare('>=1.21') - components = [ - '', '-app', '-audio', '-base', '-check', - '-rtp', '-sdp', '-utils', '-video', '-webrtc', - ] - if get_option('tracers').allowed() - components += '-plugin-tracers' - endif - if get_option('threadshare').allowed() - components += '-net' - endif - if get_option('mp4').allowed() or get_option('fmp4').allowed() - components += '-pbutils' - endif - foreach c: components - features += f'gst@c@/v1_22' - endforeach - if get_option('webrtc').allowed() - features += 'gst-plugin-webrtc/gst1_22' - endif -endif - if get_option('rav1e').allowed() and find_program('nasm', required: false).found() features += 'gst-plugin-rav1e/asm' endif @@ -359,6 +337,12 @@ foreach plugin_name, details: plugins if plugin_deps_found packages += f'gst-plugin-@plugin_name@' features += details.get('features', []) + extra_features = run_command('dependencies.py', meson.current_source_dir(), plugin_name, + '--feature', '--gst-version', gst_dep.version(), capture: true, check: true).stdout().strip() + if extra_features != '' + features += extra_features.split(',') + endif + examples += details.get('examples', []) lib = details.get('library') if default_library in ['shared', 'both']