Skip to content

Commit

Permalink
build: Universal macOS Library (#625)
Browse files Browse the repository at this point in the history
* cross-compiling on M1 mac

* disable NEON on Intel mac

* add CMAKE_SYSTEM_ARCHITECTURES
  • Loading branch information
homuler committed Jun 27, 2022
1 parent 6dd9720 commit 70a488e
Show file tree
Hide file tree
Showing 6 changed files with 143 additions and 20 deletions.
37 changes: 22 additions & 15 deletions WORKSPACE
Original file line number Diff line number Diff line change
Expand Up @@ -245,6 +245,12 @@ http_archive(
http_archive(
name = "opencv",
build_file = "@//third_party:opencv.BUILD",
patch_args = [
"-p1",
],
patches = [
"@//third_party:opencv_disable_neon.diff",
],
sha256 = "5e37b791b2fe42ed39b52d9955920b951ee42d5da95f79fbc9765a08ef733399",
strip_prefix = "opencv-3.4.16",
urls = ["https://github.com/opencv/opencv/archive/3.4.16.tar.gz"],
Expand Down Expand Up @@ -334,6 +340,22 @@ load("@local_config_android//:android_configure.bzl", "android_workspace")
android_workspace()

# iOS basic build deps.
http_archive(
name = "build_bazel_apple_support",
patch_args = [
"-p1",
],
patches = [
"@//third_party:build_bazel_apple_support_transitions.diff",
],
sha256 = "df317473b5894dd8eb432240d209271ebc83c76bb30c55481374b36ddf1e4fd1",
url = "https://github.com/bazelbuild/apple_support/releases/download/1.0.0/apple_support.1.0.0.tar.gz",
)

load(
"@build_bazel_apple_support//lib:repositories.bzl",
"apple_support_dependencies",
)

http_archive(
name = "build_bazel_rules_apple",
Expand Down Expand Up @@ -363,21 +385,6 @@ load(

swift_rules_dependencies()

http_archive(
name = "build_bazel_apple_support",
sha256 = "741366f79d900c11e11d8efd6cc6c66a31bfb2451178b58e0b5edc6f1db17b35",
urls = [
"https://github.com/bazelbuild/apple_support/releases/download/0.10.0/apple_support.0.10.0.tar.gz",
],
)

load(
"@build_bazel_apple_support//lib:repositories.bzl",
"apple_support_dependencies",
)

apple_support_dependencies()

# More iOS deps.

http_archive(
Expand Down
10 changes: 10 additions & 0 deletions build.py
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,9 @@ def _unzip(self, source, dest):
def _is_windows(self):
return self.system == 'Windows'

def _is_macos(self):
return self.system == 'Darwin'


class BuildCommand(Command):
def __init__(self, command_args):
Expand Down Expand Up @@ -256,6 +259,12 @@ def _build_desktop_options(self):
else:
commands += ['--define', 'MEDIAPIPE_DISABLE_GPU=1']

if self.command_args.macos_universal:
if self._is_macos():
commands += ['--//mediapipe_api:macos_universal']
else:
self.console.warn("Ignoring the `--macos_universal` option.")

commands += self._build_opencv_switch()

return commands
Expand Down Expand Up @@ -426,6 +435,7 @@ def __init__(self):
choices=['face_detection', 'face_mesh', 'iris', 'hands', 'pose', 'holistic', 'selfie_segmentation', 'hair_segmentation', 'object_detection', 'box_tracking', 'instant_motion_tracking', 'objectron'])
build_command_parser.add_argument('--linkopt', '-l', action='append', help='Linker options')
build_command_parser.add_argument('--apple_bitcode', action=argparse.BooleanOptionalAction, default=True, help='Embed bitcode to iOS Framework')
build_command_parser.add_argument('--macos_universal', action=argparse.BooleanOptionalAction, default=False, help='Build a universal library')
build_command_parser.add_argument('--bazel_startup_opts', action='append', help='Bazel startup options')
build_command_parser.add_argument('--bazel_build_opts', action='append', help='Bazel startup options')
build_command_parser.add_argument('--verbose', '-v', action='count', default=0)
Expand Down
37 changes: 34 additions & 3 deletions mediapipe_api/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,21 @@

load("//mediapipe_api:import_model.bzl", "pkg_asset")
load("@bazel_skylib//lib:selects.bzl", "selects")
load("@bazel_skylib//rules:common_settings.bzl", "string_list_flag")
load("@bazel_skylib//rules:common_settings.bzl", "bool_flag", "string_list_flag")
load("@rules_pkg//:pkg.bzl", "pkg_zip")
load("@build_bazel_apple_support//rules:universal_binary.bzl", "universal_binary")

bool_flag(
name = "macos_universal",
build_setting_default = False,
)

config_setting(
name = "build_universal_library",
flag_values = {
":macos_universal": "True"
},
)

string_list_flag(
name = "solutions",
Expand Down Expand Up @@ -213,13 +226,31 @@ cc_binary(
)

cc_binary(
name = "libmediapipe_c.dylib",
name = "libmediapipe_c_.dylib",
linkshared = True,
linkstatic = True,
visibility = ["//visibility:public"],
deps = [":mediapipe_c"],
)

universal_binary(
name = "libmediapipe_c_universal.dylib",
binary = ":libmediapipe_c_.dylib",
)

genrule(
name = "libmediapipe_c_dylib",
srcs = select({
":build_universal_library": [":libmediapipe_c_universal.dylib"],
"//conditions:default": [":libmediapipe_c_.dylib"],
}),
outs = ["libmediapipe_c.dylib"],
cmd = select({
":build_universal_library": "cp $< $(@D)/libmediapipe_c.dylib",
"//conditions:default": "cp $< $(@D)/libmediapipe_c.dylib",
}),
)

cc_binary(
name = "mediapipe_c.dll",
linkshared = True,
Expand All @@ -245,7 +276,7 @@ cc_binary(
alias(
name = "libmediapipe_c",
actual = select({
"@com_google_mediapipe//mediapipe:macos": ":libmediapipe_c.dylib",
"@com_google_mediapipe//mediapipe:macos": ":libmediapipe_c_dylib",
"@com_google_mediapipe//mediapipe:windows": ":mediapipe_c.dll",
"@com_google_mediapipe//mediapipe:emscripten": ":libmediapipe_c.bc",
"//conditions:default": ":libmediapipe_c.so",
Expand Down
13 changes: 13 additions & 0 deletions third_party/build_bazel_apple_support_transitions.diff
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
diff --git a/lib/transitions.bzl b/lib/transitions.bzl
index f07e628..1e48a26 100644
--- a/lib/transitions.bzl
+++ b/lib/transitions.bzl
@@ -18,7 +18,7 @@ def _macos_universal_transition_impl(settings, _attr):
# Create a split transition from any macOS cpu to a list of all macOS cpus
if settings["//command_line_option:cpu"].startswith("darwin"):
return [
- {"//command_line_option:cpu": "darwin_x86_64"},
+ {"//command_line_option:cpu": "darwin"},
{"//command_line_option:cpu": "darwin_arm64"},
]
else:
53 changes: 51 additions & 2 deletions third_party/opencv.BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,17 @@ selects.config_setting_group(
match_all = ["@bazel_tools//src/conditions:windows", ":local_build"],
)

config_setting(
name = "enable_neon",
constraint_values = [
"@platforms//os:macos",
"@platforms//cpu:arm64",
],
values = {
"cpu": "darwin_arm64",
},
)

alias(
name = "opencv",
actual = select({
Expand Down Expand Up @@ -126,6 +137,7 @@ OPENCV_3RDPARTY_LIBS = [
"zlib",
]

# ENABLE_NEON=ON
OPENCV_3RDPARTY_LIBS_M1 = OPENCV_3RDPARTY_LIBS + ["tegra_hal"]

define_string_dict(
Expand Down Expand Up @@ -191,7 +203,7 @@ define_string_dict(
)

define_string_dict(
name = "*nix_cache_entries",
name = "*nix_build_entries",
value = {
# https://github.com/opencv/opencv/issues/19846
"WITH_LAPACK": "OFF",
Expand All @@ -200,6 +212,43 @@ define_string_dict(
},
)

define_string_dict(
name = "darwin_arch_entries",
value = select({
"@cpuinfo//:macos_arm64": {
"CMAKE_SYSTEM_ARCHITECTURES": "arm64",
"CMAKE_OSX_ARCHITECTURES": "arm64",
},
"//conditions:default": {
"CMAKE_SYSTEM_ARCHITECTURES": "x86_64",
"CMAKE_OSX_ARCHITECTURES": "x86_64",
},
})
)

define_string_dict(
name = "neon_entries",
value = select({
":enable_neon": {
"ENABLE_NEON": "ON",
},
"//conditions:default": {
"ENABLE_NEON": "OFF",
},
}),
)

merge_dict(
name = "*nix_cache_entries",
deps = [
":*nix_build_entries",
":neon_entries",
] + select({
"@bazel_tools//src/conditions:darwin": [":darwin_arch_entries"],
"//conditions:default": [],
}),
)

merge_dict(
name = "cache_entries",
deps = [
Expand Down Expand Up @@ -244,7 +293,7 @@ cmake(
":cmake_dynamic": [],
":dbg_cmake_static_win": ["staticlib/%sd.lib" % lib for lib in OPENCV_3RDPARTY_LIBS],
"@bazel_tools//src/conditions:windows": ["staticlib/%s.lib" % lib for lib in OPENCV_3RDPARTY_LIBS],
"@bazel_tools//src/conditions:darwin_arm64": ["share/OpenCV/3rdparty/lib/lib%s.a" % lib for lib in OPENCV_3RDPARTY_LIBS_M1],
":enable_neon": ["share/OpenCV/3rdparty/lib/lib%s.a" % lib for lib in OPENCV_3RDPARTY_LIBS_M1],
"//conditions:default": ["share/OpenCV/3rdparty/lib/lib%s.a" % lib for lib in OPENCV_3RDPARTY_LIBS],
}) + select({
":cmake_static": [],
Expand Down
13 changes: 13 additions & 0 deletions third_party/opencv_disable_neon.diff
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
diff --git a/3rdparty/libpng/CMakeLists.txt b/3rdparty/libpng/CMakeLists.txt
index efa59627eb..b1c18805ff 100644
--- a/3rdparty/libpng/CMakeLists.txt
+++ b/3rdparty/libpng/CMakeLists.txt
@@ -38,6 +38,8 @@ if(ARM OR AARCH64)
else()
add_definitions(-DPNG_ARM_NEON_OPT=0) # NEON assembler is not supported
endif()
+else()
+ add_definitions(-DPNG_ARM_NEON_OPT=0) # NEON assembler is not supported
endif()

if(";${CPU_BASELINE_FINAL};" MATCHES "SSE2"

0 comments on commit 70a488e

Please sign in to comment.