Makefile (5619B)
1 SHELL := /bin/bash 2 .SHELLFLAGS := -eu -o pipefail -c 3 4 -include source.lock 5 -include Config/ffi-build.env 6 7 SOURCE_MODE ?= git 8 RADROOTS_FIELD_LIB_GIT_URL ?= git@github.com:radrootslabs/field_lib.git 9 RADROOTS_FIELD_LIB_GIT_REV ?= fa73939fe8fea4eaf9678d66c48729303c0cd963 10 RADROOTS_FIELD_FFI_CRATE_VERSION ?= 0.1.0-alpha.1 11 FFI_FEATURES ?= radroots_field_core/rt,radroots_field_core/nostr-client 12 LOCAL_FFI_MANIFEST ?= 13 IPHONEOS_DEPLOYMENT_TARGET ?= 18.0 14 RUSTUP_TOOLCHAIN ?= 1.92.0-aarch64-apple-darwin 15 16 IOS_ROOT := $(abspath $(CURDIR)/..) 17 APP_ROOT := $(IOS_ROOT)/Radroots 18 ARTIFACTS_DIR := $(APP_ROOT)/Frameworks 19 GENERATED_SWIFT_DIR := $(APP_ROOT)/Generated 20 21 BUILD_ROOT := $(CURDIR)/.build 22 SOURCE_ROOT := $(BUILD_ROOT)/source 23 TARGET_DIR := $(BUILD_ROOT)/target 24 OUT_DIR := $(BUILD_ROOT)/out 25 GENERATED_DIR := $(OUT_DIR)/generated 26 HEADERS_DIR := $(OUT_DIR)/headers 27 28 CRATE_NAME := radroots_field_ffi 29 FFI_OUTPUT_NAME := RadrootsFFI 30 LIB_STEM := libradroots_field_ffi 31 32 GIT_FIELD_LIB_DIR := $(SOURCE_ROOT)/field-lib 33 CRATE_ARCHIVE := $(SOURCE_ROOT)/$(CRATE_NAME)-$(RADROOTS_FIELD_FFI_CRATE_VERSION).crate 34 CRATE_EXTRACT_DIR := $(SOURCE_ROOT)/$(CRATE_NAME)-$(RADROOTS_FIELD_FFI_CRATE_VERSION) 35 CARGO_FEATURE_FLAGS := $(if $(strip $(FFI_FEATURES)),--features $(FFI_FEATURES),) 36 37 ifeq ($(SOURCE_MODE),git) 38 FFI_MANIFEST := $(GIT_FIELD_LIB_DIR)/crates/field_ffi/Cargo.toml 39 UNIFFI_CONFIG := $(GIT_FIELD_LIB_DIR)/crates/field_ffi/uniffi.toml 40 SOURCE_TARGET := sync-source-git 41 else ifeq ($(SOURCE_MODE),crates) 42 FFI_MANIFEST := $(CRATE_EXTRACT_DIR)/Cargo.toml 43 UNIFFI_CONFIG := $(CRATE_EXTRACT_DIR)/uniffi.toml 44 SOURCE_TARGET := sync-source-crates 45 else ifeq ($(SOURCE_MODE),local) 46 FFI_MANIFEST := $(LOCAL_FFI_MANIFEST) 47 UNIFFI_CONFIG := $(dir $(LOCAL_FFI_MANIFEST))uniffi.toml 48 SOURCE_TARGET := sync-source-local 49 else 50 $(error SOURCE_MODE must be one of: git, crates, local) 51 endif 52 53 FFI_CRATE_DIR := $(dir $(FFI_MANIFEST)) 54 55 RUSTC_BIN := $(shell rustup which --toolchain $(RUSTUP_TOOLCHAIN) rustc) 56 CARGO_BIN := rustup run $(RUSTUP_TOOLCHAIN) cargo 57 CARGO := IPHONEOS_DEPLOYMENT_TARGET=$(IPHONEOS_DEPLOYMENT_TARGET) RUSTC=$(RUSTC_BIN) CARGO_TARGET_DIR=$(TARGET_DIR) $(CARGO_BIN) 58 59 LIB_DEVICE := $(TARGET_DIR)/aarch64-apple-ios/release/$(LIB_STEM).a 60 LIB_SIMULATOR := $(TARGET_DIR)/aarch64-apple-ios-sim/release/$(LIB_STEM).a 61 LIB_HOST := $(TARGET_DIR)/release/$(LIB_STEM).dylib 62 63 .PHONY: all clean distclean print-config sync-source sync-source-git sync-source-crates sync-source-local ensure-toolchain build generate package install 64 65 all: sync-source build generate package install 66 @echo "done" 67 @echo " - source mode: $(SOURCE_MODE)" 68 @echo " - xcframework: $(ARTIFACTS_DIR)/$(FFI_OUTPUT_NAME).xcframework" 69 @echo " - swift bindings: $(GENERATED_SWIFT_DIR)" 70 71 print-config: 72 @echo "SOURCE_MODE=$(SOURCE_MODE)" 73 @echo "FFI_MANIFEST=$(FFI_MANIFEST)" 74 @echo "UNIFFI_CONFIG=$(UNIFFI_CONFIG)" 75 @echo "ARTIFACTS_DIR=$(ARTIFACTS_DIR)" 76 @echo "GENERATED_SWIFT_DIR=$(GENERATED_SWIFT_DIR)" 77 @echo "IPHONEOS_DEPLOYMENT_TARGET=$(IPHONEOS_DEPLOYMENT_TARGET)" 78 @echo "RUSTUP_TOOLCHAIN=$(RUSTUP_TOOLCHAIN)" 79 @echo "RUSTC_BIN=$(RUSTC_BIN)" 80 81 clean: 82 rm -rf $(TARGET_DIR) $(OUT_DIR) $(ARTIFACTS_DIR)/$(FFI_OUTPUT_NAME).xcframework 83 if [ -d $(GENERATED_SWIFT_DIR) ]; then \ 84 find $(GENERATED_SWIFT_DIR) -maxdepth 1 -type f -name '*.swift' -delete; \ 85 fi 86 87 distclean: clean 88 rm -rf $(SOURCE_ROOT) 89 90 sync-source: $(SOURCE_TARGET) 91 92 sync-source-git: 93 mkdir -p $(SOURCE_ROOT) 94 if [ ! -d $(GIT_FIELD_LIB_DIR)/.git ]; then \ 95 git clone --filter=blob:none $(RADROOTS_FIELD_LIB_GIT_URL) $(GIT_FIELD_LIB_DIR); \ 96 fi 97 git -C $(GIT_FIELD_LIB_DIR) fetch --tags --force origin 98 git -C $(GIT_FIELD_LIB_DIR) checkout --detach $(RADROOTS_FIELD_LIB_GIT_REV) 99 test -f $(FFI_MANIFEST) 100 101 sync-source-crates: 102 mkdir -p $(SOURCE_ROOT) 103 rm -rf $(CRATE_EXTRACT_DIR) 104 curl -fLsS https://crates.io/api/v1/crates/$(CRATE_NAME)/$(RADROOTS_FIELD_FFI_CRATE_VERSION)/download -o $(CRATE_ARCHIVE) 105 tar -xzf $(CRATE_ARCHIVE) -C $(SOURCE_ROOT) 106 test -f $(FFI_MANIFEST) 107 108 sync-source-local: 109 if [ -z "$(LOCAL_FFI_MANIFEST)" ]; then \ 110 echo "LOCAL_FFI_MANIFEST is required when SOURCE_MODE=local"; \ 111 exit 1; \ 112 fi 113 test -f $(LOCAL_FFI_MANIFEST) 114 test -f $(UNIFFI_CONFIG) 115 116 ensure-toolchain: 117 rustup target add --toolchain $(RUSTUP_TOOLCHAIN) aarch64-apple-ios aarch64-apple-ios-sim 118 119 build: ensure-toolchain 120 mkdir -p $(TARGET_DIR) $(OUT_DIR) 121 $(CARGO) build --manifest-path $(FFI_MANIFEST) $(CARGO_FEATURE_FLAGS) --release --target aarch64-apple-ios 122 $(CARGO) build --manifest-path $(FFI_MANIFEST) $(CARGO_FEATURE_FLAGS) --release --target aarch64-apple-ios-sim 123 $(CARGO) build --manifest-path $(FFI_MANIFEST) $(CARGO_FEATURE_FLAGS) --release 124 125 generate: 126 rm -rf $(GENERATED_DIR) $(HEADERS_DIR) 127 mkdir -p $(GENERATED_DIR) $(HEADERS_DIR) 128 cd $(FFI_CRATE_DIR) && $(CARGO) run --manifest-path Cargo.toml $(CARGO_FEATURE_FLAGS) --bin uniffi-bindgen -- \ 129 generate --library $(LIB_HOST) \ 130 --language swift \ 131 --out-dir $(GENERATED_DIR) \ 132 --config $(UNIFFI_CONFIG) 133 cp $(GENERATED_DIR)/$(FFI_OUTPUT_NAME).h $(HEADERS_DIR)/ 134 cp $(GENERATED_DIR)/$(FFI_OUTPUT_NAME).modulemap $(HEADERS_DIR)/module.modulemap 135 136 package: 137 mkdir -p $(ARTIFACTS_DIR) 138 rm -rf $(ARTIFACTS_DIR)/$(FFI_OUTPUT_NAME).xcframework 139 xcodebuild -create-xcframework \ 140 -library $(LIB_DEVICE) -headers $(HEADERS_DIR) \ 141 -library $(LIB_SIMULATOR) -headers $(HEADERS_DIR) \ 142 -output $(ARTIFACTS_DIR)/$(FFI_OUTPUT_NAME).xcframework 143 144 install: 145 mkdir -p $(GENERATED_SWIFT_DIR) 146 if [ -d $(GENERATED_SWIFT_DIR) ]; then \ 147 find $(GENERATED_SWIFT_DIR) -maxdepth 1 -type f -name '*.swift' -delete; \ 148 fi 149 cp $(GENERATED_DIR)/*.swift $(GENERATED_SWIFT_DIR)/