fix: unify nim-sds path and add platform sentinel for cross-platform builds

Use vendor/nim-sds as the default source for desktop builds. Add a
platform sentinel that clears shared qrcodegen, nim-sds, and libstatus
outputs when switching desktop/mobile or arch in the same tree.

Replace parse-time platform cleanup with an order-only Make target.
Drop ios/android branches from the root Makefile; mobile cleanup lives
in mobile/Makefile. Always delegate status-go mobile builds via FORCE
and copy libraries only on change.
This commit is contained in:
Andrey Bocharnikov
2026-07-03 15:33:46 +04:00
parent 8d52388e31
commit aa2cd9a909
4 changed files with 70 additions and 9 deletions
+1
View File
@@ -17,6 +17,7 @@ vendor/.nimble
*.AppImage
tmp
nimcache
.platform-target
.DS_Store
nim-status-client*.tgz
/package/
+28 -5
View File
@@ -59,7 +59,8 @@ GIT_ROOT ?= $(shell git rev-parse --show-toplevel 2>/dev/null || echo .)
flatpak \
flatpak-install \
flatpak-run \
flatpak-clean
flatpak-clean \
platform-cleanup
ifeq ($(NIM_PARAMS),)
# "variables.mk" was not included, so we update the submodules.
@@ -278,13 +279,26 @@ ifeq ($(mkspecs),macx)
endif
endif
NIM_SDS_SOURCE_DIR ?= $(GIT_ROOT)/../nim-sds
NIM_SDS_SOURCE_DIR ?= $(GIT_ROOT)/vendor/nim-sds
export NIM_SDS_SOURCE_DIR
NIMSDS_LIBDIR := $(NIM_SDS_SOURCE_DIR)/build
NIMSDS_LIBFILE := $(NIMSDS_LIBDIR)/libsds.$(LIB_EXT)
NIM_EXTRA_PARAMS += --passL:"-L$(NIMSDS_LIBDIR)" --passL:"-lsds"
STATUSGO_MAKE_PARAMS += NIM_SDS_SOURCE_DIR="$(NIM_SDS_SOURCE_DIR)"
# desktop only; mobile cleanup lives in mobile/Makefile
ifneq ($(filter $(mkspecs),macx linux),)
PLATFORM_TARGET := $(host_os)-$(or $(QT_ARCH),$(shell uname -m))
else ifeq ($(mkspecs),win32)
PLATFORM_TARGET := windows-$(or $(QT_ARCH),$(shell uname -m))
endif
# Order-only prerequisite: delete shared vendor artifacts (qrcodegen, nim-sds, libstatus) when the build platform/arch changes.
platform-cleanup:
ifneq ($(PLATFORM_TARGET),)
scripts/platform_pre_build_cleanup.sh "$(PLATFORM_TARGET)"
endif
INCLUDE_DEBUG_SYMBOLS ?= false
ifeq ($(INCLUDE_DEBUG_SYMBOLS),true)
# We need `-d:debug` to get Nim's default stack traces
@@ -533,7 +547,12 @@ STATUSGO := vendor/status-go/build/bin/libstatus.$(LIB_EXT)
STATUSGO_LIBDIR := $(shell pwd)/$(shell dirname "$(STATUSGO)")
export STATUSGO_LIBDIR
$(STATUSGO): | deps status-go-deps
# Rebuild libsds independently after platform switch cleanup deletes vendor/nim-sds/build.
$(NIMSDS_LIBFILE): | platform-cleanup
echo -e $(BUILD_MSG) "nim-sds"
$(STATUSGO_MAKE_PARAMS) $(MAKE) -C vendor/status-go build-libsds SHELL=/bin/sh $(HANDLE_OUTPUT)
$(STATUSGO): | deps status-go-deps $(NIMSDS_LIBFILE) platform-cleanup
echo -e $(BUILD_MSG) "status-go"
# FIXME: Nix shell usage breaks builds due to Glibc mismatch.
$(STATUSGO_MAKE_PARAMS) $(MAKE) -C vendor/status-go statusgo-shared-library SHELL=/bin/sh \
@@ -632,7 +651,7 @@ endif
QRCODEGEN := vendor/QR-Code-generator/c/libqrcodegen.a
$(QRCODEGEN): | deps
$(QRCODEGEN): | deps platform-cleanup
echo -e $(BUILD_MSG) "QR-Code-generator"
+ cd vendor/QR-Code-generator/c && \
$(MAKE) $(QRCODEGEN_MAKE_PARAMS) $(HANDLE_OUTPUT)
@@ -768,7 +787,11 @@ $(NIM_STATUS_CLIENT): NIM_PARAMS += $(RESOURCES_LAYOUT)
ifneq ($(mkspecs),win32)
$(NIM_STATUS_CLIENT): NIM_PARAMS += --passL:"$(QT_SEAQT_EXTRA_LIBS)"
endif
$(NIM_STATUS_CLIENT): $(NIM_SOURCES) | statusq dotherside check-qt-dir $(STATUSGO) $(STATUSKEYCARD_QT_LIB) $(QRCODEGEN) rcc deps
# Problem: libstatus present + libsds deleted -> make never re-entered status-go,
# so the client linked against a missing libsds and crashed in dyld at startup.
# Solution: depend on libsds directly (order-only) so it is restored even when
# libstatus is untouched.
$(NIM_STATUS_CLIENT): $(NIM_SOURCES) | statusq dotherside check-qt-dir $(STATUSGO) $(NIMSDS_LIBFILE) $(STATUSKEYCARD_QT_LIB) $(QRCODEGEN) rcc deps
echo -e $(BUILD_MSG) "$@"
$(ENV_SCRIPT) nim c $(NIM_PARAMS) \
--mm:orc \
+17 -4
View File
@@ -1,6 +1,8 @@
-include ./scripts/EnvVariables.mk
-include ./scripts/Common.mk
PLATFORM_TARGET := $(OS)-$(ARCH)
# FLAG_KEYCARD_ENABLED: Controls NFC/Keycard support
# - iOS: Default 1 (enabled) - Build with NFC support, works with free Apple Developer account
# - Android: Default 1 (enabled) - NFC support doesn't require paid account on Android
@@ -29,7 +31,8 @@ status-keycard-qt: clean-status-keycard-qt $(STATUS_KEYCARD_QT_LIB)
nim-status-client: clean-nim-status-client $(NIM_STATUS_CLIENT_LIB)
status-desktop-rcc: clean-status-desktop-rcc $(STATUS_DESKTOP_RCC)
$(STATUS_GO_LIB):
# Always delegate to status-go's PHONY sub-make (it owns incremental rebuild, see issue #18377), then copy only on change.
$(STATUS_GO_LIB): FORCE | platform-cleanup
@echo "Building status-go mobile library"
@mkdir -p $(LIB_PATH)
ifeq ($(OS),android)
@@ -47,12 +50,13 @@ else ifeq ($(OS),ios)
ARCH=$(ARCH) \
IPHONE_SDK="$(IPHONE_SDK)" \
IOS_TARGET="$(IOS_TARGET)" \
NIM_SDS_SOURCE_DIR="$(NIM_SDS_SOURCE_DIR)" \
USE_SYSTEM_NIM=$(USE_SYSTEM_NIM) \
SHELL=/bin/sh
endif
@echo "Copying library to mobile lib directory"
@cp $(NIM_SDS_SOURCE_DIR)/build/libsds$(LIB_EXT) $(LIB_PATH)/libsds$(LIB_EXT)
@cp ../vendor/status-go/build/bin/libstatus$(LIB_EXT) $(LIB_PATH)/libstatus$(LIB_EXT)
@cmp -s $(NIM_SDS_SOURCE_DIR)/build/libsds$(LIB_EXT) $(LIB_PATH)/libsds$(LIB_EXT) || cp $(NIM_SDS_SOURCE_DIR)/build/libsds$(LIB_EXT) $(LIB_PATH)/libsds$(LIB_EXT)
@cmp -s ../vendor/status-go/build/bin/libstatus$(LIB_EXT) $(LIB_PATH)/libstatus$(LIB_EXT) || cp ../vendor/status-go/build/bin/libstatus$(LIB_EXT) $(LIB_PATH)/libstatus$(LIB_EXT)
$(STATUS_GO_STUB_LIB): $(STATUS_GO_LIB)
@echo "Building status-go stub library (UI process)"
@@ -91,7 +95,7 @@ $(OPENSSL_LIB): $(OPENSSL_FILES)
@echo "Building OpenSSL"
@LIB_PATH=$(LIB_PATH) LIB_EXT=$(LIB_EXT) OPENSSL=$(OPENSSL) BUILD_DIR=$(BUILD_PATH) $(OPENSSL_SCRIPT) $(HANDLE_OUTPUT)
$(QRCODEGEN_LIB): $(QRCODEGEN_FILES)
$(QRCODEGEN_LIB): $(QRCODEGEN_FILES) | platform-cleanup
@echo "Building QRCodeGen"
@QRCODEGEN=$(QRCODEGEN) $(QRCODEGEN_SCRIPT) $(HANDLE_OUTPUT)
@echo "QRCodeGen built $(QRCODEGEN_LIB)"
@@ -151,6 +155,15 @@ endif
@echo "Built $(TARGET)"
# phony rules
# Order-only prerequisite: delete shared vendor artifacts (qrcodegen, nim-sds, libstatus) when the build platform/arch changes.
.PHONY: platform-cleanup FORCE
platform-cleanup:
@../scripts/platform_pre_build_cleanup.sh "$(PLATFORM_TARGET)"
# Empty target: anything depending on FORCE is always rebuilt.
FORCE:
.PHONY: makedir
makedir:
@mkdir -p $(BIN_PATH) $(LIB_PATH) $(BUILD_PATH)
+24
View File
@@ -0,0 +1,24 @@
#!/usr/bin/env bash
set -euo pipefail
# $1 = platform target: darwin-arm64 / ios-arm64 / android-arm64
KEY="${1:-}"
GIT_ROOT="$(cd "$(dirname "$0")/.." && pwd)"
STATE="$GIT_ROOT/.platform-target"
[ -n "$KEY" ] || { echo "platform_pre_build_cleanup: empty PLATFORM_TARGET" >&2; exit 1; }
PREV="$(cat "$STATE" 2>/dev/null || echo none)"
[ "$PREV" = "$KEY" ] && exit 0
echo "platform changed ($PREV -> $KEY); cleaning shared artifacts" >&2
# 1) qrcodegen (desktop links directly, mobile builds into the same tree)
make -C "$GIT_ROOT/vendor/QR-Code-generator/c" clean 2>/dev/null || true
# 2) nim-sds (shared libsds.* + nimcache)
rm -rf "$GIT_ROOT/vendor/nim-sds/build" 2>/dev/null || true
[ -n "${HOME:-}" ] && rm -rf "$HOME"/.cache/nim/libsds_* 2>/dev/null || true
# 3) libstatus.* (shared bin between make run and mobile-run)
rm -f "$GIT_ROOT"/vendor/status-go/build/bin/libstatus.* 2>/dev/null || true
echo "$KEY" > "$STATE"