field_ios

In-the-field app for Radroots on iOS
git clone https://radroots.dev/git/field_ios.git
Log | Files | Refs | LICENSE

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)/