Skip to content

Commit 98c607a

Browse files
committed
Merge branch 'develop' into dev_update_detection_parser
2 parents eea5e80 + 3f4e146 commit 98c607a

File tree

7 files changed

+352
-95
lines changed

7 files changed

+352
-95
lines changed

.github/workflows/python-main.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -300,7 +300,7 @@ jobs:
300300
strategy:
301301
matrix:
302302
python-version: [3.9, '3.10', '3.11', '3.12', '3.13', '3.14']
303-
os: [macos-13, macos-14]
303+
os: [macos-15-intel, macos-14]
304304
fail-fast: false
305305
runs-on: ${{ matrix.os }}
306306
env:
@@ -371,7 +371,7 @@ jobs:
371371
needs: build-macos
372372
strategy:
373373
matrix:
374-
os: [macos-13, macos-14]
374+
os: [macos-15-intel, macos-14]
375375
fail-fast: false
376376
runs-on: ${{ matrix.os }}
377377
steps:

bindings/python/ci/combine_wheels.py

Lines changed: 51 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
import tempfile
1010
import subprocess
1111
import sys
12+
import re
13+
import random
1214

1315
from collections import defaultdict
1416

@@ -25,6 +27,45 @@ class WheelInfo:
2527
abi_tag: str
2628
platform_tag: str
2729

30+
def _python_tag_sort_key(tag: str):
31+
key_parts = []
32+
for component in tag.split("."):
33+
match = re.match(r"([a-zA-Z]+)(\d+)$", component)
34+
if match:
35+
prefix, numeric = match.groups()
36+
key_parts.append((prefix, int(numeric)))
37+
else:
38+
key_parts.append((component, 0))
39+
return tuple(key_parts)
40+
41+
def _run_self_test():
42+
logger.info("Running combine_wheels self-test")
43+
simple_tags = ["cp39", "cp310", "cp311", "cp38"]
44+
expected_simple = ["cp38", "cp39", "cp310", "cp311"]
45+
actual_simple = sorted(simple_tags, key=_python_tag_sort_key)
46+
assert actual_simple == expected_simple, f"Simple ordering failed: {actual_simple}"
47+
48+
composite_tags = ["cp39.cp310", "cp39.cp312", "cp38.cp310", "cp310.cp311", "cp39.cp311"]
49+
expected_composite = ["cp38.cp310", "cp39.cp310", "cp39.cp311", "cp39.cp312", "cp310.cp311"]
50+
actual_composite = sorted(composite_tags, key=_python_tag_sort_key)
51+
assert actual_composite == expected_composite, f"Composite ordering failed: {actual_composite}"
52+
53+
wheels = [
54+
WheelInfo(
55+
wheel_name=f"depthai-foo-{tag}-abi-{idx}",
56+
wheel_path=f"/tmp/{tag}-{idx}.whl",
57+
wheel_dvb="depthai-foo",
58+
python_tag=tag,
59+
abi_tag=f"abi{idx}",
60+
platform_tag="plat",
61+
)
62+
for idx, tag in enumerate(composite_tags)
63+
]
64+
random.shuffle(wheels)
65+
wheels.sort(key=lambda info: _python_tag_sort_key(info.python_tag))
66+
assert [w.python_tag for w in wheels] == expected_composite, "WheelInfo sorting failed"
67+
logger.info("Self-test passed")
68+
2869
def combine_wheels_linux(args, wheel_infos):
2970

3071
logger.info("Combining wheels for Linux!")
@@ -295,6 +336,11 @@ def main(args: argparse.Namespace):
295336
format=FORMAT,
296337
datefmt=DATEFMT
297338
)
339+
if args.self_test:
340+
_run_self_test()
341+
return
342+
if not args.input_folder:
343+
raise ValueError("--input_folder is required unless --self-test is specified")
298344
## Get a list of all wheels in the input folder
299345
wheels = glob.glob(os.path.join(args.input_folder, "*.whl"))
300346

@@ -315,7 +361,8 @@ def main(args: argparse.Namespace):
315361
abi_tag=abi_tag,
316362
platform_tag=platform_tag
317363
))
318-
364+
wheel_infos.sort(key=lambda info: _python_tag_sort_key(info.python_tag))
365+
319366
if sys.platform == "linux":
320367
combine_wheels_linux(args, wheel_infos)
321368
elif sys.platform == "win32":
@@ -329,9 +376,10 @@ def main(args: argparse.Namespace):
329376

330377
if __name__ == "__main__":
331378
parser = argparse.ArgumentParser()
332-
parser.add_argument("--input_folder", type=str, required=True, help="Path to the folder containing already repaired wheels for individual python versions that are to be combined into a single wheel")
379+
parser.add_argument("--input_folder", type=str, help="Path to the folder containing already repaired wheels for individual python versions that are to be combined into a single wheel")
333380
parser.add_argument("--output_folder", type=str, default=".", help="Path to the folder where the combined wheel will be saved")
334381
parser.add_argument("--strip_unneeded", action="store_true", help="Strip the libraries to reduce size")
335382
parser.add_argument("--log_level", type=str, default="INFO", help="Log level")
383+
parser.add_argument("--self-test", action="store_true", help="Run internal tests and exit")
336384
args = parser.parse_args()
337-
main(args)
385+
main(args)

bindings/python/setup.py

Lines changed: 38 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -63,9 +63,31 @@
6363
long_description = open("README.md", "r", encoding="utf-8").read()
6464

