diff --git a/SConstruct b/SConstruct index 59d863a75..3dd8c9337 100644 --- a/SConstruct +++ b/SConstruct @@ -146,6 +146,17 @@ capnproto_lib_dirs = [capnproto.LIB_DIR] if capnproto is not None else [] ffmpeg_include_dirs = [ffmpeg.INCLUDE_DIR] if ffmpeg is not None else [] ffmpeg_lib_dirs = [ffmpeg.LIB_DIR] if ffmpeg is not None else [] +# The managed native-dependency packages keep their tools inside the package +# instead of installing them into /usr/local/venv/bin. cereal invokes capnpc +# directly while SConscript files are evaluated, so make the packaged tools +# discoverable to both SCons actions and configure-time subprocesses. +dependency_bin_dirs = [ + package.BIN_DIR for package in (capnproto, ffmpeg) + if package is not None and os.path.isdir(package.BIN_DIR) +] +if dependency_bin_dirs: + os.environ["PATH"] = os.pathsep.join([*dependency_bin_dirs, os.environ["PATH"]]) + # Homebrew llvm can shadow Apple clang and break macOS SDK header resolution. # Use the system toolchain explicitly on macOS for reliable local builds. cc = '/usr/bin/clang' if arch == "Darwin" else 'clang' diff --git a/system/loggerd/bootlog b/system/loggerd/bootlog index d8bdeb8be..2ace8ac15 100755 Binary files a/system/loggerd/bootlog and b/system/loggerd/bootlog differ diff --git a/system/loggerd/loggerd b/system/loggerd/loggerd index 915c4e9ff..b42dcc378 100755 Binary files a/system/loggerd/loggerd and b/system/loggerd/loggerd differ diff --git a/system/loggerd/tests/test_uploader.py b/system/loggerd/tests/test_uploader.py index 2e13d357a..aa3b13dc3 100644 --- a/system/loggerd/tests/test_uploader.py +++ b/system/loggerd/tests/test_uploader.py @@ -7,7 +7,7 @@ from pathlib import Path from openpilot.system.hardware.hw import Paths from openpilot.common.swaglog import cloudlog -from openpilot.system.loggerd.uploader import main, UPLOAD_ATTR_NAME, UPLOAD_ATTR_VALUE +from openpilot.system.loggerd.uploader import clear_locks, main, UPLOAD_ATTR_NAME, UPLOAD_ATTR_VALUE from openpilot.system.loggerd.xattr_cache import getxattr from openpilot.system.loggerd.tests.loggerd_tests_common import UploaderTestCase @@ -36,6 +36,10 @@ log_handler = FakeLogHandler() cloudlog.addHandler(log_handler) +def test_clear_locks_missing_root(tmp_path): + clear_locks(str(tmp_path / "missing")) + + class TestUploader(UploaderTestCase): def setup_method(self): super().setup_method() diff --git a/system/loggerd/uploader.py b/system/loggerd/uploader.py index 827dc8128..06ed867a9 100755 --- a/system/loggerd/uploader.py +++ b/system/loggerd/uploader.py @@ -63,6 +63,9 @@ def listdir_by_creation(d: str) -> list[str]: return [] def clear_locks(root: str) -> None: + if not os.path.isdir(root): + return + for logdir in os.listdir(root): path = os.path.join(root, logdir) try: