2023-01-10 13:06:38 +00:00
|
|
|
.PHONY: nix-add-gcroots clean nix-clean run-metro test release _list _fix-node-perms _tmpdir-rm
|
2017-12-13 21:45:49 +00:00
|
|
|
|
2019-07-23 06:19:48 +00:00
|
|
|
help: SHELL := /bin/sh
|
2017-12-13 21:45:49 +00:00
|
|
|
help: ##@other Show this help
|
|
|
|
@perl -e '$(HELP_FUN)' $(MAKEFILE_LIST)
|
|
|
|
|
|
|
|
# This is a code for automatic help generator.
|
|
|
|
# It supports ANSI colors and categories.
|
|
|
|
# To add new item into help output, simply add comments
|
|
|
|
# starting with '##'. To add category, use @category.
|
|
|
|
GREEN := $(shell tput -Txterm setaf 2)
|
2019-02-01 10:44:51 +00:00
|
|
|
RED := $(shell tput -Txterm setaf 1)
|
2017-12-13 21:45:49 +00:00
|
|
|
WHITE := $(shell tput -Txterm setaf 7)
|
|
|
|
YELLOW := $(shell tput -Txterm setaf 3)
|
|
|
|
RESET := $(shell tput -Txterm sgr0)
|
|
|
|
HELP_FUN = \
|
2023-07-04 19:40:13 +00:00
|
|
|
%help; \
|
|
|
|
while(<>) { push @{$$help{$$2 // 'options'}}, [$$1, $$3] if /^([a-zA-Z\-]+)\s*:.*\#\#(?:@([a-zA-Z\-]+))?\s(.*)$$/ }; \
|
|
|
|
print "Usage: make [target]\n\nSee STARTING_GUIDE.md for more info.\n\n"; \
|
|
|
|
for (sort keys %help) { \
|
|
|
|
print "${WHITE}$$_:${RESET}\n"; \
|
|
|
|
for (@{$$help{$$_}}) { \
|
|
|
|
$$sep = " " x (32 - length $$_->[0]); \
|
|
|
|
print " ${YELLOW}$$_->[0]${RESET}$$sep${GREEN}$$_->[1]${RESET}\n"; \
|
|
|
|
}; \
|
|
|
|
print "\n"; \
|
|
|
|
}
|
2019-04-12 08:36:30 +00:00
|
|
|
HOST_OS := $(shell uname | tr '[:upper:]' '[:lower:]')
|
2017-12-13 21:45:49 +00:00
|
|
|
|
2019-10-09 15:37:58 +00:00
|
|
|
# This can come from Jenkins
|
|
|
|
ifndef BUILD_TAG
|
2019-10-23 10:36:27 +00:00
|
|
|
export BUILD_TAG := $(shell git rev-parse --short HEAD)
|
2019-10-09 15:37:58 +00:00
|
|
|
endif
|
|
|
|
|
2022-04-22 08:20:01 +00:00
|
|
|
# We don't want to use /run/user/$UID because it runs out of space too easilly.
|
2022-07-17 12:37:46 +00:00
|
|
|
export TMPDIR = /tmp/tmp-status-mobile-$(BUILD_TAG)
|
2022-04-22 08:20:01 +00:00
|
|
|
# This has to be specified for both the Node.JS server process and the Qt process.
|
2019-10-09 15:37:58 +00:00
|
|
|
export REACT_SERVER_PORT ?= 5001
|
2024-02-19 19:22:29 +00:00
|
|
|
# Default metro port used by scripts/run-android.sh.
|
|
|
|
export RCT_METRO_PORT ?= 8081
|
2022-08-31 23:30:35 +00:00
|
|
|
# Fix for ERR_OSSL_EVP_UNSUPPORTED error.
|
|
|
|
export NODE_OPTIONS += --openssl-legacy-provider
|
2022-04-22 08:20:01 +00:00
|
|
|
# The path can be anything, but home is usually safest.
|
|
|
|
export KEYSTORE_PATH ?= $(HOME)/.gradle/status-im.keystore
|
2019-04-05 17:22:49 +00:00
|
|
|
|
2019-11-19 11:17:39 +00:00
|
|
|
# Our custom config is located in nix/nix.conf
|
2023-06-15 17:00:53 +00:00
|
|
|
export NIX_USER_CONF_FILES = $(PWD)/nix/nix.conf
|
2020-06-19 13:43:58 +00:00
|
|
|
# Location of symlinks to derivations that should not be garbage collected
|
2024-02-07 10:44:43 +00:00
|
|
|
export _NIX_GCROOTS = ./.nix-gcroots
|
2019-11-19 11:17:39 +00:00
|
|
|
# Defines which variables will be kept for Nix pure shell, use semicolon as divider
|
2023-06-27 11:45:21 +00:00
|
|
|
export _NIX_KEEP ?= TMPDIR,BUILD_ENV,\
|
|
|
|
BUILD_TYPE,BUILD_NUMBER,COMMIT_HASH,\
|
|
|
|
ANDROID_GRADLE_OPTS,ANDROID_ABI_SPLIT,ANDROID_ABI_INCLUDE,\
|
|
|
|
STATUS_GO_SRC_OVERRIDE,STATUS_GO_IPFS_GATEWAY_URL
|
2019-11-19 11:17:39 +00:00
|
|
|
|
2022-11-20 23:46:04 +00:00
|
|
|
# Useful for Android release builds
|
2020-03-02 11:18:01 +00:00
|
|
|
TMP_BUILD_NUMBER := $(shell ./scripts/version/gen_build_no.sh | cut -c1-10)
|
|
|
|
|
2019-07-15 16:34:33 +00:00
|
|
|
#----------------
|
|
|
|
# Nix targets
|
|
|
|
#----------------
|
|
|
|
|
2021-11-05 12:59:33 +00:00
|
|
|
# WARNING: This has to be located right before all the targets.
|
2019-11-29 10:20:08 +00:00
|
|
|
SHELL := ./nix/scripts/shell.sh
|
2019-04-05 17:22:49 +00:00
|
|
|
|
2021-11-05 12:59:33 +00:00
|
|
|
shell: export TARGET ?= default
|
2019-07-23 06:19:48 +00:00
|
|
|
shell: ##@prepare Enter into a pre-configured shell
|
|
|
|
ifndef IN_NIX_SHELL
|
|
|
|
@ENTER_NIX_SHELL
|
|
|
|
else
|
|
|
|
@echo "${YELLOW}Nix shell is already active$(RESET)"
|
|
|
|
endif
|
|
|
|
|
2020-04-26 12:40:06 +00:00
|
|
|
nix-repl: SHELL := /bin/sh
|
|
|
|
nix-repl: ##@nix Start an interactive Nix REPL
|
|
|
|
nix repl default.nix
|
|
|
|
|
2020-06-19 13:43:58 +00:00
|
|
|
nix-gc-protected: SHELL := /bin/sh
|
|
|
|
nix-gc-protected:
|
|
|
|
@echo -e "$(YELLOW)The following paths are protected:$(RESET)" && \
|
|
|
|
ls -1 $(_NIX_GCROOTS) | sed 's/^/ - /'
|
|
|
|
|
2023-06-19 09:28:03 +00:00
|
|
|
nix-upgrade: SHELL := /bin/sh
|
|
|
|
nix-upgrade: ##@nix Upgrade Nix interpreter to current version.
|
|
|
|
nix/scripts/upgrade.sh
|
|
|
|
|
2020-06-19 13:43:58 +00:00
|
|
|
nix-gc: export TARGET := nix
|
|
|
|
nix-gc: nix-gc-protected ##@nix Garbage collect all packages older than 20 days from /nix/store
|
|
|
|
nix-store --gc
|
2019-11-29 10:20:08 +00:00
|
|
|
|
2020-04-21 10:29:54 +00:00
|
|
|
nix-clean: export TARGET := default
|
2022-07-17 12:37:46 +00:00
|
|
|
nix-clean: ##@nix Remove all status-mobile build artifacts from /nix/store
|
2019-11-29 10:20:08 +00:00
|
|
|
nix/scripts/clean.sh
|
2019-07-15 16:34:33 +00:00
|
|
|
|
|
|
|
nix-purge: SHELL := /bin/sh
|
2020-04-21 10:29:54 +00:00
|
|
|
nix-purge: ##@nix Completely remove Nix setup, including /nix directory
|
|
|
|
nix/scripts/purge.sh
|
2019-07-15 16:34:33 +00:00
|
|
|
|
2020-05-07 10:21:39 +00:00
|
|
|
nix-update-gradle: export TARGET := gradle
|
2019-07-15 16:34:33 +00:00
|
|
|
nix-update-gradle: ##@nix Update maven nix expressions based on current gradle setup
|
2020-05-07 10:21:39 +00:00
|
|
|
nix/deps/gradle/generate.sh
|
2019-07-15 16:34:33 +00:00
|
|
|
|
2019-09-07 12:57:22 +00:00
|
|
|
nix-update-clojure: export TARGET := clojure
|
2020-05-07 10:21:39 +00:00
|
|
|
nix-update-clojure: ##@nix Update maven Nix expressions based on current clojure setup
|
2019-09-07 12:57:22 +00:00
|
|
|
nix/deps/clojure/generate.sh
|
2019-07-15 16:34:33 +00:00
|
|
|
|
2023-10-17 08:37:35 +00:00
|
|
|
nix-update-gems: export TARGET := fastlane
|
2019-09-03 20:41:40 +00:00
|
|
|
nix-update-gems: ##@nix Update Ruby gems in fastlane/Gemfile.lock and fastlane/gemset.nix
|
2019-07-20 05:41:46 +00:00
|
|
|
fastlane/update.sh
|
|
|
|
|
2019-11-29 10:20:08 +00:00
|
|
|
nix-update-pods: export TARGET := ios
|
2019-10-07 13:13:12 +00:00
|
|
|
nix-update-pods: ##@nix Update CocoaPods in ios/Podfile.lock
|
|
|
|
cd ios && pod update
|
|
|
|
|
2019-07-23 06:19:48 +00:00
|
|
|
#----------------
|
|
|
|
# General targets
|
|
|
|
#----------------
|
2017-12-13 21:45:49 +00:00
|
|
|
|
2019-07-23 06:19:48 +00:00
|
|
|
_fix-node-perms: SHELL := /bin/sh
|
|
|
|
_fix-node-perms: ##@prepare Fix permissions so that directory can be cleaned
|
2019-06-04 16:50:29 +00:00
|
|
|
$(shell test -d node_modules && chmod -R 744 node_modules)
|
|
|
|
$(shell test -d node_modules.tmp && chmod -R 744 node_modules.tmp)
|
|
|
|
|
2023-01-10 13:06:38 +00:00
|
|
|
$(TMPDIR): SHELL := /bin/sh
|
|
|
|
$(TMPDIR): ##@prepare Create a TMPDIR for temporary files
|
2019-10-09 15:37:58 +00:00
|
|
|
@mkdir -p "$(TMPDIR)"
|
|
|
|
# Make sure TMPDIR exists every time make is called
|
2023-01-10 13:06:38 +00:00
|
|
|
_tmpdir-mk: $(TMPDIR)
|
2019-10-09 15:37:58 +00:00
|
|
|
-include _tmpdir-mk
|
|
|
|
|
|
|
|
_tmpdir-rm: SHELL := /bin/sh
|
|
|
|
_tmpdir-rm: ##@prepare Remove TMPDIR
|
|
|
|
rm -fr "$(TMPDIR)"
|
|
|
|
|
2022-03-01 09:06:05 +00:00
|
|
|
_install-hooks: SHELL := /bin/sh
|
|
|
|
_install-hooks: ##@prepare Create prepare-commit-msg git hook symlink
|
2022-03-14 09:29:13 +00:00
|
|
|
@ln -s -f ../../scripts/hooks/prepare-commit-msg .git/hooks
|
2022-03-01 09:06:05 +00:00
|
|
|
-include _install-hooks
|
|
|
|
|
2020-12-21 08:20:38 +00:00
|
|
|
# Remove directories and ignored files
|
2019-04-05 17:22:49 +00:00
|
|
|
clean: SHELL := /bin/sh
|
2019-10-09 15:37:58 +00:00
|
|
|
clean: _fix-node-perms _tmpdir-rm ##@prepare Remove all output folders
|
2020-12-21 08:20:38 +00:00
|
|
|
git clean -dXf
|
|
|
|
|
|
|
|
# Remove directories, ignored and non-ignored files
|
|
|
|
purge: SHELL := /bin/sh
|
|
|
|
purge: _fix-node-perms _tmpdir-rm ##@prepare Remove all output folders
|
2019-10-09 15:37:58 +00:00
|
|
|
git clean -dxf
|
2018-08-30 12:56:45 +00:00
|
|
|
|
2020-12-21 08:20:38 +00:00
|
|
|
|
2019-11-29 10:20:08 +00:00
|
|
|
watchman-clean: export TARGET := watchman
|
2019-11-13 13:12:02 +00:00
|
|
|
watchman-clean: ##@prepare Delete repo directory from watchman
|
2022-07-17 12:37:46 +00:00
|
|
|
watchman watch-del $${STATUS_MOBILE_HOME}
|
2019-03-25 16:35:01 +00:00
|
|
|
|
2019-11-29 10:20:08 +00:00
|
|
|
pod-install: export TARGET := ios
|
2019-09-30 11:43:29 +00:00
|
|
|
pod-install: ##@prepare Run 'pod install' to install podfiles and update Podfile.lock
|
|
|
|
cd ios && pod install; cd --
|
|
|
|
|
2024-02-02 14:53:40 +00:00
|
|
|
FLEETS_FILE := ./resources/config/fleets.json
|
2020-01-09 12:29:58 +00:00
|
|
|
update-fleets: ##@prepare Download up-to-date JSON file with current fleets state
|
|
|
|
curl -s https://fleets.status.im/ \
|
2022-12-09 07:30:42 +00:00
|
|
|
| sed 's/"warning": "/"warning": "DO NOT EDIT! /' \
|
2024-02-02 14:53:40 +00:00
|
|
|
> $(FLEETS_FILE)
|
|
|
|
echo >> $(FLEETS_FILE)
|
2020-01-09 12:29:58 +00:00
|
|
|
|
2022-04-22 08:20:01 +00:00
|
|
|
$(KEYSTORE_PATH): export TARGET := keytool
|
|
|
|
$(KEYSTORE_PATH):
|
2020-03-02 11:18:01 +00:00
|
|
|
@./scripts/generate-keystore.sh
|
|
|
|
|
2022-04-22 08:20:01 +00:00
|
|
|
keystore: $(KEYSTORE_PATH) ##@prepare Generate a Keystore for signing Android APKs
|
|
|
|
|
2021-03-03 16:01:54 +00:00
|
|
|
fdroid-max-watches: SHELL := /bin/sh
|
|
|
|
fdroid-max-watches: ##@prepare Bump max_user_watches to avoid ENOSPC errors
|
|
|
|
sysctl fs.inotify.max_user_watches=524288
|
|
|
|
|
|
|
|
fdroid-nix-dir: SHELL := /bin/sh
|
2021-02-25 10:45:33 +00:00
|
|
|
fdroid-nix-dir: ##@prepare Create /nix directory for F-Droid Vagrant builders
|
|
|
|
mkdir -m 0755 /nix
|
|
|
|
chown vagrant /nix
|
|
|
|
|
2021-06-08 07:48:11 +00:00
|
|
|
fdroid-fix-tmp: SHELL := /bin/sh
|
2021-06-10 13:53:31 +00:00
|
|
|
fdroid-fix-tmp: ##@prepare Fix TMPDIR permissions so Vagrant user is the owner
|
|
|
|
chown -R vagrant "$(TMPDIR)"
|
2021-06-08 07:48:11 +00:00
|
|
|
|
|
|
|
fdroid-build-env: fdroid-max-watches fdroid-nix-dir fdroid-fix-tmp ##@prepare Setup build environment for F-Droud build
|
2021-03-03 16:01:54 +00:00
|
|
|
|
2022-09-29 10:29:28 +00:00
|
|
|
fdroid-pr: export TARGET := android-sdk
|
2021-04-29 17:01:41 +00:00
|
|
|
fdroid-pr: ##@prepare Create F-Droid release PR
|
|
|
|
ifndef APK
|
|
|
|
$(error APK env var not defined)
|
|
|
|
endif
|
|
|
|
scripts/fdroid-pr.sh "$(APK)"
|
|
|
|
|
2021-05-12 09:07:35 +00:00
|
|
|
xcode-clean: SHELL := /bin/sh
|
|
|
|
xcode-clean: XCODE_HOME := $(HOME)/Library/Developer/Xcode
|
|
|
|
xcode-clean: ##@prepare Clean XCode derived data and archives
|
|
|
|
rm -fr $(XCODE_HOME)/DerivedData/StatusIm-* $(XCODE_HOME)/Archives/*/StatusIm*
|
|
|
|
|
2017-12-13 21:45:49 +00:00
|
|
|
#----------------
|
|
|
|
# Release builds
|
|
|
|
#----------------
|
2021-02-25 10:45:33 +00:00
|
|
|
release: release-android release-ios ##@build Build release for Android and iOS
|
2017-12-13 21:45:49 +00:00
|
|
|
|
2022-04-22 08:20:01 +00:00
|
|
|
build-fdroid: export BUILD_ENV = prod
|
|
|
|
build-fdroid: export BUILD_TYPE = release
|
|
|
|
build-fdroid: export ANDROID_ABI_SPLIT = false
|
|
|
|
build-fdroid: export ANDROID_ABI_INCLUDE = armeabi-v7a;arm64-v8a;x86;x86_64
|
|
|
|
build-fdroid: ##@build Build release for F-Droid
|
|
|
|
@scripts/build-android.sh
|
|
|
|
|
|
|
|
build-android: export BUILD_ENV ?= prod
|
|
|
|
build-android: export BUILD_TYPE ?= nightly
|
2024-02-15 08:18:11 +00:00
|
|
|
build-android: export ORG_GRADLE_PROJECT_versionCode ?= $(TMP_BUILD_NUMBER)
|
2022-04-22 08:20:01 +00:00
|
|
|
build-android: export ANDROID_ABI_SPLIT ?= false
|
|
|
|
build-android: export ANDROID_ABI_INCLUDE ?= armeabi-v7a;arm64-v8a;x86
|
|
|
|
build-android: ##@build Build unsigned Android APK
|
|
|
|
@scripts/build-android.sh
|
|
|
|
|
|
|
|
release-android: export TARGET := keytool
|
2020-03-02 11:18:01 +00:00
|
|
|
release-android: export KEYSTORE_PATH ?= $(HOME)/.gradle/status-im.keystore
|
2022-04-22 08:20:01 +00:00
|
|
|
release-android: keystore build-android ##@build Build signed Android APK
|
|
|
|
@scripts/sign-android.sh result/app-release-unsigned.apk
|
2017-12-13 21:45:49 +00:00
|
|
|
|
2020-05-07 10:21:39 +00:00
|
|
|
release-ios: export TARGET := ios
|
2023-08-29 13:18:14 +00:00
|
|
|
release-ios: export IOS_STATUS_GO_TARGETS := ios/arm64
|
2019-06-04 15:20:03 +00:00
|
|
|
release-ios: export BUILD_ENV ?= prod
|
2023-05-16 16:42:56 +00:00
|
|
|
release-ios: watchman-clean ios-clean jsbundle ##@build Build release for iOS release
|
|
|
|
xcodebuild \
|
|
|
|
-scheme StatusIm \
|
|
|
|
-configuration Release \
|
|
|
|
-workspace ios/StatusIm.xcworkspace \
|
|
|
|
-destination 'generic/platform=iOS' \
|
|
|
|
-UseModernBuildSystem=N clean archive
|
|
|
|
|
|
|
|
jsbundle: SHELL := /bin/sh
|
|
|
|
jsbundle: export BUILD_ENV ?= prod
|
|
|
|
jsbundle: ##@build Build JavaScript and Clojurescript bundle for iOS and Android
|
|
|
|
nix/scripts/build.sh targets.mobile.jsbundle
|
2018-09-13 09:44:33 +00:00
|
|
|
|
2020-04-23 18:19:12 +00:00
|
|
|
#--------------
|
|
|
|
# status-go lib
|
2020-05-14 11:58:05 +00:00
|
|
|
#--------------
|
2020-04-23 18:19:12 +00:00
|
|
|
|
|
|
|
status-go-android: SHELL := /bin/sh
|
|
|
|
status-go-android: ##@status-go Compile status-go for Android app
|
|
|
|
nix/scripts/build.sh targets.status-go.mobile.android
|
|
|
|
|
|
|
|
status-go-ios: SHELL := /bin/sh
|
|
|
|
status-go-ios: ##@status-go Compile status-go for iOS app
|
|
|
|
nix/scripts/build.sh targets.status-go.mobile.ios
|
|
|
|
|
2022-05-19 15:50:41 +00:00
|
|
|
status-go-library: SHELL := /bin/sh
|
|
|
|
status-go-library: ##@status-go Compile status-go for node-js
|
|
|
|
nix/scripts/build.sh targets.status-go.library
|
|
|
|
|
2017-12-13 21:45:49 +00:00
|
|
|
#--------------
|
2020-05-14 11:58:05 +00:00
|
|
|
# Watch, Build & Review changes
|
|
|
|
#--------------
|
|
|
|
|
2020-05-20 14:36:38 +00:00
|
|
|
run-clojure: export TARGET := clojure
|
2020-05-14 11:58:05 +00:00
|
|
|
run-clojure: ##@run Watch for and build Clojure changes for mobile
|
|
|
|
yarn shadow-cljs watch mobile
|
|
|
|
|
2023-12-18 08:33:24 +00:00
|
|
|
run-metro: export TARGET := clojure
|
2020-05-14 11:58:05 +00:00
|
|
|
run-metro: ##@run Start Metro to build React Native changes
|
2024-02-14 14:28:45 +00:00
|
|
|
@scripts/run-metro.sh
|
2019-04-05 17:22:49 +00:00
|
|
|
|
2020-05-14 11:58:05 +00:00
|
|
|
run-re-frisk: export TARGET := clojure
|
|
|
|
run-re-frisk: ##@run Start re-frisk server
|
|
|
|
yarn shadow-cljs run re-frisk-remote.core/start
|
2017-12-13 21:45:49 +00:00
|
|
|
|
2019-06-04 16:50:29 +00:00
|
|
|
# TODO: Migrate this to a Nix recipe, much the same way as nix/mobile/android/targets/release-android.nix
|
2020-04-01 07:52:57 +00:00
|
|
|
run-android: export TARGET := android
|
2024-02-01 15:26:18 +00:00
|
|
|
# Disabled for debug builds to avoid 'maximum call stack exceeded' errors.
|
|
|
|
# https://github.com/status-im/status-mobile/issues/18493
|
|
|
|
run-android: export ORG_GRADLE_PROJECT_hermesEnabled := false
|
2020-04-14 11:09:59 +00:00
|
|
|
run-android: ##@run Build Android APK and start it on the device
|
2024-02-14 14:28:45 +00:00
|
|
|
@scripts/run-android.sh
|
2019-02-01 10:44:51 +00:00
|
|
|
|
2023-11-06 18:25:06 +00:00
|
|
|
SIMULATOR=iPhone 13
|
2024-01-10 16:55:08 +00:00
|
|
|
# TODO: fix IOS_STATUS_GO_TARGETS to be either amd64 or arm64 when RN is upgraded
|
2019-11-29 10:20:08 +00:00
|
|
|
run-ios: export TARGET := ios
|
2024-01-11 09:27:28 +00:00
|
|
|
run-ios: export IOS_STATUS_GO_TARGETS := ios/arm64;iossimulator/amd64
|
2024-02-14 14:28:45 +00:00
|
|
|
run-ios: ##@run Build iOS app and start it in on the simulator
|
|
|
|
@scripts/run-ios.sh "${SIMULATOR}"
|
2017-12-13 21:45:49 +00:00
|
|
|
|
2023-04-19 10:50:26 +00:00
|
|
|
show-ios-devices: ##@other shows connected ios device and its name
|
|
|
|
xcrun xctrace list devices
|
|
|
|
|
2024-01-10 16:55:08 +00:00
|
|
|
# TODO: fix IOS_STATUS_GO_TARGETS to be either amd64 or arm64 when RN is upgraded
|
2023-04-19 10:50:26 +00:00
|
|
|
run-ios-device: export TARGET := ios
|
2024-01-11 09:27:28 +00:00
|
|
|
run-ios-device: export IOS_STATUS_GO_TARGETS := ios/arm64;iossimulator/amd64
|
2024-02-20 05:24:09 +00:00
|
|
|
run-ios-device: ##@run iOS app and start it on the first connected iPhone
|
|
|
|
@scripts/run-ios-device.sh
|
2023-04-19 10:50:26 +00:00
|
|
|
|
2017-12-23 09:36:25 +00:00
|
|
|
#--------------
|
|
|
|
# Tests
|
|
|
|
#--------------
|
|
|
|
|
2023-01-12 10:19:47 +00:00
|
|
|
# Get all clojure files, including untracked, excluding removed
|
|
|
|
define find_all_clojure_files
|
2024-01-09 12:19:30 +00:00
|
|
|
$$(comm -23 <(sort <(git ls-files --cached --others --exclude-standard)) <(sort <(git ls-files --deleted)) | grep -E '((\.clj-kondo\/status-im)|(src).*\.clj[sc]?$$)|((\.clj-kondo\/(status-im|config))|(src).*\.edn$$)|shadow-cljs\.edn')
|
2023-01-12 10:19:47 +00:00
|
|
|
endef
|
|
|
|
|
2023-06-20 10:07:46 +00:00
|
|
|
lint: export TARGET := clojure
|
2023-10-04 19:06:54 +00:00
|
|
|
lint: export CLJ_LINTER_PRINT_WARNINGS ?= false
|
2019-11-19 11:17:39 +00:00
|
|
|
lint: ##@test Run code style checks
|
2023-11-16 03:10:40 +00:00
|
|
|
@sh scripts/lint/re-frame-in-quo-components.sh && \
|
|
|
|
sh scripts/lint/direct-require-component-outside-quo.sh && \
|
|
|
|
sh scripts/lint/require-i18n-resource-first.sh && \
|
2023-10-04 19:06:54 +00:00
|
|
|
clj-kondo --config .clj-kondo/config.edn --cache false --fail-level error --lint src $(if $(filter $(CLJ_LINTER_PRINT_WARNINGS),true),,| grep -v ': warning: ') && \
|
2023-01-12 10:19:47 +00:00
|
|
|
ALL_CLOJURE_FILES=$(call find_all_clojure_files) && \
|
2023-11-16 03:10:40 +00:00
|
|
|
scripts/lint/translations.clj && \
|
2023-06-19 13:39:12 +00:00
|
|
|
zprint '{:search-config? true}' -sfc $$ALL_CLOJURE_FILES && \
|
2023-11-16 03:10:40 +00:00
|
|
|
sh scripts/lint/trailing-newline.sh && \
|
2023-10-17 18:05:58 +00:00
|
|
|
node_modules/.bin/prettier --write .
|
2019-11-19 11:17:39 +00:00
|
|
|
|
2023-01-12 10:19:47 +00:00
|
|
|
# NOTE: We run the linter twice because of https://github.com/kkinnear/zprint/issues/271
|
2023-06-20 10:07:46 +00:00
|
|
|
lint-fix: export TARGET := clojure
|
2020-01-06 11:45:15 +00:00
|
|
|
lint-fix: ##@test Run code style checks and fix issues
|
2023-01-12 10:19:47 +00:00
|
|
|
ALL_CLOJURE_FILES=$(call find_all_clojure_files) && \
|
|
|
|
zprint '{:search-config? true}' -sw $$ALL_CLOJURE_FILES && \
|
2023-06-19 13:39:12 +00:00
|
|
|
zprint '{:search-config? true}' -sw $$ALL_CLOJURE_FILES && \
|
2024-01-11 23:19:55 +00:00
|
|
|
clojure-lsp --ns-exclude-regex ".*/\.clj-kondo/.*|.*/src/status_im/core\.cljs|.*/src/test_helpers/component_tests_preload\.cljs$$" clean-ns && \
|
2023-11-16 03:10:40 +00:00
|
|
|
sh scripts/lint/trailing-newline.sh --fix && \
|
2023-10-17 18:05:58 +00:00
|
|
|
node_modules/.bin/prettier --write .
|
2022-12-20 13:57:49 +00:00
|
|
|
|
2022-05-27 08:35:43 +00:00
|
|
|
shadow-server: export TARGET := clojure
|
|
|
|
shadow-server:##@ Start shadow-cljs in server mode for watching
|
|
|
|
yarn shadow-cljs server
|
|
|
|
|
2024-01-05 18:47:03 +00:00
|
|
|
_test-clojure: export TARGET := clojure
|
|
|
|
_test-clojure: export WATCH ?= false
|
|
|
|
_test-clojure:
|
|
|
|
ifeq ($(WATCH), true)
|
|
|
|
yarn install && \
|
|
|
|
yarn shadow-cljs compile mocks && \
|
|
|
|
nodemon --exec "yarn shadow-cljs compile test && node --require ./test-resources/override.js $$SHADOW_OUTPUT_TO" -e cljs
|
|
|
|
else
|
|
|
|
yarn install && \
|
|
|
|
yarn shadow-cljs compile mocks && \
|
|
|
|
yarn shadow-cljs compile test && \
|
|
|
|
node --require ./test-resources/override.js "$$SHADOW_OUTPUT_TO"
|
|
|
|
endif
|
2022-05-27 08:35:43 +00:00
|
|
|
|
2024-01-05 18:47:03 +00:00
|
|
|
test: export SHADOW_OUTPUT_TO := target/test/test.js
|
|
|
|
test: export SHADOW_NS_REGEXP := .*-test$$
|
|
|
|
test: ##@test Run all Clojure tests
|
|
|
|
test: _test-clojure
|
2022-12-20 12:07:00 +00:00
|
|
|
|
2024-01-05 18:47:03 +00:00
|
|
|
test-watch-for-repl: export SHADOW_OUTPUT_TO := target/test/test.js
|
|
|
|
test-watch-for-repl: export SHADOW_NS_REGEXP := .*-test$$
|
|
|
|
test-watch-for-repl: ##@test Watch all Clojure tests and support REPL connections
|
2022-05-19 15:50:41 +00:00
|
|
|
yarn install
|
2024-01-05 18:47:03 +00:00
|
|
|
rm -f target/test/test.js
|
2019-09-07 12:57:22 +00:00
|
|
|
yarn shadow-cljs compile mocks && \
|
2024-01-05 18:47:03 +00:00
|
|
|
concurrently --kill-others --prefix-colors 'auto' --names 'build,repl' \
|
|
|
|
'yarn shadow-cljs watch test --verbose' \
|
|
|
|
"until [ -f $$SHADOW_OUTPUT_TO ] ; do sleep 1 ; done ; node --require ./test-resources/override.js $$SHADOW_OUTPUT_TO --repl"
|
|
|
|
|
|
|
|
test-unit: export SHADOW_OUTPUT_TO := target/unit_test/test.js
|
2024-02-09 17:10:09 +00:00
|
|
|
test-unit: export SHADOW_NS_REGEXP := ^(?!tests\.integration-test)(?!tests-im\.contract-test).*-test$$
|
2024-01-05 18:47:03 +00:00
|
|
|
test-unit: ##@test Run unit tests
|
|
|
|
test-unit: _test-clojure
|
|
|
|
|
|
|
|
test-integration: export SHADOW_OUTPUT_TO := target/integration_test/test.js
|
2024-02-09 17:10:09 +00:00
|
|
|
test-integration: export SHADOW_NS_REGEXP := ^tests\.integration-test.*$$
|
2024-01-05 18:47:03 +00:00
|
|
|
test-integration: ##@test Run integration tests
|
|
|
|
test-integration: _test-clojure
|
2017-12-23 09:36:25 +00:00
|
|
|
|
2024-02-09 17:10:09 +00:00
|
|
|
test-contract: export SHADOW_OUTPUT_TO := target/contract_test/test.js
|
|
|
|
test-contract: export SHADOW_NS_REGEXP := ^tests\.contract-test.*$$
|
|
|
|
test-contract: ##@test Run contract tests
|
|
|
|
test-contract: _test-clojure
|
|
|
|
|
2023-09-04 09:41:26 +00:00
|
|
|
android-test: jsbundle
|
|
|
|
android-test: export TARGET := android
|
|
|
|
android-test:
|
|
|
|
cd android && ./gradlew test
|
|
|
|
|
2022-11-23 13:59:18 +00:00
|
|
|
component-test-watch: export TARGET := clojure
|
2022-11-24 21:05:58 +00:00
|
|
|
component-test-watch: export COMPONENT_TEST := true
|
|
|
|
component-test-watch: export BABEL_ENV := test
|
Fix component tests, upgrade Jest & friends, and a few other goodies (#18276)
Fix all component tests after the latest RN upgrade.
Fixes https://github.com/status-im/status-mobile/issues/18157
Closes https://github.com/status-im/status-mobile/pull/18235
Dependency changes
- Upgraded Jest: from 26.6.3 to latest 29.7.0.
- Upgraded @testing-library/jest-native: from 5.3.0 to latest 5.4.3
- Upgraded @testing-library/react-native: from 11.5.4 to 12.4.2
- Removed explicit dependency on jest-circus, this is now the default test
runner.
- Removed explicit dependency on jest-environment-node. This is handled by the
package manager.
- Added jest-silent-reporter at version 0.5.0.
### Why component tests were failing?
Many tests were failing because we were using RN Testing Library (RNTL) in an
unreliable fashion. With the recent library upgrades, the unreliability was
excerbated. Other times, the tests were incorrectly arranging data.
### with-redefs does not work with async code
Generally speaking, with-redefs should not be used with async code, assume the
worst. The scope of the macro will cease to exist by the time the async code
runs. In many tests we were using with-redefs, then calling render, but for some
components that use use-effect, JS timers, animations, etc it's unreliable and
were the reason for failures.
It's easy to reproduce too:
```clojure
(defn foo []
:foo)
(foo)
;; => :foo
(with-redefs [foo (constantly :bar)]
(foo))
;; => :bar
(js/setTimeout
(fn []
(tap> [:calling-foo (foo)]))
100)
;; Taps [:calling-foo :foo]
;; As you would expect, when running without with-redefs, it prints :foo.
;; So far so good, but whatch what happens with async code:
(with-redefs [foo (constantly :bar)]
(js/setTimeout
(fn []
(tap> [:calling-foo (foo)]))
100))
;; Taps [:calling-foo :foo]
;; ====> PROBLEM: Taps :foo, not :bar as one might expect
```
### Not waiting on wait-for
When test-helpers.component/wait-for is used, subsequent assertions/etc should
be done after the promise returned by wait-for is resolved. But remember to not
perform side-effects inside the wait-for callback (check out the docs
https://callstack.github.io/react-native-testing-library/docs/api#waitfor).
Most, if not all of our usages of wait-for were not waiting.
#### Improvement 1 - Silence Jest on demand
If you need to re-run component tests frequently, you may want to reduce the
output verbosity. By passing JEST_USE_SILENT_REPORTER=true to make
component-test or make component-test-watch you will see a lot less noise and be
able to focus on what really matters to you.
#### Improvement 2 - Selectively focus/disable tests
Because of our need to first compile CLJS to JS before running tests via Jest,
we couldn't easily skip or focus on specific tests. From this commit onwards, we
should never again have to change the list of requires in files core_spec.cljs.
Commenting out required namespaces gives a bad DX because it causes constant
rebasing issues.
#### Improvement 3 - Translations now work as in prod code (but only English)
Translations performed by *-by-translation-text can be done now without any
workaround under the hood. The query functions are now linted just like
i18n/label, which means static translation keywords must be qualified with :t/,
which is good for consistency.
2023-12-26 14:58:23 +00:00
|
|
|
component-test-watch: export JEST_USE_SILENT_REPORTER := false
|
2022-11-23 13:59:18 +00:00
|
|
|
component-test-watch: ##@ Watch tests and re-run no changes to cljs files
|
2024-01-16 18:00:42 +00:00
|
|
|
@scripts/check-metro-shadow-process.sh
|
2023-09-26 11:49:24 +00:00
|
|
|
rm -rf ./component-spec
|
2023-12-11 15:52:23 +00:00
|
|
|
nodemon --exec 'yarn shadow-cljs compile component-test && jest --config=test/jest/jest.config.js --testEnvironment node ' -e cljs
|
2022-11-23 13:59:18 +00:00
|
|
|
|
|
|
|
component-test: export TARGET := clojure
|
|
|
|
component-test: export COMPONENT_TEST := true
|
|
|
|
component-test: export BABEL_ENV := test
|
Fix component tests, upgrade Jest & friends, and a few other goodies (#18276)
Fix all component tests after the latest RN upgrade.
Fixes https://github.com/status-im/status-mobile/issues/18157
Closes https://github.com/status-im/status-mobile/pull/18235
Dependency changes
- Upgraded Jest: from 26.6.3 to latest 29.7.0.
- Upgraded @testing-library/jest-native: from 5.3.0 to latest 5.4.3
- Upgraded @testing-library/react-native: from 11.5.4 to 12.4.2
- Removed explicit dependency on jest-circus, this is now the default test
runner.
- Removed explicit dependency on jest-environment-node. This is handled by the
package manager.
- Added jest-silent-reporter at version 0.5.0.
### Why component tests were failing?
Many tests were failing because we were using RN Testing Library (RNTL) in an
unreliable fashion. With the recent library upgrades, the unreliability was
excerbated. Other times, the tests were incorrectly arranging data.
### with-redefs does not work with async code
Generally speaking, with-redefs should not be used with async code, assume the
worst. The scope of the macro will cease to exist by the time the async code
runs. In many tests we were using with-redefs, then calling render, but for some
components that use use-effect, JS timers, animations, etc it's unreliable and
were the reason for failures.
It's easy to reproduce too:
```clojure
(defn foo []
:foo)
(foo)
;; => :foo
(with-redefs [foo (constantly :bar)]
(foo))
;; => :bar
(js/setTimeout
(fn []
(tap> [:calling-foo (foo)]))
100)
;; Taps [:calling-foo :foo]
;; As you would expect, when running without with-redefs, it prints :foo.
;; So far so good, but whatch what happens with async code:
(with-redefs [foo (constantly :bar)]
(js/setTimeout
(fn []
(tap> [:calling-foo (foo)]))
100))
;; Taps [:calling-foo :foo]
;; ====> PROBLEM: Taps :foo, not :bar as one might expect
```
### Not waiting on wait-for
When test-helpers.component/wait-for is used, subsequent assertions/etc should
be done after the promise returned by wait-for is resolved. But remember to not
perform side-effects inside the wait-for callback (check out the docs
https://callstack.github.io/react-native-testing-library/docs/api#waitfor).
Most, if not all of our usages of wait-for were not waiting.
#### Improvement 1 - Silence Jest on demand
If you need to re-run component tests frequently, you may want to reduce the
output verbosity. By passing JEST_USE_SILENT_REPORTER=true to make
component-test or make component-test-watch you will see a lot less noise and be
able to focus on what really matters to you.
#### Improvement 2 - Selectively focus/disable tests
Because of our need to first compile CLJS to JS before running tests via Jest,
we couldn't easily skip or focus on specific tests. From this commit onwards, we
should never again have to change the list of requires in files core_spec.cljs.
Commenting out required namespaces gives a bad DX because it causes constant
rebasing issues.
#### Improvement 3 - Translations now work as in prod code (but only English)
Translations performed by *-by-translation-text can be done now without any
workaround under the hood. The query functions are now linted just like
i18n/label, which means static translation keywords must be qualified with :t/,
which is good for consistency.
2023-12-26 14:58:23 +00:00
|
|
|
component-test: export JEST_USE_SILENT_REPORTER := false
|
2023-02-21 05:42:33 +00:00
|
|
|
component-test: ##@test Run component tests once in NodeJS
|
2023-10-26 17:54:23 +00:00
|
|
|
@scripts/check-metro-shadow-process.sh
|
2023-09-26 11:49:24 +00:00
|
|
|
rm -rf ./component-spec
|
2022-11-23 13:59:18 +00:00
|
|
|
yarn shadow-cljs compile component-test && \
|
2023-12-11 15:52:23 +00:00
|
|
|
jest --clearCache && jest --config=test/jest/jest.config.js --testEnvironment node
|
2022-11-23 13:59:18 +00:00
|
|
|
|
2023-05-16 16:42:56 +00:00
|
|
|
#--------------
|
2017-12-13 21:45:49 +00:00
|
|
|
# Other
|
|
|
|
#--------------
|
2020-05-14 11:58:05 +00:00
|
|
|
|
2022-09-29 10:29:28 +00:00
|
|
|
geth-connect: export TARGET := android-sdk
|
2019-04-05 17:22:49 +00:00
|
|
|
geth-connect: ##@other Connect to Geth on the device
|
|
|
|
adb forward tcp:8545 tcp:8545 && \
|
2017-12-13 21:45:49 +00:00
|
|
|
build/bin/geth attach http://localhost:8545
|
|
|
|
|
2023-05-16 16:42:56 +00:00
|
|
|
ios-clean: SHELL := /bin/sh
|
|
|
|
ios-clean: ##@prepare Clean iOS build artifacts
|
|
|
|
git clean -dxf -f target/ios
|
|
|
|
|
2020-05-14 11:58:05 +00:00
|
|
|
android-clean: export TARGET := gradle
|
2019-08-22 16:36:59 +00:00
|
|
|
android-clean: ##@prepare Clean Gradle state
|
2020-05-14 11:58:05 +00:00
|
|
|
git clean -dxf -f ./android/app/build; \
|
2020-04-21 10:06:40 +00:00
|
|
|
[[ -d android/.gradle ]] && cd android && ./gradlew clean
|
2019-08-22 16:36:59 +00:00
|
|
|
|
2022-09-29 10:29:28 +00:00
|
|
|
android-ports: export TARGET := android-sdk
|
2019-04-05 17:22:49 +00:00
|
|
|
android-ports: ##@other Add proxies to Android Device/Simulator
|
|
|
|
adb reverse tcp:8081 tcp:8081 && \
|
|
|
|
adb reverse tcp:3449 tcp:3449 && \
|
|
|
|
adb reverse tcp:4567 tcp:4567 && \
|
2018-09-30 06:22:33 +00:00
|
|
|
adb forward tcp:5561 tcp:5561
|
2018-04-10 08:29:18 +00:00
|
|
|
|
2022-09-29 10:29:28 +00:00
|
|
|
android-devices: export TARGET := android-sdk
|
2019-11-20 16:25:22 +00:00
|
|
|
android-devices: ##@other Invoke adb devices
|
|
|
|
adb devices
|
|
|
|
|
2022-09-29 10:29:28 +00:00
|
|
|
android-logcat: export TARGET := android-sdk
|
2022-07-17 12:37:46 +00:00
|
|
|
android-logcat: ##@other Read status-mobile logs from Android phone using adb
|
2019-12-06 09:53:09 +00:00
|
|
|
adb logcat | grep -e RNBootstrap -e ReactNativeJS -e ReactNative -e StatusModule -e StatusNativeLogs -e 'F DEBUG :' -e 'Go :' -e 'GoLog :' -e 'libc :'
|
2018-03-13 11:55:42 +00:00
|
|
|
|
2022-09-29 10:29:28 +00:00
|
|
|
android-install: export TARGET := android-sdk
|
2019-06-04 16:50:29 +00:00
|
|
|
android-install: export BUILD_TYPE ?= release
|
2020-04-21 10:06:40 +00:00
|
|
|
android-install: ##@other Install APK on device using adb
|
2019-10-22 11:56:13 +00:00
|
|
|
adb install result/app-$(BUILD_TYPE).apk
|
2019-06-04 16:50:29 +00:00
|
|
|
|
2019-04-05 17:22:49 +00:00
|
|
|
_list: SHELL := /bin/sh
|
2019-01-29 18:46:11 +00:00
|
|
|
_list:
|
|
|
|
@$(MAKE) -pRrq -f $(lastword $(MAKEFILE_LIST)) : 2>/dev/null | awk -v RS= -F: '/^# File/,/^# Finished Make data base/ {if ($$1 !~ "^[#.]") {print $$1}}' | sort | egrep -v -e '^[^[:alnum:]]' -e '^$@$$'
|
|
|
|
|
2020-05-14 11:58:05 +00:00
|
|
|
#--------------
|
|
|
|
# REPLs
|
|
|
|
#--------------
|
2020-05-05 08:46:19 +00:00
|
|
|
|
2020-05-14 11:58:05 +00:00
|
|
|
repl-clojure: export TARGET := clojure
|
|
|
|
repl-clojure: ##@repl Start Clojure repl for mobile App
|
|
|
|
yarn shadow-cljs cljs-repl mobile
|
2020-05-05 08:46:19 +00:00
|
|
|
|
2020-05-14 11:58:05 +00:00
|
|
|
repl-nix: nix-repl ##@repl Start an interactive Nix REPL
|
2024-02-06 17:59:35 +00:00
|
|
|
|
|
|
|
#--------------
|
|
|
|
# Dev Automation Flows
|
|
|
|
#--------------
|
|
|
|
|
|
|
|
auto-login: export TARGET := default
|
|
|
|
auto-login: ##@auto runs flow for login or onboarding app on simulator/emulator
|
|
|
|
maestro test "maestro/create-account-or-login.yaml"
|
|
|
|
|
|
|
|
auto-custom: export TARGET := default
|
|
|
|
auto-custom: ##@auto runs any custom maestro automation flow on simulator/emulator
|
|
|
|
ifndef FLOW
|
|
|
|
$(error Usage: make automate FLOW=your-maestro-flow-file.yaml)
|
|
|
|
endif
|
|
|
|
maestro test "$(FLOW)"
|