| 1 | SHELL := /bin/sh |
| 2 | |
| 3 | SWIFT_REPO := $(CURDIR) |
| 4 | DEMUCS_REPO ?= $(abspath ../demucs-rs) |
| 5 | MANIFEST := $(DEMUCS_REPO)/demucs-ffi/Cargo.toml |
| 6 | BINDGEN_MANIFEST := $(DEMUCS_REPO)/uniffi-bindgen/Cargo.toml |
| 7 | BINDGEN := $(DEMUCS_REPO)/target/release/uniffi-bindgen |
| 8 | APPLE_TARGET_DIR := $(DEMUCS_REPO)/target/apple |
| 9 | LIB_NAME := libdemucs_ffi.a |
| 10 | |
| 11 | IOS_DEPLOYMENT_TARGET ?= 16.0 |
| 12 | MACOS_DEPLOYMENT_TARGET ?= 14.0 |
| 13 | TVOS_DEPLOYMENT_TARGET ?= 16.0 |
| 14 | VISIONOS_DEPLOYMENT_TARGET ?= 1.0 |
| 15 | |
| 16 | LOCAL_DIR := $(SWIFT_REPO)/.local |
| 17 | GENERATED_DIR := $(LOCAL_DIR)/generated/Demucs |
| 18 | HEADERS_DIR := $(LOCAL_DIR)/Headers |
| 19 | FRAMEWORK_DIR := $(SWIFT_REPO)/DemucsFramework.xcframework |
| 20 | SWIFT_GLUE := $(SWIFT_REPO)/Sources/Demucs/demucs_ffi.swift |
| 21 | |
| 22 | # demucs-rs's .cargo/config.toml builds macOS with `-C target-cpu=native`; |
| 23 | # clear it so a local framework behaves like the released one. |
| 24 | export CARGO_TARGET_AARCH64_APPLE_DARWIN_RUSTFLAGS := |
| 25 | |
| 26 | # $(call rustc,<target>,<deployment env>,<extra cargo args>) |
| 27 | rustc = $(2) cargo $(3) rustc --target-dir "$(APPLE_TARGET_DIR)" --manifest-path "$(MANIFEST)" --target $(1) --release --lib --crate-type staticlib |
| 28 | lib = $(APPLE_TARGET_DIR)/$(1)/release/$(LIB_NAME) |
| 29 | |
| 30 | .PHONY: help validate ios macos tvos visionos build-bindgen prepare generate-swift clean |
| 31 | |
| 32 | help: |
| 33 | @printf '%s\n' \ |
| 34 | 'Demucs Swift local builds' \ |
| 35 | '' \ |
| 36 | 'make ios | macos | tvos | visionos' \ |
| 37 | 'Set DEMUCS_REPO=/path/to/demucs-rs when the repositories are not siblings.' |
| 38 | |
| 39 | validate: |
| 40 | @test -f "$(MANIFEST)" || { echo "Could not find demucs-rs at $(DEMUCS_REPO)"; exit 1; } |
| 41 | |
| 42 | build-bindgen: validate |
| 43 | cargo build --manifest-path "$(BINDGEN_MANIFEST)" --release |
| 44 | |
| 45 | prepare: |
| 46 | @rm -rf "$(FRAMEWORK_DIR)" "$(GENERATED_DIR)" "$(HEADERS_DIR)" |
| 47 | @mkdir -p "$(GENERATED_DIR)" "$(HEADERS_DIR)" |
| 48 | |
| 49 | generate-swift: |
| 50 | @test -n "$(BINDGEN_INPUT)" || { echo "BINDGEN_INPUT is required"; exit 1; } |
| 51 | cd "$(DEMUCS_REPO)" && "$(BINDGEN)" generate "$(BINDGEN_INPUT)" --crate demucs_ffi --language swift --out-dir "$(GENERATED_DIR)" |
| 52 | cp "$(GENERATED_DIR)/demucs_ffi.swift" "$(SWIFT_GLUE)" |
| 53 | cp "$(GENERATED_DIR)/demucs_ffiFFI.h" "$(HEADERS_DIR)/demucs_ffiFFI.h" |
| 54 | cp "$(GENERATED_DIR)/demucs_ffiFFI.modulemap" "$(HEADERS_DIR)/module.modulemap" |
| 55 | |
| 56 | ios: build-bindgen prepare |
| 57 | $(call rustc,aarch64-apple-ios,IPHONEOS_DEPLOYMENT_TARGET=$(IOS_DEPLOYMENT_TARGET)) |
| 58 | $(call rustc,aarch64-apple-ios-sim,IPHONEOS_DEPLOYMENT_TARGET=$(IOS_DEPLOYMENT_TARGET)) |
| 59 | $(MAKE) generate-swift BINDGEN_INPUT="$(call lib,aarch64-apple-ios)" |
| 60 | xcodebuild -create-xcframework \ |
| 61 | -library "$(call lib,aarch64-apple-ios)" -headers "$(HEADERS_DIR)" \ |
| 62 | -library "$(call lib,aarch64-apple-ios-sim)" -headers "$(HEADERS_DIR)" \ |
| 63 | -output "$(FRAMEWORK_DIR)" |
| 64 | |
| 65 | macos: build-bindgen prepare |
| 66 | $(call rustc,aarch64-apple-darwin,MACOSX_DEPLOYMENT_TARGET=$(MACOS_DEPLOYMENT_TARGET)) |
| 67 | $(MAKE) generate-swift BINDGEN_INPUT="$(call lib,aarch64-apple-darwin)" |
| 68 | xcodebuild -create-xcframework \ |
| 69 | -library "$(call lib,aarch64-apple-darwin)" -headers "$(HEADERS_DIR)" \ |
| 70 | -output "$(FRAMEWORK_DIR)" |
| 71 | |
| 72 | # tvOS and visionOS are tier 3 targets: no prebuilt std, so nightly + build-std. |
| 73 | tvos: build-bindgen prepare |
| 74 | $(call rustc,aarch64-apple-tvos,TVOS_DEPLOYMENT_TARGET=$(TVOS_DEPLOYMENT_TARGET),+nightly -Z build-std) |
| 75 | $(call rustc,aarch64-apple-tvos-sim,TVOS_DEPLOYMENT_TARGET=$(TVOS_DEPLOYMENT_TARGET),+nightly -Z build-std) |
| 76 | $(MAKE) generate-swift BINDGEN_INPUT="$(call lib,aarch64-apple-tvos)" |
| 77 | xcodebuild -create-xcframework \ |
| 78 | -library "$(call lib,aarch64-apple-tvos)" -headers "$(HEADERS_DIR)" \ |
| 79 | -library "$(call lib,aarch64-apple-tvos-sim)" -headers "$(HEADERS_DIR)" \ |
| 80 | -output "$(FRAMEWORK_DIR)" |
| 81 | |
| 82 | visionos: build-bindgen prepare |
| 83 | $(call rustc,aarch64-apple-visionos,XROS_DEPLOYMENT_TARGET=$(VISIONOS_DEPLOYMENT_TARGET),+nightly -Z build-std) |
| 84 | $(call rustc,aarch64-apple-visionos-sim,XROS_DEPLOYMENT_TARGET=$(VISIONOS_DEPLOYMENT_TARGET),+nightly -Z build-std) |
| 85 | $(MAKE) generate-swift BINDGEN_INPUT="$(call lib,aarch64-apple-visionos)" |
| 86 | xcodebuild -create-xcframework \ |
| 87 | -library "$(call lib,aarch64-apple-visionos)" -headers "$(HEADERS_DIR)" \ |
| 88 | -library "$(call lib,aarch64-apple-visionos-sim)" -headers "$(HEADERS_DIR)" \ |
| 89 | -output "$(FRAMEWORK_DIR)" |
| 90 | |
| 91 | clean: |
| 92 | rm -rf "$(FRAMEWORK_DIR)" "$(LOCAL_DIR)" |