From 6b52b32e203330f95270421daf78ff1e08cf86e1 Mon Sep 17 00:00:00 2001 From: TZGyn Date: Sat, 19 Sep 2026 13:43:08 +0800 Subject: [PATCH] Document how the Monero iOS library is built --- apps/ios/Monero/toolchain/README.md | 120 ++++++++ apps/ios/Monero/toolchain/depends/funcs.mk | 270 ++++++++++++++++++ .../ios/Monero/toolchain/depends/hosts/ios.mk | 41 +++ .../toolchain/depends/packages/boost.mk | 46 +++ .../toolchain/depends/packages/packages.mk | 43 +++ .../toolchain/depends/packages/sodium.mk | 32 +++ .../toolchain/depends/packages/unbound.mk | 36 +++ .../toolchain/depends/packages/zeromq.mk | 37 +++ 8 files changed, 625 insertions(+) create mode 100644 apps/ios/Monero/toolchain/README.md create mode 100644 apps/ios/Monero/toolchain/depends/funcs.mk create mode 100644 apps/ios/Monero/toolchain/depends/hosts/ios.mk create mode 100644 apps/ios/Monero/toolchain/depends/packages/boost.mk create mode 100644 apps/ios/Monero/toolchain/depends/packages/packages.mk create mode 100644 apps/ios/Monero/toolchain/depends/packages/sodium.mk create mode 100644 apps/ios/Monero/toolchain/depends/packages/unbound.mk create mode 100644 apps/ios/Monero/toolchain/depends/packages/zeromq.mk diff --git a/apps/ios/Monero/toolchain/README.md b/apps/ios/Monero/toolchain/README.md new file mode 100644 index 0000000..2a9ca60 --- /dev/null +++ b/apps/ios/Monero/toolchain/README.md @@ -0,0 +1,120 @@ +# Monero native library for iOS + +The wallet runs monero-project `wallet2` (plus monero-cpp as the C++ API) on +device. Everything is compiled into a single static archive that the app links. + +## Artifacts + +| File | Architecture | Platform | +|---|---|---| +| `libs/libkoins_monero_merged.a` | arm64 | iOS simulator | +| `libs/libkoins_monero_device.a` | arm64 | iOS device | + +Both are needed: they are the same CPU architecture but different platforms, so +they cannot be merged into one fat archive. `project.yml` selects the right one +per SDK. + +## Prerequisites + +- Xcode with the iOS device and simulator SDKs +- CMake 3.2x (monero 0.18 is not tested with CMake 4) +- GNU make (the builds use the "Unix Makefiles" generator) +- Roughly 10 GB of disk and a long coffee break + +## Sources + +- monero-project v0.18.5.1 +- monero-cpp (woodser), which keeps monero-project at `external/monero-project` + +## Toolchain customisations + +The files under `depends/` are the ones modified from upstream, kept here so the +archive can be regenerated: + +| File | Change | +|---|---| +| `depends/hosts/ios.mk` | new host; `IOS_PLATFORM=SIMULATOR` (default) or `DEVICE` selects the SDK and the target triple (`aarch64-apple-ios[-simulator]`) | +| `depends/packages/packages.mk` | `ios_packages := boost openssl zeromq expat unbound sodium` (no libiconv) | +| `depends/packages/boost.mk` | boost for the `ios` toolset: darwin toolset, libtool archiver, c++11, no b2 python | +| `depends/packages/zeromq.mk` | ios config opts (`--host=aarch64-apple-darwin`), no libsodium, no curve | +| `depends/packages/unbound.mk` | drops the autoconf dependency | +| `depends/packages/sodium.mk` | drops the autoconf dependency | +| `depends/funcs.mk` | create the prefix `lib` directory before extracting dependency archives | + +One source change is also required, in monero-project: + +- `src/cryptonote_basic/miner.cpp` — wrap the IOKit includes and the related + code with `defined(TARGET_OS_OSX) && TARGET_OS_OSX`; IOKit is unavailable on + iOS. Two locations, around lines 51 and 986. + +Two more steps are needed when targeting a device: + +- Copy monero's patched boost serialisation headers into the dependency prefix, + because monero's build otherwise only finds them for the platform it was + installed for: + + ```sh + cp external/boost/archive/portable_binary_*.hpp \ + contrib/depends/$HOST/include/boost/archive/ + ``` + +- randomx's AArch64 JIT references `__clear_cache`, which libSystem exports on + macOS and the simulator but not on iOS. The app supplies it in + `Koins/Support/ClearCache.c`. + +## Build + +Set `PLATFORM` to `SIMULATOR` or `DEVICE`; the only differences are the depends +host flag and the output archive name. + +```sh +MONERO=/path/to/monero-project +PLATFORM=SIMULATOR # or DEVICE +HOST=aarch64-apple-ios + +# 1. Cross-compiled dependencies (boost, openssl, zeromq, expat, unbound, sodium) +cd "$MONERO/contrib/depends" +make HOST=$HOST IOS_PLATFORM=$PLATFORM -j"$(sysctl -n hw.ncpu)" + +# 2. monero-project, static wallet library +cd "$MONERO" +mkdir -p build/ios-$PLATFORM && cd build/ios-$PLATFORM +cmake -G "Unix Makefiles" \ + -DCMAKE_TOOLCHAIN_FILE="$MONERO/contrib/depends/$HOST/share/toolchain.cmake" \ + -DCMAKE_BUILD_TYPE=Release \ + -DSTATIC=ON -DBUILD_SHARED_LIBS=OFF \ + -DBUILD_TESTS=OFF -DBUILD_DOCUMENTATION=OFF -DUSE_DEVICE_TREZOR=OFF \ + ../.. +make -j"$(sysctl -n hw.ncpu)" wallet # produces lib/libwallet.a + +# 3. monero-cpp +cd /path/to/monero-cpp +mkdir -p build-ios-$PLATFORM && cd build-ios-$PLATFORM +cmake -G "Unix Makefiles" \ + -DCMAKE_TOOLCHAIN_FILE="$MONERO/contrib/depends/$HOST/share/toolchain.cmake" \ + ../.. +make -j"$(sysctl -n hw.ncpu)" # produces libmonero-cpp.a + +# 4. Merge into one archive for the app +libtool -static -o libkoins_monero_merged.a \ + libmonero-cpp.a \ + "$MONERO/build/ios-$PLATFORM/lib/libwallet.a" \ + "$MONERO/build/ios-$PLATFORM"/src/*/lib*.a \ + "$MONERO/build/ios-$PLATFORM"/external/*/lib*.a \ + "$MONERO/build/ios-$PLATFORM"/contrib/epee/src/libepee.a \ + "$MONERO/contrib/depends/$HOST"/lib/lib*.a +``` + +Copy the result to `libs/`, using `libkoins_monero_merged.a` for the simulator +and `libkoins_monero_device.a` for the device. + +## Notes + +- Only the simulator archive is needed to run in the simulator; the device + archive is needed for a real iPhone, and Xcode requires the matching one at + link time. +- Building the device slice after a simulator build requires moving the + simulator depends prefix aside first, since depends installs into + `contrib/depends/` and both platforms share the host name. +- The app also links the OpenSSL that is embedded in this archive, which is how + the XRP wallet gets secp256k1 without an extra dependency. \ No newline at end of file diff --git a/apps/ios/Monero/toolchain/depends/funcs.mk b/apps/ios/Monero/toolchain/depends/funcs.mk new file mode 100644 index 0000000..eb7e5e1 --- /dev/null +++ b/apps/ios/Monero/toolchain/depends/funcs.mk @@ -0,0 +1,270 @@ +define int_vars +#Set defaults for vars which may be overridden per-package +$(1)_cc=$($($(1)_type)_CC) +$(1)_cxx=$($($(1)_type)_CXX) +$(1)_objc=$($($(1)_type)_OBJC) +$(1)_objcxx=$($($(1)_type)_OBJCXX) +$(1)_ar=$($($(1)_type)_AR) +$(1)_ranlib=$($($(1)_type)_RANLIB) +$(1)_libtool=$($($(1)_type)_LIBTOOL) +$(1)_nm=$($($(1)_type)_NM) +$(1)_cflags=$($($(1)_type)_CFLAGS) $($($(1)_type)_$(release_type)_CFLAGS) +$(1)_cxxflags=$($($(1)_type)_CXXFLAGS) $($($(1)_type)_$(release_type)_CXXFLAGS) +$(1)_arflags=$($($(1)_type)_ARFLAGS) $($($(1)_type)_$(release_type)_ARFLAGS) +$(1)_ldflags=$($($(1)_type)_LDFLAGS) $($($(1)_type)_$(release_type)_LDFLAGS) -L$($($(1)_type)_prefix)/lib +$(1)_cppflags=$($($(1)_type)_CPPFLAGS) $($($(1)_type)_$(release_type)_CPPFLAGS) -I$($($(1)_type)_prefix)/include +$(1)_recipe_hash:= +endef + +define int_get_all_dependencies +$(sort $(foreach dep,$(2),$(2) $(call int_get_all_dependencies,$(1),$($(dep)_dependencies)))) +endef + +define fetch_file_inner + ( mkdir -p $$($(1)_download_dir) && echo Fetching $(3) from $(2) && \ + $(build_DOWNLOAD) "$$($(1)_download_dir)/$(4).temp" "$(2)/$(3)" && \ + echo "$(5) $$($(1)_download_dir)/$(4).temp" > $$($(1)_download_dir)/.$(4).hash && \ + $(build_SHA256SUM) -c $$($(1)_download_dir)/.$(4).hash && \ + mv $$($(1)_download_dir)/$(4).temp $$($(1)_source_dir)/$(4) && \ + rm -rf $$($(1)_download_dir) ) +endef + +define fetch_file + ( test -f $$($(1)_source_dir)/$(4) || \ + ( $(call fetch_file_inner,$(1),$(2),$(3),$(4),$(5)) || \ + $(call fetch_file_inner,$(1),$(FALLBACK_DOWNLOAD_PATH),$(4),$(4),$(5)))) +endef + +define int_get_build_recipe_hash +$(eval $(1)_all_file_checksums:=$(shell $(build_SHA256SUM) $(meta_depends) packages/$(1).mk $(addprefix $(PATCHES_PATH)/$(1)/,$($(1)_patches)) | cut -d" " -f1)) +$(eval $(1)_recipe_hash:=$(shell echo -n "$($(1)_all_file_checksums)" | $(build_SHA256SUM) | cut -d" " -f1)) +endef + +define int_get_build_id +$(eval $(1)_dependencies += $($(1)_$(host_arch)_$(host_os)_dependencies) $($(1)_$(host_os)_dependencies)) +$(eval $(1)_all_dependencies:=$(call int_get_all_dependencies,$(1),$($($(1)_type)_native_toolchain) $($(1)_dependencies))) +$(foreach dep,$($(1)_all_dependencies),$(eval $(1)_build_id_deps+=$(dep)-$($(dep)_version)-$($(dep)_recipe_hash))) +$(eval $(1)_build_id_long:=$(1)-$($(1)_version)-$($(1)_recipe_hash)-$(release_type) $($(1)_build_id_deps) $($($(1)_type)_id_string)) +$(eval $(1)_build_id:=$(shell echo -n "$($(1)_build_id_long)" | $(build_SHA256SUM) | cut -c-$(HASH_LENGTH))) +final_build_id_long+=$($(package)_build_id_long) + +#compute package-specific paths +$(1)_build_subdir?=. +$(1)_download_file?=$($(1)_file_name) +$(1)_source_dir:=$(SOURCES_PATH) +$(1)_source:=$$($(1)_source_dir)/$($(1)_file_name) +$(1)_staging_dir=$(base_staging_dir)/$(host)/$(1)/$($(1)_version)-$($(1)_build_id) +$(1)_staging_prefix_dir:=$$($(1)_staging_dir)$($($(1)_type)_prefix) +$(1)_extract_dir:=$(base_build_dir)/$(host)/$(1)/$($(1)_version)-$($(1)_build_id) +$(1)_download_dir:=$(base_download_dir)/$(1)-$($(1)_version) +$(1)_build_dir:=$$($(1)_extract_dir)/$$($(1)_build_subdir) +$(1)_cached_checksum:=$(BASE_CACHE)/$(host)/$(1)/$(1)-$($(1)_version)-$($(1)_build_id).tar.gz.hash +$(1)_patch_dir:=$(base_build_dir)/$(host)/$(1)/$($(1)_version)-$($(1)_build_id)/.patches-$($(1)_build_id) +$(1)_prefixbin:=$($($(1)_type)_prefix)/bin/ +$(1)_cached:=$(BASE_CACHE)/$(host)/$(1)/$(1)-$($(1)_version)-$($(1)_build_id).tar.gz +$(1)_all_sources=$($(1)_file_name) $($(1)_extra_sources) + +#stamps +$(1)_fetched=$(SOURCES_PATH)/download-stamps/.stamp_fetched-$(1)-$($(1)_file_name).hash +$(1)_extracted=$$($(1)_extract_dir)/.stamp_extracted +$(1)_preprocessed=$$($(1)_extract_dir)/.stamp_preprocessed +$(1)_cleaned=$$($(1)_extract_dir)/.stamp_cleaned +$(1)_built=$$($(1)_build_dir)/.stamp_built +$(1)_configured=$$($(1)_build_dir)/.stamp_configured +$(1)_staged=$$($(1)_staging_dir)/.stamp_staged +$(1)_postprocessed=$$($(1)_staging_prefix_dir)/.stamp_postprocessed +$(1)_download_path_fixed=$(subst :,\:,$$($(1)_download_path)) + + +#default commands +$(1)_fetch_cmds ?= $(call fetch_file,$(1),$(subst \:,:,$$($(1)_download_path_fixed)),$$($(1)_download_file),$($(1)_file_name),$($(1)_sha256_hash)) +$(1)_extract_cmds ?= mkdir -p $$($(1)_extract_dir) && echo "$$($(1)_sha256_hash) $$($(1)_source)" > $$($(1)_extract_dir)/.$$($(1)_file_name).hash && $(build_SHA256SUM) -c $$($(1)_extract_dir)/.$$($(1)_file_name).hash && tar --strip-components=1 -xf $$($(1)_source) +$(1)_preprocess_cmds ?= +$(1)_build_cmds ?= +$(1)_config_cmds ?= +$(1)_stage_cmds ?= +$(1)_set_vars ?= + + +all_sources+=$$($(1)_fetched) +endef +#$(foreach dep_target,$($(1)_all_dependencies),$(eval $(1)_dependency_targets=$($(dep_target)_cached))) + + +define int_config_attach_build_config +$(eval $(call $(1)_set_vars,$(1))) +$(1)_cflags+=$($(1)_cflags_$(release_type)) +$(1)_cflags+=$($(1)_cflags_$(host_arch)) $($(1)_cflags_$(host_arch)_$(release_type)) +$(1)_cflags+=$($(1)_cflags_$(host_os)) $($(1)_cflags_$(host_os)_$(release_type)) +$(1)_cflags+=$($(1)_cflags_$(host_arch)_$(host_os)) $($(1)_cflags_$(host_arch)_$(host_os)_$(release_type)) + +$(1)_cxxflags+=$($(1)_cxxflags_$(release_type)) +$(1)_cxxflags+=$($(1)_cxxflags_$(host_arch)) $($(1)_cxxflags_$(host_arch)_$(release_type)) +$(1)_cxxflags+=$($(1)_cxxflags_$(host_os)) $($(1)_cxxflags_$(host_os)_$(release_type)) +$(1)_cxxflags+=$($(1)_cxxflags_$(host_arch)_$(host_os)) $($(1)_cxxflags_$(host_arch)_$(host_os)_$(release_type)) + +$(1)_arflags+=$($(1)_arflags_$(release_type)) +$(1)_arflags+=$($(1)_arflags_$(host_arch)) $($(1)_arflags_$(host_arch)_$(release_type)) +$(1)_arflags+=$($(1)_arflags_$(host_os)) $($(1)_arflags_$(host_os)_$(release_type)) +$(1)_arflags+=$($(1)_arflags_$(host_arch)_$(host_os)) $($(1)_arflags_$(host_arch)_$(host_os)_$(release_type)) + +$(1)_cppflags+=$($(1)_cppflags_$(release_type)) +$(1)_cppflags+=$($(1)_cppflags_$(host_arch)) $($(1)_cppflags_$(host_arch)_$(release_type)) +$(1)_cppflags+=$($(1)_cppflags_$(host_os)) $($(1)_cppflags_$(host_os)_$(release_type)) +$(1)_cppflags+=$($(1)_cppflags_$(host_arch)_$(host_os)) $($(1)_cppflags_$(host_arch)_$(host_os)_$(release_type)) + +$(1)_ldflags+=$($(1)_ldflags_$(release_type)) +$(1)_ldflags+=$($(1)_ldflags_$(host_arch)) $($(1)_ldflags_$(host_arch)_$(release_type)) +$(1)_ldflags+=$($(1)_ldflags_$(host_os)) $($(1)_ldflags_$(host_os)_$(release_type)) +$(1)_ldflags+=$($(1)_ldflags_$(host_arch)_$(host_os)) $($(1)_ldflags_$(host_arch)_$(host_os)_$(release_type)) + +$(1)_build_opts+=$$($(1)_build_opts_$(release_type)) +$(1)_build_opts+=$$($(1)_build_opts_$(host_arch)) $$($(1)_build_opts_$(host_arch)_$(release_type)) +$(1)_build_opts+=$$($(1)_build_opts_$(host_os)) $$($(1)_build_opts_$(host_os)_$(release_type)) +$(1)_build_opts+=$$($(1)_build_opts_$(host_arch)_$(host_os)) $$($(1)_build_opts_$(host_arch)_$(host_os)_$(release_type)) + +$(1)_config_opts+=$$($(1)_config_opts_$(release_type)) +$(1)_config_opts+=$$($(1)_config_opts_$(host_arch)) $$($(1)_config_opts_$(host_arch)_$(release_type)) +$(1)_config_opts+=$$($(1)_config_opts_$(host_os)) $$($(1)_config_opts_$(host_os)_$(release_type)) +$(1)_config_opts+=$$($(1)_config_opts_$(host_arch)_$(host_os)) $$($(1)_config_opts_$(host_arch)_$(host_os)_$(release_type)) + +$(1)_config_env+=$$($(1)_config_env_$(release_type)) +$(1)_config_env+=$($(1)_config_env_$(host_arch)) $($(1)_config_env_$(host_arch)_$(release_type)) +$(1)_config_env+=$($(1)_config_env_$(host_os)) $($(1)_config_env_$(host_os)_$(release_type)) +$(1)_config_env+=$($(1)_config_env_$(host_arch)_$(host_os)) $($(1)_config_env_$(host_arch)_$(host_os)_$(release_type)) + +$(1)_build_env+=$$($(1)_build_env_$(release_type)) +$(1)_build_env+=$($(1)_build_env_$(host_arch)) $($(1)_build_env_$(host_arch)_$(release_type)) +$(1)_build_env+=$($(1)_build_env_$(host_os)) $($(1)_build_env_$(host_os)_$(release_type)) +$(1)_build_env+=$($(1)_build_env_$(host_arch)_$(host_os)) $($(1)_build_env_$(host_arch)_$(host_os)_$(release_type)) + +$(1)_config_env+=PKG_CONFIG_LIBDIR=$($($(1)_type)_prefix)/lib/pkgconfig +$(1)_config_env+=PKG_CONFIG_PATH=$($($(1)_type)_prefix)/share/pkgconfig +$(1)_config_env+=PATH="$(build_prefix)/bin:$(PATH)" +$(1)_build_env+=PATH="$(build_prefix)/bin:$(PATH)" +$(1)_stage_env+=PATH="$(build_prefix)/bin:$(PATH)" +$(1)_autoconf=./configure --build=$(BUILD) --host=$($($(1)_type)_host) --prefix=$($($(1)_type)_prefix) $$($(1)_config_opts) CC="$$($(1)_cc)" CXX="$$($(1)_cxx)" + +ifeq ($(filter $(1),libusb unbound),) +$(1)_autoconf += --disable-dependency-tracking +endif +ifneq ($($(1)_nm),) +$(1)_autoconf += NM="$$($(1)_nm)" +endif +ifneq ($($(1)_ranlib),) +$(1)_autoconf += RANLIB="$$($(1)_ranlib)" +endif +ifneq ($($(1)_ar),) +$(1)_autoconf += AR="$$($(1)_ar)" +endif +ifneq ($($(1)_arflags),) +$(1)_autoconf += ARFLAGS="$$($(1)_arflags)" +endif +ifneq ($($(1)_cflags),) +$(1)_autoconf += CFLAGS="$$($(1)_cflags)" +endif +ifneq ($($(1)_cxxflags),) +$(1)_autoconf += CXXFLAGS="$$($(1)_cxxflags)" +endif +ifneq ($($(1)_cppflags),) +$(1)_autoconf += CPPFLAGS="$$($(1)_cppflags)" +endif +ifneq ($($(1)_ldflags),) +$(1)_autoconf += LDFLAGS="$$($(1)_ldflags)" +endif +endef + +define int_add_cmds +$($(1)_fetched): + $(AT)mkdir -p $$(@D) $(SOURCES_PATH) + $(AT)rm -f $$@ + $(AT)touch $$@ + $(AT)cd $$(@D); $(call $(1)_fetch_cmds,$(1)) + $(AT)cd $($(1)_source_dir); $(foreach source,$($(1)_all_sources),$(build_SHA256SUM) $(source) >> $$(@);) + $(AT)touch $$@ +$($(1)_extracted): | $($(1)_fetched) + $(AT)echo Extracting $(1)... + $(AT)mkdir -p $$(@D) + $(AT)cd $$(@D); $(call $(1)_extract_cmds,$(1)) + $(AT)touch $$@ +$($(1)_preprocessed): | $($(1)_dependencies) $($(1)_extracted) + $(AT)echo Preprocessing $(1)... + $(AT)mkdir -p $$(@D) $($(1)_patch_dir) + $(AT)$(foreach patch,$($(1)_patches),cd $(PATCHES_PATH)/$(1); cp $(patch) $($(1)_patch_dir) ;) + $(AT)cd $$(@D); $(call $(1)_preprocess_cmds, $(1)) + $(AT)touch $$@ +$($(1)_configured): | $($(1)_preprocessed) + $(AT)echo Configuring $(1)... + $(AT)rm -rf $(host_prefix); mkdir -p $(host_prefix)/lib; cd $(host_prefix); $(foreach package,$($(1)_all_dependencies), $(if $(strip $($(package)_cached)), tar xf $($(package)_cached);,)) + $(AT)mkdir -p $$(@D) + $(AT)+cd $$(@D); $($(1)_config_env) $(call $(1)_config_cmds, $(1)) + $(AT)touch $$@ +$($(1)_built): | $($(1)_configured) + $(AT)echo Building $(1)... + $(AT)mkdir -p $$(@D) + $(AT)+cd $$(@D); $($(1)_build_env) $(call $(1)_build_cmds, $(1)) + $(AT)touch $$@ +$($(1)_staged): | $($(1)_built) + $(AT)echo Staging $(1)... + $(AT)mkdir -p $($(1)_staging_dir)/$(host_prefix) + $(AT)cd $($(1)_build_dir); $($(1)_stage_env) $(call $(1)_stage_cmds, $(1)) + $(AT)rm -rf $($(1)_extract_dir) + $(AT)touch $$@ +$($(1)_postprocessed): | $($(1)_staged) + $(AT)echo Postprocessing $(1)... + $(AT)cd $($(1)_staging_prefix_dir); $(call $(1)_postprocess_cmds) + $(AT)touch $$@ +$($(1)_cached): | $($(1)_dependencies) $($(1)_postprocessed) + $(AT)echo Caching $(1)... + $(AT)cd $$($(1)_staging_dir)/$(host_prefix); find . | sort | tar --no-recursion -czf $$($(1)_staging_dir)/$$(@F) -T - + $(AT)mkdir -p $$(@D) + $(AT)rm -rf $$(@D) && mkdir -p $$(@D) + $(AT)mv $$($(1)_staging_dir)/$$(@F) $$(@) + $(AT)rm -rf $($(1)_staging_dir) +$($(1)_cached_checksum): $($(1)_cached) + $(AT)cd $$(@D); $(build_SHA256SUM) $$( $$(@) + +.PHONY: $(1) +$(1): | $($(1)_cached_checksum) +.SECONDARY: $($(1)_cached) $($(1)_postprocessed) $($(1)_staged) $($(1)_built) $($(1)_configured) $($(1)_preprocessed) $($(1)_extracted) $($(1)_fetched) + +endef + +stages = fetched extracted preprocessed configured built staged postprocessed cached cached_checksum + +define ext_add_stages +$(foreach stage,$(stages), + $(1)_$(stage): $($(1)_$(stage)) + .PHONY: $(1)_$(stage)) +endef + +# These functions create the build targets for each package. They must be +# broken down into small steps so that each part is done for all packages +# before moving on to the next step. Otherwise, a package's info +# (build-id for example) would only be available to another package if it +# happened to be computed already. + +#set the type for host/build packages. +$(foreach native_package,$(native_packages),$(eval $(native_package)_type=build)) +$(foreach package,$(packages),$(eval $(package)_type=$(host_arch)_$(host_os))) + +#set overridable defaults +$(foreach package,$(all_packages),$(eval $(call int_vars,$(package)))) + +#include package files +$(foreach package,$(all_packages),$(eval include packages/$(package).mk)) + +#compute a hash of all files that comprise this package's build recipe +$(foreach package,$(all_packages),$(eval $(call int_get_build_recipe_hash,$(package)))) + +#generate a unique id for this package, incorporating its dependencies as well +$(foreach package,$(all_packages),$(eval $(call int_get_build_id,$(package)))) + +#compute final vars after reading package vars +$(foreach package,$(all_packages),$(eval $(call int_config_attach_build_config,$(package)))) + +#create build targets +$(foreach package,$(all_packages),$(eval $(call int_add_cmds,$(package)))) + +#special exception: if a toolchain package exists, all non-native packages depend on it +$(foreach package,$(packages),$(eval $($(package)_unpacked): |$($($(host_arch)_$(host_os)_native_toolchain)_cached) )) diff --git a/apps/ios/Monero/toolchain/depends/hosts/ios.mk b/apps/ios/Monero/toolchain/depends/hosts/ios.mk new file mode 100644 index 0000000..81c16de --- /dev/null +++ b/apps/ios/Monero/toolchain/depends/hosts/ios.mk @@ -0,0 +1,41 @@ +# iOS host for monero depends system (arm64 simulator for dev). +# Targets modern iOS (14+) on Apple Silicon simulators / devices. + +IOS_MIN_VERSION=13.0 +LD64_VERSION=609 + +ifndef IOS_PLATFORM +IOS_PLATFORM=SIMULATOR +endif + +ifeq ($(IOS_PLATFORM),SIMULATOR) +IOS_SDK_ROOT := $(shell xcrun --sdk iphonesimulator --show-sdk-path) +CC_target=aarch64-apple-ios-simulator +else +IOS_SDK_ROOT := $(shell xcrun --sdk iphoneos --show-sdk-path) +CC_target=aarch64-apple-ios +endif + +ios_CC=clang -target $(CC_target) -miphoneos-version-min=$(IOS_MIN_VERSION) --sysroot $(IOS_SDK_ROOT) -mlinker-version=$(LD64_VERSION) +ios_CXX=clang++ -target $(CC_target) -miphoneos-version-min=$(IOS_MIN_VERSION) --sysroot $(IOS_SDK_ROOT) -mlinker-version=$(LD64_VERSION) -stdlib=libc++ + +ios_CFLAGS=-pipe -isysroot $(IOS_SDK_ROOT) +ios_CXXFLAGS=-pipe -isysroot $(IOS_SDK_ROOT) -std=c++14 -stdlib=libc++ +ios_ARFLAGS=cr + +ios_release_CFLAGS=-O1 +ios_release_CXXFLAGS=$(ios_release_CFLAGS) + +ios_debug_CFLAGS=-O1 +ios_debug_CXXFLAGS=$(ios_debug_CFLAGS) + +ios_native_toolchain=native_cctools darwin_sdk + +# iOS uses the system (macOS) ar/ranlib/strip/nm for cross-compiled archives. +ios_AR=ar +ios_RANLIB=ranlib +ios_STRIP=strip +ios_NM=nm +ios_LIBTOOL=libtool +ios_OTOOL=otool +ios_INSTALL_NAME_TOOL=install_name_tool diff --git a/apps/ios/Monero/toolchain/depends/packages/boost.mk b/apps/ios/Monero/toolchain/depends/packages/boost.mk new file mode 100644 index 0000000..d9cd231 --- /dev/null +++ b/apps/ios/Monero/toolchain/depends/packages/boost.mk @@ -0,0 +1,46 @@ +package=boost +$(package)_version=1.76.0 +$(package)_download_path=https://archives.boost.io/release/$($(package)_version)/source/ +$(package)_file_name=$(package)_$(subst .,_,$($(package)_version)).tar.gz +$(package)_sha256_hash=7bd7ddceec1a1dfdcbdb3e609b60d01739c38390a5f956385a12f3122049f0ca +$(package)_dependencies= +$(package)_patches=fix_integral_wrapper.patch + +define $(package)_set_vars +$(package)_config_opts_release=variant=release +$(package)_config_opts_debug=variant=debug +$(package)_config_opts+=--layout=system --user-config=user-config.jam +$(package)_config_opts+=threading=multi link=static -sNO_BZIP2=1 -sNO_ZLIB=1 +$(package)_config_opts_linux=threadapi=pthread runtime-link=shared +$(package)_config_opts_android=threadapi=pthread runtime-link=static target-os=android +$(package)_config_opts_darwin=--toolset=darwin runtime-link=shared +$(package)_config_opts_mingw32=binary-format=pe target-os=windows threadapi=win32 runtime-link=static +$(package)_config_opts_x86_64_mingw32=address-model=64 +$(package)_config_opts_i686_mingw32=address-model=32 +$(package)_config_opts_i686_linux=address-model=32 architecture=x86 +$(package)_toolset_$(host_os)=gcc +$(package)_archiver_$(host_os)=$($(package)_ar) +$(package)_toolset_darwin=darwin +$(package)_archiver_darwin=$($(package)_libtool) +$(package)_config_libraries=chrono,filesystem,program_options,system,thread,test,date_time,regex,serialization,locale +$(package)_toolset_ios=darwin +$(package)_archiver_ios=libtool +$(package)_arflags_ios= +$(package)_cxxflags_ios=-fPIC -std=c++11 -stdlib=libc++ +$(package)_cxxflags=-std=c++11 +$(package)_cxxflags_linux=-fPIC +$(package)_cxxflags_freebsd=-fPIC +endef + +define $(package)_preprocess_cmds + patch -p1 < $($(package)_patch_dir)/fix_integral_wrapper.patch &&\ + echo "using $(boost_toolset_$(host_os)) : : $($(package)_cxx) : \"$(IOS_SDK_ROOT)\" \"$($(package)_cxxflags) $($(package)_cppflags) -isysroot $(IOS_SDK_ROOT)\" \"$($(package)_ldflags) -isysroot $(IOS_SDK_ROOT)\" \"$(boost_archiver_$(host_os))\" \"$($(package)_arflags)\" \"$(host_STRIP)\" \"$(host_RANLIB)\" \"$(host_WINDRES)\" : ;" > user-config.jam +endef + +define $(package)_config_cmds + ./bootstrap.sh --with-libraries=$(boost_config_libraries) +endef + +define $(package)_stage_cmds + ./b2 -d0 -j4 --prefix=$($(package)_staging_prefix_dir) $($(package)_config_opts) install +endef diff --git a/apps/ios/Monero/toolchain/depends/packages/packages.mk b/apps/ios/Monero/toolchain/depends/packages/packages.mk new file mode 100644 index 0000000..b3580c2 --- /dev/null +++ b/apps/ios/Monero/toolchain/depends/packages/packages.mk @@ -0,0 +1,43 @@ +packages:=boost openssl zeromq expat unbound + +# iOS: iconv is provided by the system; libiconv-1.15 fails with modern clang. +ios_packages := boost openssl zeromq expat unbound sodium + + + +# ccache is useless in gitian builds +ifneq ($(GITIAN),1) +native_packages := native_ccache +endif + +hardware_packages := hidapi protobuf libusb +hardware_native_packages := native_protobuf + +android_native_packages = android_ndk +android_packages = ncurses readline sodium + +darwin_native_packages = $(hardware_native_packages) +darwin_packages = ncurses readline sodium $(hardware_packages) + +# not really native... +freebsd_native_packages = freebsd_base +freebsd_packages = ncurses readline sodium + +linux_packages = eudev ncurses readline sodium $(hardware_packages) +linux_native_packages = $(hardware_native_packages) + +ifeq ($(build_tests),ON) +packages += gtest +endif + +ifneq ($(host_arch),riscv64) +linux_packages += unwind +endif + +mingw32_packages = icu4c sodium $(hardware_packages) +mingw32_native_packages = $(hardware_native_packages) + +ifneq ($(build_os),darwin) +darwin_native_packages += darwin_sdk native_clang native_cctools native_libtapi +endif + diff --git a/apps/ios/Monero/toolchain/depends/packages/sodium.mk b/apps/ios/Monero/toolchain/depends/packages/sodium.mk new file mode 100644 index 0000000..fbe3148 --- /dev/null +++ b/apps/ios/Monero/toolchain/depends/packages/sodium.mk @@ -0,0 +1,32 @@ +package=sodium +$(package)_version=1.0.18 +$(package)_download_path=https://download.libsodium.org/libsodium/releases/ +$(package)_file_name=libsodium-$($(package)_version).tar.gz +$(package)_sha256_hash=6f504490b342a4f8a4c4a02fc9b866cbef8622d5df4e5452b46be121e46636c1 +$(package)_patches=disable-glibc-getrandom-getentropy.patch fix-whitespace.patch + +define $(package)_set_vars +$(package)_config_opts=--enable-static --disable-shared +$(package)_config_opts+=--prefix=$(host_prefix) +endef + +define $(package)_preprocess_cmds + patch -p1 < $($(package)_patch_dir)/fix-whitespace.patch +endef + +define $(package)_config_cmds + $($(package)_autoconf) AR_FLAGS=$($(package)_arflags) +endef + +define $(package)_build_cmds + $(MAKE) +endef + +define $(package)_stage_cmds + $(MAKE) DESTDIR=$($(package)_staging_dir) install +endef + +define $(package)_postprocess_cmds + rm lib/*.la +endef + diff --git a/apps/ios/Monero/toolchain/depends/packages/unbound.mk b/apps/ios/Monero/toolchain/depends/packages/unbound.mk new file mode 100644 index 0000000..6794dcf --- /dev/null +++ b/apps/ios/Monero/toolchain/depends/packages/unbound.mk @@ -0,0 +1,36 @@ +package=unbound +$(package)_version=1.25.1 +$(package)_download_path=https://www.nlnetlabs.nl/downloads/$(package)/ +$(package)_file_name=$(package)-$($(package)_version).tar.gz +$(package)_sha256_hash=0fe8b6277b0959cfd17562debac0aa5f71e0b02dc4ffa9c60271c583edab586f +$(package)_dependencies=openssl expat +$(package)_patches=disable-glibc-reallocarray.patch hardcode_config_date.patch + + +define $(package)_set_vars + $(package)_config_opts=--disable-shared --enable-static --without-pyunbound --prefix=$(host_prefix) + $(package)_config_opts+=--with-libexpat=$(host_prefix) --with-ssl=$(host_prefix) --with-libevent=no + $(package)_config_opts+=--without-pythonmodule --disable-flto --with-pthreads --with-libunbound-only + $(package)_config_opts_linux=--with-pic + $(package)_config_opts_w64=--enable-static-exe --sysconfdir=/etc --prefix=$(host_prefix) --target=$(host_prefix) + $(package)_config_opts_x86_64_darwin=ac_cv_func_SHA384_Init=yes + $(package)_build_opts_mingw32=LDFLAGS="$($(package)_ldflags) -lpthread" + $(package)_cflags_mingw32+="-D_WIN32_WINNT=0x600" +endef + +define $(package)_preprocess_cmds + rm doc/*.odp doc/*.pdf contrib/*.tar.gz contrib/*.tar.bz2 &&\ + rm -rf testdata dnscrypt/testdata +endef + +define $(package)_config_cmds + $($(package)_autoconf) ac_cv_func_getentropy=no +endef + +define $(package)_build_cmds + $(MAKE) $($(package)_build_opts) +endef + +define $(package)_stage_cmds + $(MAKE) DESTDIR=$($(package)_staging_dir) install +endef diff --git a/apps/ios/Monero/toolchain/depends/packages/zeromq.mk b/apps/ios/Monero/toolchain/depends/packages/zeromq.mk new file mode 100644 index 0000000..3556010 --- /dev/null +++ b/apps/ios/Monero/toolchain/depends/packages/zeromq.mk @@ -0,0 +1,37 @@ +package=zeromq +$(package)_version=4.3.4 +$(package)_download_path=https://github.com/zeromq/libzmq/releases/download/v$($(package)_version)/ +$(package)_file_name=$(package)-$($(package)_version).tar.gz +$(package)_sha256_hash=c593001a89f5a85dd2ddf564805deb860e02471171b3f204944857336295c3e5 +$(package)_patches=06aba27b04c5822cb88a69677382a0f053367143.patch + +define $(package)_set_vars + $(package)_config_opts=--without-documentation --disable-shared --without-libsodium --disable-curve + $(package)_config_opts_linux=--with-pic + $(package)_config_opts_freebsd=--with-pic + $(package)_config_opts_ios=--host=aarch64-apple-darwin --with-pic + $(package)_cxxflags=-std=c++11 + $(package)_cxxflags_ios=-std=c++11 -isysroot $(IOS_SDK_ROOT) -stdlib=libc++ -Wno-deprecated-declarations +endef + +define $(package)_preprocess_cmds + patch -p1 < $($(package)_patch_dir)/06aba27b04c5822cb88a69677382a0f053367143.patch +endef + +define $(package)_config_cmds + $($(package)_autoconf) AR_FLAGS=$($(package)_arflags) +endef + +define $(package)_build_cmds + $(MAKE) src/libzmq.la +endef + +define $(package)_stage_cmds + $(MAKE) DESTDIR=$($(package)_staging_dir) install-libLTLIBRARIES install-includeHEADERS install-pkgconfigDATA +endef + +define $(package)_postprocess_cmds + rm -rf bin share &&\ + rm lib/*.la +endef +