6565
## Early settings
66-
MACOS_ARM64_WHEEL_NAME_OVERRIDE = 'macosx-11.0-arm64'
67-
if sys.platform == 'darwin' and platform.machine() == 'arm64':
68-
os.environ['_PYTHON_HOST_PLATFORM'] = MACOS_ARM64_WHEEL_NAME_OVERRIDE
66+
MACOSX_DEPLOYMENT_TARGETS = {
67+
"arm64": "11.0",
68+
"x86_64": "11.0",
69+
}
70+
MACOS_SETTINGS = {}
71+
72+
def _configure_macos_build_settings():
73+
arch = platform.machine().lower()
74+
arch = "arm64" if arch == "arm64" else "x86_64"
75+
default_target = MACOSX_DEPLOYMENT_TARGETS[arch]
76+
deployment_target = os.environ.get("MACOSX_DEPLOYMENT_TARGET", default_target)
77+
os.environ["MACOSX_DEPLOYMENT_TARGET"] = deployment_target
78+
79+
wheel_tag = f"macosx-{deployment_target}-{arch}"
80+
os.environ["_PYTHON_HOST_PLATFORM"] = wheel_tag
81+
os.environ.setdefault("ARCHFLAGS", f"-arch {arch}")
82+
os.environ.setdefault("CMAKE_OSX_ARCHITECTURES", arch)
83+
return {
84+
"arch": arch,
85+
"deployment_target": deployment_target,
86+
"wheel_tag": wheel_tag,
87+
}
88+
89+
if sys.platform == "darwin":
90+
MACOS_SETTINGS = _configure_macos_build_settings()
6991

7092
class CMakeExtension(Extension):
7193
def __init__(self, name, sourcedir=''):
@@ -206,12 +228,19 @@ def build_extension(self, ext):
206228
else:
207229
# if macos add some additional env vars
208230
if sys.platform == 'darwin':
209-
from distutils import util
210-
if platform.machine() == 'arm64':
211-
# Build ARM64 wheels explicitly instead of universal2
212-
env['_PYTHON_HOST_PLATFORM'] = MACOS_ARM64_WHEEL_NAME_OVERRIDE
213-
else:
214-
env['_PYTHON_HOST_PLATFORM'] = re.sub(r'macosx-[0-9]+\.[0-9]+-(.+)', r'macosx-10.9-\1', util.get_platform())
231+
mac_arch = MACOS_SETTINGS.get('arch', platform.machine())
232+
deployment_target = MACOS_SETTINGS.get('deployment_target')
233+
wheel_tag = MACOS_SETTINGS.get('wheel_tag')
234+
if wheel_tag:
235+
env['_PYTHON_HOST_PLATFORM'] = wheel_tag
236+
if deployment_target:
237+
env['MACOSX_DEPLOYMENT_TARGET'] = deployment_target
238+
env.setdefault('ARCHFLAGS', os.environ.get('ARCHFLAGS', f'-arch {mac_arch}'))
239+
cmake_arch = os.environ.get('CMAKE_OSX_ARCHITECTURES', mac_arch)
240+
if not any(arg.startswith('-DCMAKE_OSX_ARCHITECTURES=') for arg in cmake_args):
241+
cmake_args += [f'-DCMAKE_OSX_ARCHITECTURES={cmake_arch}']
242+
if deployment_target and not any(arg.startswith('-DCMAKE_OSX_DEPLOYMENT_TARGET=') for arg in cmake_args):
243+
cmake_args += [f'-DCMAKE_OSX_DEPLOYMENT_TARGET={deployment_target}']
215244

216245
# Specify how many threads to use when building, depending on available memory
217246
max_threads = os.cpu_count()

tests/CMakeLists.txt

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -227,6 +227,12 @@ private_data(
227227
FILE "construction_vest.mp4"
228228
LOCATION construction_vest
229229
)
230+
private_data(
231+
URL "https://artifacts.luxonis.com/artifactory//luxonis-depthai-data-local/misc/dynamic_calibration_test_data.tar"
232+
SHA1 "520d97199757f6fa0497c4037dcca5a43c7be3de"
233+
FILE "dynamic_calibration_test_data.tar"
234+
LOCATION dynamic_calibration_test_data
235+
)
230236

231237
private_data(
232238
URL "https://artifacts.luxonis.com/artifactory/luxonis-depthai-data-local/misc/parser_testing/ground_truth_files/detection_parser/yolov6-nano_r2-coco-512x288_a26d1ee-detections.json"
@@ -431,6 +437,10 @@ dai_set_test_labels(openvino_blob_test ondevice rvc2_all ci)
431437
# Dynamic calibration tests
432438
dai_add_test(dynamic_calibration_test src/ondevice_tests/dynamic_calibration_test.cpp)
433439
dai_set_test_labels(dynamic_calibration_test ondevice rvc2_all ci)
440+
target_compile_definitions(dynamic_calibration_test PRIVATE RECORDING_PATH="${dynamic_calibration_test_data}")
441+
442+
dai_add_test(dynamic_calibration_onhost_test src/onhost_tests/dynamic_calibration_test.cpp)
443+
dai_set_test_labels(dynamic_calibration_onhost_test onhost)
434444

435445
# Neural network test
436446
dai_add_test(neural_network_test src/ondevice_tests/neural_network_test.cpp)
@@ -615,7 +625,7 @@ dai_set_test_labels(camera_test ondevice rvc2_all rvc4 ci)
615625

616626
# VideoEncoder test
617627
dai_add_test(video_encoder_test src/ondevice_tests/video_encoder_test.cpp)
618-
dai_set_test_labels(video_encoder_test ondevice rvc2_all rvc4 rvc4rgb ci)
628+
dai_set_test_labels(video_encoder_test ondevice rvc2 usb rvc4 rvc4rgb ci)
619629
target_compile_definitions(video_encoder_test PRIVATE VIDEO_PATH="${construction_vest}")
620630

621631
# XLinkIn test

0 commit comments

Comments
 (0)