From c08c4d323f53d12e0712124f64ddec88a57917d3 Mon Sep 17 00:00:00 2001 From: toorux Date: Sat, 10 Oct 2026 19:09:06 +0800 Subject: [PATCH] Respect Cargo target directory when packaging capture binaries --- tests/test_media_build_output.py | 54 ++++++++++++++++++++++++++++++++ tools/build-media.sh | 3 +- 2 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 tests/test_media_build_output.py diff --git a/tests/test_media_build_output.py b/tests/test_media_build_output.py new file mode 100644 index 0000000..7f56552 --- /dev/null +++ b/tests/test_media_build_output.py @@ -0,0 +1,54 @@ +"""Keep media packaging aligned with Cargo's default and overridden output paths.""" +import os +from pathlib import Path +import shutil +import subprocess +import tempfile +import unittest + +ROOT = Path(__file__).resolve().parents[1] + + +class MediaBuildOutput(unittest.TestCase): + def test_copies_compiled_binaries_from_cargo_target_directory(self): + cargo = shutil.which('cargo') + self.assertIsNotNone(cargo) + for setting in (None, 'target/cargo', 'absolute'): + with self.subTest(target=setting), tempfile.TemporaryDirectory() as directory: + root = Path(directory) + (root / 'tools').mkdir() + source = (ROOT / 'tools/build-media.sh').read_text() + # Native dependencies are separate from the Cargo output-copy boundary. + (root / 'tools/build-media.sh').write_text(source.split('# Native dependencies')[0]) + crate = root / 'media/capture' + (crate / 'src').mkdir(parents=True) + (crate / 'Cargo.toml').write_text('[package]\nname="capture-fixture"\nversion="0.1.0"\nedition="2021"\n') + (crate / 'src/main.rs').write_text('fn main() {}\n') + env = dict(os.environ) + env.pop('CARGO_TARGET_DIR', None) + env.pop('FRAMELY_SYSROOT', None) + if setting: + env['CARGO_TARGET_DIR'] = str(root / 'absolute-output') if setting == 'absolute' else setting + subprocess.run([cargo, 'generate-lockfile', '--manifest-path', str(crate / 'Cargo.toml')], env=env, check=True) + mock_bin = root / 'mock-bin' + mock_bin.mkdir() + wrapper = mock_bin / 'cargo' + wrapper.write_text('''#!/usr/bin/env python3 +import json,os,pathlib,subprocess,sys +real=os.environ['TEST_REAL_CARGO'] +if sys.argv[1]=='build': + result=subprocess.check_output([real,'metadata','--locked','--no-deps','--format-version','1','--manifest-path','media/capture/Cargo.toml']) + output=pathlib.Path(json.loads(result)['target_directory'])/'release' + output.mkdir(parents=True,exist_ok=True) + for name in ['framely-capture','framely-panel-grab']:(output/name).write_text('compiled '+name) +else:os.execv(real,[real,*sys.argv[1:]]) +''') + wrapper.chmod(0o755) + env.update(TEST_REAL_CARGO=cargo, PATH=str(mock_bin) + os.pathsep + env['PATH']) + subprocess.run(['bash', str(root / 'tools/build-media.sh')], cwd=root, env=env, check=True) + for name in ('framely-capture', 'framely-panel-grab'): + self.assertEqual((root / 'media/bin' / name).read_text(), 'compiled ' + name) + + +if __name__ == '__main__': + unittest.main() diff --git a/tools/build-media.sh b/tools/build-media.sh index 828a711..7f5bd0e 100755 --- a/tools/build-media.sh +++ b/tools/build-media.sh @@ -16,7 +16,8 @@ fi cargo build --release --locked --manifest-path media/capture/Cargo.toml ) mkdir -p media/bin -cp media/capture/target/release/framely-capture media/capture/target/release/framely-panel-grab media/bin/ +capture_target=$(cargo metadata --locked --no-deps --format-version 1 --manifest-path media/capture/Cargo.toml | python3 -c 'import json,sys; print(json.load(sys.stdin)["target_directory"])') +cp "$capture_target/release/framely-capture" "$capture_target/release/framely-panel-grab" media/bin/ # Native dependencies use the target system's GStreamer and GUPnP libraries. python3 tools/fetch-media.py bash tools/build-gst-libav.sh