2022-11-30 21:02:39 +01:00
# Copyright (c) 2022 Status Research & Development GmbH. Licensed under
2020-04-30 17:51:30 +02:00
# either of:
# - Apache License, version 2.0
# - MIT license
# at your option. This file may not be copied, modified, or distributed except
# according to those terms.
BUILD_SYSTEM_DIR := vendor/nimbus-build-system
2022-01-24 12:48:06 +01:00
EXCLUDED_NIM_PACKAGES := vendor/nim-dnsdisc/vendor
2021-06-15 09:51:09 +02:00
LINK_PCRE := 0
2023-05-23 10:44:57 +02:00
LOG_LEVEL := TRACE
2021-06-15 09:51:09 +02:00
2020-04-30 17:51:30 +02:00
# we don't want an error here, so we can handle things later, in the ".DEFAULT" target
-include $( BUILD_SYSTEM_DIR ) /makefiles/variables.mk
2020-04-29 12:49:27 +08:00
2020-04-29 13:54:03 +08:00
2020-04-30 17:51:30 +02:00
ifeq ( $( NIM_PARAMS ) ,)
# "variables.mk" was not included, so we update the submodules.
GIT_SUBMODULE_UPDATE := git submodule update --init --recursive
.DEFAULT :
+@ echo -e "Git submodules not found. Running ' $( GIT_SUBMODULE_UPDATE) '.\n" ; \
$( GIT_SUBMODULE_UPDATE) ; \
echo
# Now that the included *.mk files appeared, and are newer than this file, Make will restart itself:
# https://www.gnu.org/software/make/manual/make.html#Remaking-Makefiles
#
# After restarting, it will execute its original goal, so we don't have to start a child Make here
# with "$(MAKE) $(MAKECMDGOALS)". Isn't hidden control flow great?
2020-05-01 13:00:00 +08:00
2020-04-30 17:51:30 +02:00
else # "variables.mk" was included. Business as usual until the end of this file.
2024-05-21 21:00:22 -04:00
ifeq ( $( OS ) ,Windows_NT) # is Windows_NT on XP, 2000, 7, Vista, 10...
detected_OS := Windows
else
detected_OS := $( strip $( shell uname))
endif
2022-11-30 21:02:39 +01:00
##########
## Main ##
##########
2023-08-09 18:11:50 +01:00
.PHONY : all test update clean
2022-11-30 21:02:39 +01:00
2020-04-30 17:51:30 +02:00
# default target, because it's the first one that doesn't start with '.'
2023-09-25 08:15:43 +02:00
all : | wakunode 2 example 2 chat 2 chat 2bridge libwaku
2021-06-23 19:14:37 +02:00
2023-08-09 18:11:50 +01:00
test : | testcommon testwaku
2022-11-30 21:02:39 +01:00
waku.nims :
ln -s waku.nimble $@
update : | update -common
rm -rf waku.nims && \
$( MAKE) waku.nims $( HANDLE_OUTPUT)
clean :
rm -rf build
2020-04-30 17:51:30 +02:00
# must be included after the default target
-include $( BUILD_SYSTEM_DIR ) /makefiles/targets.mk
2023-04-25 17:54:28 +02:00
## Possible values: prod; debug
TARGET ?= prod
2022-11-07 09:14:21 +01:00
2022-11-30 21:02:39 +01:00
## Git version
GIT_VERSION ?= $( shell git describe --abbrev= 6 --always --tags)
2024-02-23 16:25:13 +02:00
## Compilation parameters. If defined in the CLI the assignments won't be executed
2022-11-30 21:02:39 +01:00
NIM_PARAMS := $( NIM_PARAMS) -d:git_version= \" $( GIT_VERSION) \"
2023-04-25 17:54:28 +02:00
## Heaptracker options
HEAPTRACKER ?= 0
HEAPTRACKER_INJECT ?= 0
ifeq ( $( HEAPTRACKER ) , 1)
# Needed to make nimbus-build-system use the Nim's 'heaptrack_support' branch
DOCKER_NIM_COMMIT := NIM_COMMIT = heaptrack_support
TARGET := debug
ifeq ( $( HEAPTRACKER_INJECT ) , 1)
# the Nim compiler will load 'libheaptrack_inject.so'
HEAPTRACK_PARAMS := -d:heaptracker -d:heaptracker_inject
else
# the Nim compiler will load 'libheaptrack_preload.so'
HEAPTRACK_PARAMS := -d:heaptracker
endif
endif
## end of Heaptracker options
2022-11-30 21:02:39 +01:00
##################
## Dependencies ##
##################
.PHONY : deps libbacktrace
2024-02-22 16:59:13 +05:30
rustup :
ifeq (, $( shell which cargo ) )
# Install Rustup if it's not installed
# -y: Assume "yes" for all prompts
# --default-toolchain stable: Install the stable toolchain
curl https://sh.rustup.rs -sSf | sh -s -- -y --default-toolchain stable
endif
anvil : rustup
ifeq (, $( shell which anvil ) )
# Install Anvil if it's not installed
./scripts/install_anvil.sh
endif
2022-11-30 21:02:39 +01:00
deps : | deps -common nat -libs waku .nims
### nim-libbacktrace
2022-11-07 09:14:21 +01:00
2020-04-30 17:51:30 +02:00
# "-d:release" implies "--stacktrace:off" and it cannot be added to config.nims
ifeq ( $( USE_LIBBACKTRACE ) , 0)
NIM_PARAMS := $( NIM_PARAMS) -d:debug -d:disable_libbacktrace
else
NIM_PARAMS := $( NIM_PARAMS) -d:release
endif
2022-11-07 09:14:21 +01:00
libbacktrace :
+ $( MAKE) -C vendor/nim-libbacktrace --no-print-directory BUILD_CXX_LIB = 0
2022-11-30 21:02:39 +01:00
clean-libbacktrace :
+ $( MAKE) -C vendor/nim-libbacktrace clean $( HANDLE_OUTPUT)
2022-11-07 09:14:21 +01:00
2022-11-30 21:02:39 +01:00
# Extend deps and clean targets
2022-11-07 09:14:21 +01:00
ifneq ( $( USE_LIBBACKTRACE ) , 0)
deps : | libbacktrace
endif
2023-09-13 12:45:55 +02:00
ifeq ( $( POSTGRES ) , 1)
NIM_PARAMS := $( NIM_PARAMS) -d:postgres -d:nimDebugDlOpen
endif
2024-06-26 14:25:58 +02:00
ifeq ( $( DEBUG_DISCV 5) , 1)
NIM_PARAMS := $( NIM_PARAMS) -d:debugDiscv5
endif
2022-11-30 21:02:39 +01:00
clean : | clean -libbacktrace
2022-11-07 09:14:21 +01:00
2022-11-30 21:02:39 +01:00
##################
2023-09-11 12:02:31 +05:30
## RLN ##
2022-11-30 21:02:39 +01:00
##################
2024-06-20 15:05:21 +05:30
.PHONY : librln
2022-11-30 21:02:39 +01:00
2023-09-01 16:50:55 +05:30
LIBRLN_BUILDDIR := $( CURDIR) /vendor/zerokit
2024-06-20 15:05:21 +05:30
LIBRLN_VERSION := v0.5.1
2022-11-30 21:02:39 +01:00
ifeq ( $( OS ) ,Windows_NT)
2022-12-06 00:33:03 +01:00
LIBRLN_FILE := rln.lib
2022-11-30 21:02:39 +01:00
else
2023-09-18 10:56:58 +05:30
LIBRLN_FILE := librln_$( LIBRLN_VERSION) .a
2022-11-30 21:02:39 +01:00
endif
2023-08-30 00:22:22 +05:30
$(LIBRLN_FILE) :
2022-11-30 21:02:39 +01:00
echo -e $( BUILD_MSG) " $@ " && \
2023-09-18 10:56:58 +05:30
./scripts/build_rln.sh $( LIBRLN_BUILDDIR) $( LIBRLN_VERSION) $( LIBRLN_FILE)
2022-11-30 21:02:39 +01:00
2024-06-20 15:05:21 +05:30
librln : | $( LIBRLN_FILE )
2024-05-21 21:00:22 -04:00
$( eval NIM_PARAMS += --passL:$( LIBRLN_FILE) --passL:-lm)
2022-11-30 21:02:39 +01:00
clean-librln :
cargo clean --manifest-path vendor/zerokit/rln/Cargo.toml
2023-08-30 00:22:22 +05:30
rm -f $( LIBRLN_FILE)
2022-11-30 21:02:39 +01:00
# Extend clean target
clean : | clean -librln
2022-11-07 09:14:21 +01:00
2023-03-31 15:24:04 +02:00
#################
## Waku Common ##
#################
.PHONY : testcommon
testcommon : | build deps
echo -e $( BUILD_MSG) "build/ $@ " && \
$( ENV_SCRIPT) nim testcommon $( NIM_PARAMS) waku.nims
2023-08-09 18:11:50 +01:00
##########
## Waku ##
##########
2024-07-17 15:21:37 +02:00
.PHONY : testwaku wakunode 2 testwakunode 2 example 2 chat 2 chat 2bridge liteprotocoltester
2022-11-30 21:02:39 +01:00
2024-02-22 16:59:13 +05:30
# install anvil only for the testwaku target
testwaku : | build deps anvil librln
2022-11-30 21:02:39 +01:00
echo -e $( BUILD_MSG) "build/ $@ " && \
2023-09-11 12:02:31 +05:30
$( ENV_SCRIPT) nim test -d:os= $( shell uname) $( NIM_PARAMS) waku.nims
2022-11-30 21:02:39 +01:00
wakunode2 : | build deps librln
echo -e $( BUILD_MSG) "build/ $@ " && \
2023-09-11 12:02:31 +05:30
$( ENV_SCRIPT) nim wakunode2 $( NIM_PARAMS) waku.nims
2022-11-30 21:02:39 +01:00
2024-02-09 17:06:25 +01:00
benchmarks : | build deps librln
echo -e $( BUILD_MSG) "build/ $@ " && \
$( ENV_SCRIPT) nim benchmarks $( NIM_PARAMS) waku.nims
2023-04-25 15:34:57 +02:00
testwakunode2 : | build deps librln
echo -e $( BUILD_MSG) "build/ $@ " && \
2023-09-11 12:02:31 +05:30
$( ENV_SCRIPT) nim testwakunode2 $( NIM_PARAMS) waku.nims
2023-04-25 15:34:57 +02:00
2023-09-11 12:02:31 +05:30
example2 : | build deps librln
2022-11-30 21:02:39 +01:00
echo -e $( BUILD_MSG) "build/ $@ " && \
$( ENV_SCRIPT) nim example2 $( NIM_PARAMS) waku.nims
chat2 : | build deps librln
echo -e $( BUILD_MSG) "build/ $@ " && \
2023-09-11 12:02:31 +05:30
$( ENV_SCRIPT) nim chat2 $( NIM_PARAMS) waku.nims
2022-11-30 21:02:39 +01:00
2023-09-11 12:02:31 +05:30
rln-db-inspector : | build deps librln
2023-09-07 18:15:25 +05:30
echo -e $( BUILD_MSG) "build/ $@ " && \
2023-09-11 12:02:31 +05:30
$( ENV_SCRIPT) nim rln_db_inspector $( NIM_PARAMS) waku.nims
2023-09-07 18:15:25 +05:30
2023-09-11 12:02:31 +05:30
chat2bridge : | build deps librln
2022-11-30 21:02:39 +01:00
echo -e $( BUILD_MSG) "build/ $@ " && \
$( ENV_SCRIPT) nim chat2bridge $( NIM_PARAMS) waku.nims
2024-05-21 23:03:33 +02:00
liteprotocoltester : | build deps librln
echo -e $( BUILD_MSG) "build/ $@ " && \
$( ENV_SCRIPT) nim liteprotocoltester $( NIM_PARAMS) waku.nims
2024-07-17 15:21:37 +02:00
build/% : | build deps librln
echo -e $( BUILD_MSG) "build/ $* " && \
$( ENV_SCRIPT) nim buildone $( NIM_PARAMS) waku.nims $*
test/% : | build deps librln
echo -e $( BUILD_MSG) "test/ $* " && \
$( ENV_SCRIPT) nim testone $( NIM_PARAMS) waku.nims $*
2022-11-30 21:02:39 +01:00
2023-08-09 18:11:50 +01:00
################
## Waku tools ##
################
2023-04-12 10:22:45 +02:00
.PHONY : tools wakucanary networkmonitor
tools : networkmonitor wakucanary
2022-11-30 21:02:39 +01:00
2023-09-11 12:02:31 +05:30
wakucanary : | build deps librln
2022-11-30 21:02:39 +01:00
echo -e $( BUILD_MSG) "build/ $@ " && \
$( ENV_SCRIPT) nim wakucanary $( NIM_PARAMS) waku.nims
2023-09-11 12:02:31 +05:30
networkmonitor : | build deps librln
2022-11-30 21:02:39 +01:00
echo -e $( BUILD_MSG) "build/ $@ " && \
$( ENV_SCRIPT) nim networkmonitor $( NIM_PARAMS) waku.nims
###################
## Documentation ##
###################
2024-01-30 19:55:26 +08:00
.PHONY : docs coverage
2022-11-07 09:14:21 +01:00
2022-11-30 21:02:39 +01:00
# TODO: Remove unused target
2022-11-07 09:14:21 +01:00
docs : | build deps
echo -e $( BUILD_MSG) "build/ $@ " && \
2022-12-12 16:52:46 +05:30
$( ENV_SCRIPT) nim doc --run --index:on --project --out:.gh-pages waku/waku.nim waku.nims
2022-11-07 09:14:21 +01:00
2024-01-30 19:55:26 +08:00
coverage :
echo -e $( BUILD_MSG) "build/ $@ " && \
$( ENV_SCRIPT) ./scripts/run_cov.sh -y
2022-11-07 09:14:21 +01:00
2022-11-30 21:02:39 +01:00
#####################
## Container image ##
#####################
# -d:insecure - Necessary to enable Prometheus HTTP endpoint for metrics
# -d:chronicles_colors:none - Necessary to disable colors in logs for Docker
2023-09-13 12:45:55 +02:00
DOCKER_IMAGE_NIMFLAGS ?= -d:chronicles_colors:none -d:insecure -d:postgres
2023-04-25 17:54:28 +02:00
DOCKER_IMAGE_NIMFLAGS := $( DOCKER_IMAGE_NIMFLAGS) $( HEAPTRACK_PARAMS)
2020-04-30 17:51:30 +02:00
2020-05-26 14:04:40 +02:00
# build a docker image for the fleet
2022-11-30 21:02:39 +01:00
docker-image : MAKE_TARGET ?= wakunode 2
2023-03-17 15:04:26 +01:00
docker-image : DOCKER_IMAGE_TAG ?= $( MAKE_TARGET ) -$( GIT_VERSION )
2023-09-26 12:09:20 +02:00
docker-image : DOCKER_IMAGE_NAME ?= wakuorg /nwaku :$( DOCKER_IMAGE_TAG )
2020-05-26 14:04:40 +02:00
docker-image :
docker build \
2020-09-09 20:14:07 +02:00
--build-arg= "MAKE_TARGET= $( MAKE_TARGET) " \
2022-05-17 21:11:07 +02:00
--build-arg= "NIMFLAGS= $( DOCKER_IMAGE_NIMFLAGS) " \
2023-04-25 17:54:28 +02:00
--build-arg= "NIM_COMMIT= $( DOCKER_NIM_COMMIT) " \
2023-05-23 10:44:57 +02:00
--build-arg= "LOG_LEVEL= $( LOG_LEVEL) " \
2024-02-27 14:13:52 +01:00
--label= "commit= $( shell git rev-parse HEAD) " \
--label= "version= $( GIT_VERSION) " \
2023-04-25 17:54:28 +02:00
--target $( TARGET) \
2020-05-26 14:04:40 +02:00
--tag $( DOCKER_IMAGE_NAME) .
docker-push :
docker push $( DOCKER_IMAGE_NAME)
2022-11-07 09:14:21 +01:00
2023-05-12 18:08:41 +02:00
################
## C Bindings ##
################
2023-05-19 08:20:12 +02:00
.PHONY : cbindings cwaku_example libwaku
2023-05-12 18:08:41 +02:00
2023-05-19 08:20:12 +02:00
STATIC ?= false
2021-06-13 20:50:10 +08:00
2023-09-19 17:01:32 +02:00
libwaku : | build deps librln
2023-05-19 08:20:12 +02:00
rm -f build/libwaku*
ifeq ( $( STATIC ) , true)
echo -e $( BUILD_MSG ) "build/$@.a" && \
2023-09-11 12:02:31 +05:30
$( ENV_SCRIPT ) nim libwakuStatic $( NIM_PARAMS ) waku.nims
2023-05-19 08:20:12 +02:00
else
echo -e $( BUILD_MSG ) "build/$@.so" && \
2023-09-11 12:02:31 +05:30
$( ENV_SCRIPT ) nim libwakuDynamic $( NIM_PARAMS ) waku.nims
2023-05-19 08:20:12 +02:00
endif
2022-11-30 21:02:39 +01:00
2024-05-21 21:00:22 -04:00
#####################
## Mobile Bindings ##
#####################
.PHONY : libwaku -android \
libwaku -android -precheck \
libwaku -android -arm 64 \
libwaku -android -amd 64 \
libwaku -android -x 86 \
libwaku -android -arm \
rebuild -nat -libs \
build -libwaku -for -android -arch
ANDROID_TARGET ?= 30
ifeq ( $( detected_OS ) ,Darwin)
ANDROID_TOOLCHAIN_DIR := $( ANDROID_NDK_HOME) /toolchains/llvm/prebuilt/darwin-x86_64
else
ANDROID_TOOLCHAIN_DIR := $( ANDROID_NDK_HOME) /toolchains/llvm/prebuilt/linux-x86_64
endif
rebuild-nat-libs : | clean -cross nat -libs
2024-06-20 15:05:21 +05:30
libwaku-android-precheck :
2024-05-21 21:00:22 -04:00
ifndef ANDROID_NDK_HOME
$( error ANDROID_NDK_HOME is not set )
endif
build-libwaku-for-android-arch :
$( MAKE) rebuild-nat-libs CC = $( ANDROID_TOOLCHAIN_DIR) /bin/$( ANDROID_COMPILER) && \
./scripts/build_rln_android.sh $( CURDIR) /build $( LIBRLN_BUILDDIR) $( LIBRLN_VERSION) $( CROSS_TARGET) $( ABIDIR) && \
CPU = $( CPU) ABIDIR = $( ABIDIR) ANDROID_ARCH = $( ANDROID_ARCH) ANDROID_COMPILER = $( ANDROID_COMPILER) ANDROID_TOOLCHAIN_DIR = $( ANDROID_TOOLCHAIN_DIR) $( ENV_SCRIPT) nim libWakuAndroid $( NIM_PARAMS) waku.nims
libwaku-android-arm64 : ANDROID_ARCH =aarch 64-linux -android
libwaku-android-arm64 : CPU =arm 64
libwaku-android-arm64 : ABIDIR =arm 64-v 8a
libwaku-android-arm64 : | libwaku -android -precheck build deps
$( MAKE) build-libwaku-for-android-arch ANDROID_ARCH = $( ANDROID_ARCH) CROSS_TARGET = $( ANDROID_ARCH) CPU = $( CPU) ABIDIR = $( ABIDIR) ANDROID_COMPILER = $( ANDROID_ARCH)$( ANDROID_TARGET) -clang
libwaku-android-amd64 : ANDROID_ARCH =x 86_ 64-linux -android
libwaku-android-amd64 : CPU =amd 64
libwaku-android-amd64 : ABIDIR =x 86_ 64
libwaku-android-amd64 : | libwaku -android -precheck build deps
$( MAKE) build-libwaku-for-android-arch ANDROID_ARCH = $( ANDROID_ARCH) CROSS_TARGET = $( ANDROID_ARCH) CPU = $( CPU) ABIDIR = $( ABIDIR) ANDROID_COMPILER = $( ANDROID_ARCH)$( ANDROID_TARGET) -clang
libwaku-android-x86 : ANDROID_ARCH =i 686-linux -android
libwaku-android-x86 : CPU =i 386
libwaku-android-x86 : ABIDIR =x 86
libwaku-android-x86 : | libwaku -android -precheck build deps
$( MAKE) build-libwaku-for-android-arch ANDROID_ARCH = $( ANDROID_ARCH) CROSS_TARGET = $( ANDROID_ARCH) CPU = $( CPU) ABIDIR = $( ABIDIR) ANDROID_COMPILER = $( ANDROID_ARCH)$( ANDROID_TARGET) -clang
libwaku-android-arm : ANDROID_ARCH =armv 7a -linux -androideabi
libwaku-android-arm : CPU =arm
libwaku-android-arm : ABIDIR =armeabi -v 7a
libwaku-android-arm : | libwaku -android -precheck build deps
# cross-rs target architecture name does not match the one used in android
$( MAKE) build-libwaku-for-android-arch ANDROID_ARCH = $( ANDROID_ARCH) CROSS_TARGET = armv7-linux-androideabi CPU = $( CPU) ABIDIR = $( ABIDIR) ANDROID_COMPILER = $( ANDROID_ARCH)$( ANDROID_TARGET) -clang
libwaku-android :
$( MAKE) libwaku-android-amd64
$( MAKE) libwaku-android-arm64
$( MAKE) libwaku-android-x86
# This target is disabled because on recent versions of cross-rs complain with the following error
# relocation R_ARM_THM_ALU_PREL_11_0 cannot be used against symbol 'stack_init_trampoline_return'; recompile with -fPIC
# It's likely this architecture is not used so we might just not support it.
# $(MAKE) libwaku-android-arm
2023-05-19 08:20:12 +02:00
cwaku_example : | build libwaku
2023-05-12 18:08:41 +02:00
echo -e $( BUILD_MSG) "build/ $@ " && \
cc -o "build/ $@ " \
./examples/cbindings/waku_example.c \
2023-07-07 10:53:00 +02:00
./examples/cbindings/base64.c \
2023-05-19 08:20:12 +02:00
-lwaku -Lbuild/ \
-pthread -ldl -lm \
2023-05-12 18:08:41 +02:00
-lminiupnpc -Lvendor/nim-nat-traversal/vendor/miniupnp/miniupnpc/build/ \
-lnatpmp -Lvendor/nim-nat-traversal/vendor/libnatpmp-upstream/ \
vendor/nim-libbacktrace/libbacktrace_wrapper.o \
vendor/nim-libbacktrace/install/usr/lib/libbacktrace.a
2022-11-30 21:02:39 +01:00
2023-09-28 11:10:42 +02:00
cppwaku_example : | build libwaku
echo -e $( BUILD_MSG) "build/ $@ " && \
g++ -o "build/ $@ " \
./examples/cpp/waku.cpp \
./examples/cpp/base64.cpp \
-lwaku -Lbuild/ \
-pthread -ldl -lm \
-lminiupnpc -Lvendor/nim-nat-traversal/vendor/miniupnp/miniupnpc/build/ \
-lnatpmp -Lvendor/nim-nat-traversal/vendor/libnatpmp-upstream/ \
vendor/nim-libbacktrace/libbacktrace_wrapper.o \
vendor/nim-libbacktrace/install/usr/lib/libbacktrace.a
2023-08-02 10:45:15 +02:00
nodejswaku : | build deps
echo -e $( BUILD_MSG) "build/ $@ " && \
node-gyp build --directory= examples/nodejs/
2022-11-30 21:02:39 +01:00
endif # "variables.mk" was not included
2023-05-18 14:45:45 +02:00
###################
# Release Targets #
###################
release-notes :
docker run \
-it \
--rm \
-v $$ { PWD} :/opt/sv4git/repo:z \
-u $( shell id -u) \
docker.io/wakuorg/sv4git:latest \
release-notes | \
sed -E 's@#([0-9]+)@[#\1](https://github.com/waku-org/nwaku/issues/\1)@g'
# I could not get the tool to replace issue ids with links, so using sed for now,
# asked here: https://github.com/bvieira/sv4git/discussions/101