#############################################################
# Makefile to build ZMQ in toolchain
#
#

TOPDIR=..
LIBNAME=zmq
HAS_ONLY_RELEASE_MODE_PRECOMPILED=0
REALTOP=$(shell readlink -f ..)
include $(TOPDIR)/Makefiles/Repo-defines.mk

EXTRA_CFLAGS=-fPIC
ifeq ($(BUILD),debug-gcov)
	EXTRA_CFLAGS+=-g
	EXTRA_LDFLAGS=
	RUNSTRIP=ls
	CONFIG_DEBUG=--enable-debug
else
	# even if we feed --disable-debug to the ZMQ configure script, it will include -g in its command line.
	# to forcefully disable debug symbol generation, we feed -g0 as last option on the commandline
	EXTRA_CFLAGS+=-g0 -O3
	EXTRA_LDFLAGS=
	RUNSTRIP=strip -S
	CONFIG_DEBUG=--disable-debug
endif

# for stable releases:
#ZMQ_NAME=zeromq-4.3.2
#ZMQ_TARBALL=$(ZMQ_NAME).tar.gz

# in case we have taken the last master branch:
ZMQ_NAME=libzmq
ZMQ_TARBALL=zeromq-master-25may2023.tar.gz
ZMQ_SO_VERSION=5.2.5

CPPZMQ_NAME=cppzmq-4.3.0

# reason to disable ZMQ libsodium integration right now are:
#  1) we don't really use security
#  2) libsodium will used /dev/[u]random that apparently can be VERY slow on some virtual machines, see
#     https://stackoverflow.com/questions/4819359/dev-random-extremely-slow
ENABLE_SODIUM=no
ifeq ($(ENABLE_SODIUM),yes)
SODIUM_LDFLAGS_DEPS  := -L$(REALTOP)/cpp-libs/sodium/$(BUILDID) -lsodium
SODIUM_CFLAGS_DEPS   := -I$(REALTOP)/cpp-libs/sodium/include
else
SODIUM_LDFLAGS_DEPS  :=
SODIUM_CFLAGS_DEPS   :=
endif

.PHONY: all links untar config build regen_precompiled clean distclean

all:
	$(MKDIR) $(PRECOMPILED_DIR)
	$(MAKE) untar
	$(MAKE) config
	$(MAKE) build

untar:
	@echo "=== Untarring and applying Empirix patches"
	rm -rf $(ZMQ_NAME)
	mkdir -p $(PRECOMPILED_DIR) include
	tar -xvzf $(ZMQ_TARBALL) && \
		echo "=== Applying patch 'zmq_msg_refcount.patch'" && \
		patch --ignore-whitespace -p0 < ./zmq_msg_refcount.patch && \
		echo "=== Applying patch 'zmq_malloc_stats.patch'" && \
		patch --ignore-whitespace -p0 < ./zmq_malloc_stats.patch

	tar -xvzf $(CPPZMQ_NAME).tar.gz

config:
	@echo "=== Configuring ZMQ"
	cd $(ZMQ_NAME) && \
		./autogen.sh && \
		CC=$(TOOLBIN)/gcc CXX=$(TOOLBIN)/g++ AR=$(TOOLBIN)/ar RANLIB=$(TOOLBIN)/ranlib \
		CFLAGS="$(SODIUM_LDFLAGS_DEPS) $(EMPIRIX_LDFLAGS) $(EXTRA_CFLAGS)" \
		CPPFLAGS="$(SODIUM_LDFLAGS_DEPS) $(EMPIRIX_LDFLAGS) $(EXTRA_CFLAGS)" \
		CXXFLAGS="$(SODIUM_LDFLAGS_DEPS) $(EMPIRIX_LDFLAGS) $(EXTRA_CFLAGS)" \
		LDFLAGS="$(EMPIRIX_LDFLAGS) $(ADDITIONAL_RPATHS_LINKER_FLAGS) $(EXTRA_LDFLAGS)" \
		PATH=$(TOOLBIN):${PATH} \
		sodium_LIBS="$(SODIUM_LDFLAGS_DEPS)" sodium_CFLAGS="$(SODIUM_CFLAGS_DEPS)" \
		./configure --host=x86_64-unknown-linux-gnu --target=x86_64-unknown-linux-gnu --prefix=/usr $(CONFIG_DEBUG) --enable-drafts --with-libsodium=$(ENABLE_SODIUM) && \
		sed -i  's@ZMQ_HAVE_ATOMIC_INTRINSICS 1@ZMQ_HAVE_ATOMIC_INTRINSICS 0@' src/platform.hpp && \
		sed -i  's@inbound_poll_rate = 100@inbound_poll_rate = 10000@' src/config.hpp && \
		sed -i  's@max_command_delay = 3000000,@#define max_command_delay 3000000000UL@' src/config.hpp && \
		true

build:
	@echo "=== Building ZMQ with CFG=$(CFG)"
	cd $(ZMQ_NAME) && \
		make -j$(NUM_PROCS) V=1 CFG=$(CFG)
	cp -fv $(ZMQ_NAME)/src/.libs/libzmq.so.$(ZMQ_SO_VERSION)    ./$(PRECOMPILED_DIR)
	cp -fv $(ZMQ_NAME)/tools/.libs/curve_keygen            ./$(PRECOMPILED_DIR)
	cp -fv $(ZMQ_NAME)/include/*                           ./include
	cp -fv $(CPPZMQ_NAME)/*.hpp                            ./include
	$(RUNSTRIP) $(PRECOMPILED_DIR)/libzmq.so.$(ZMQ_SO_VERSION)
	$(RUNSTRIP) $(PRECOMPILED_DIR)/curve_keygen
	# Unfortunately symbolic links are not allowed in Perforce, so we need to create them on-the-fly:
	$(LIBLINKS) $(PRECOMPILED_DIR)/*.so.$(ZMQ_SO_VERSION)


test_precompiled:
	#### this target must be run after the "regen_precompiled" step
	# IMPORTANT: due to the -rpath trick we do above, even if we just adjust the LD_LIBRARY_PATH when running "make check" the ZMQ unit tests
	#            will pick up the libzmq binaries under /lib/empirix, so we need to ensure they are up-to-date:
	cp -fv $(PRECOMPILED_DIR)/libzmq.so.$(ZMQ_SO_VERSION) /lib/empirix/$(ARCH)/
	cd $(ZMQ_NAME) && \
		LD_LIBRARY_PATH=$(REALTOP)/cpp-libs/zmq/$(PRECOMPILED_DIR):$(REALTOP)/cpp-libs/sodium/$(PRECOMPILED_DIR) make check

clean_build_intermediate_artifacts:
	rm -rf $(ZMQ_NAME) $(CPPZMQ_NAME)


clean_build_outputs: clean
	rm -f $(PRECOMPILED_DIR)/*.so*
	rm -f include/*

include $(TOPDIR)/Makefiles/ThirdPartyTargetHelpers.mk
