Document how the Monero iOS library is built
This commit is contained in:
@@ -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/<host>` 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.
|
||||||
@@ -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) $$(<F) > $$(@)
|
||||||
|
|
||||||
|
.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) ))
|
||||||
@@ -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
|
||||||
@@ -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) : <root>\"$(IOS_SDK_ROOT)\" <cxxflags>\"$($(package)_cxxflags) $($(package)_cppflags) -isysroot $(IOS_SDK_ROOT)\" <linkflags>\"$($(package)_ldflags) -isysroot $(IOS_SDK_ROOT)\" <archiver>\"$(boost_archiver_$(host_os))\" <arflags>\"$($(package)_arflags)\" <striper>\"$(host_STRIP)\" <ranlib>\"$(host_RANLIB)\" <rc>\"$(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
|
||||||
@@ -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
|
||||||
|
|
||||||
@@ -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
|
||||||
|
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
|
|
||||||
Reference in New Issue
Block a user