main
text 92 lines 4.1 KB
Raw
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)"