#############################################################
# Makefile to build pulsar-cpp in toolchain
#
#

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

ifeq ($(BUILD),debug-gcov)
EXTRA_CFLAGS=-g -O0
RUNSTRIP=ls
CONFIG_DEBUG=--enable-debug
PULSAR_BUILDTYPE=Debug
else
ifeq ($(BUILD),debug-gcov)
EXTRA_CFLAGS=-g -O0
RUNSTRIP=ls
CONFIG_DEBUG=--enable-debug
PULSAR_BUILDTYPE=Debug
else
# to forcefully disable debug symbol generation, we feed -g0 as last option on the commandline
EXTRA_CFLAGS=-g0 -O3
RUNSTRIP=strip -S
PULSAR_BUILDTYPE=Release
endif
endif

PULSAR_DIR_NAME=apache-pulsar-2.10.0-src
PULSAR_CLIENT_CPP_DIR_NAME=pulsar-client-cpp
PULSAR_CLIENT_CPP_TARBALL=apache-pulsar-2.10.0-src.tar.gz
PULSAR_CLIENT_CPP_ABS_PATH=$(REALTOP)/$(PULSAR_CLIENT_CPP_DIR_NAME)
PULSAR_SOVER=2.10.0

USRLIB64=/usr/lib64

# Dependencies paths
OPENSSL_INCLUDE_PATH=/usr/include/openssl
OPENSSL_LIB_PATH=$(USRLIB64)

PROTOBUF_INCLUDE_PATH=/usr/include
PROTOBUF_LIB_PATH=$(USRLIB64)


BOOST_INCLUDE_PATH=/usr/include/boost
BOOST_LIB_PATH=$(USRLIB64)
BOOST_ROOT=/usr/include/boost

#CURL_LIB_PATH=$(REALTOP)/curl/$(BUILDID)
CURL_LIB_PATH=$(USRLIB64)
CURL_INCLUDE_PATH=/usr/include/curl
#CURL_LIBRARIES=$(REALTOP)/curl/$(BUILDID)/libcurl.so

BUILD_INCLUDE_PATH="$(CURL_INCLUDE_PATH)"

.PHONY: all links untar config build clean 
fulldist: all

all:
	$(MKDIR) $(PRECOMPILED_DIR)
	$(MAKE) untar
	$(MAKE) patch
	$(MAKE) config
	$(MAKE) build
	#$(MAKE) clean

yumdepends:
	# only to remind to insert them in docker
	# 4test: #gmock gmock-devel gtest gtest-devel ccache zstd  
	# protobuf-lite protobuf-lite-devel cmake3
ifeq ($(ARCH),docker) 
	@echo ""
	@echo "=== YumDepends $(LIBNAME)"
	@echo ""
	@echo "Installing packages: ccache, clang-tools-extra"
	dnf install -y  ccache \
					clang-tools-extra
	@echo ""
	@echo "=== YumDepends $(LIBNAME): done!"
	@echo ""
endif

untar:
	@echo ""	
	@echo "=== Untarring $(LIBNAME)"
	@echo ""
	rm -rf $(PULSAR_DIR_NAME)
	[  -d "include" ] || mkdir -p $(PRECOMPILED_DIR) include
	tar -xzf $(PULSAR_CLIENT_CPP_TARBALL)

	@echo ""
	@echo "=== Untarring $(LIBNAME): done!"
	@echo ""

patch:
	@echo "=== Applying Empirix patches to $(LIBNAME)"
	patch -p0 < ./patches/pulsar_2.10.0_fix_error_type_qualifiers_ignored.patch
	patch -p0 < ./patches/pulsar_2.10.0_set_incremental_name_to_cpp_client_threads.patch

config: yumdepends
	@echo ""
	@echo "=== Configuring $(LIBNAME)"
	@echo ""
	# set ENV on requested  paths
	#   DCMAKE_POLICY_DEFAULT_CMP0074   is to force cmake3 to honor the <packageName>_ROOT variables
	cd $(PULSAR_DIR_NAME)/$(PULSAR_CLIENT_CPP_DIR_NAME) && \
		CC=$(TOOLBIN)/gcc CXX=$(TOOLBIN)/g++ AR=$(TOOLBIN)/ar RANLIB=$(TOOLBIN)/ranlib \
		CFLAGS="$(EMPIRIX_LDFLAGS) $(EXTRA_CFLAGS)" \
		CPPFLAGS="$(EMPIRIX_LDFLAGS) $(EXTRA_CFLAGS)" \
		CXXFLAGS="$(EMPIRIX_LDFLAGS) $(EXTRA_CFLAGS)" \
		\
		PYTHON_INCLUDE_DIR='/usr/include/python3.7m/' \
		BOOST_ROOT='$(BOOST_ROOT)' \
		BOOST_INCLUDEDIR='$(BOOST_INCLUDE_PATH)' \
		BOOST_LIBRARIES='$(BOOST_LIB_PATH)' \
		\
		CMAKE_VERBOSE_MAKEFILE=ON \
 		CMAKE_INCLUDE_PATH='$(PROTOBUF_INCLUDE_PATH):$(BOOST_INCLUDE_PATH):$(BOOST_INCLUDE_PATH)/beast:$(OPENSSL_INCLUDE_PATH):$(CURL_INCLUDE_PATH):/usr/include/' \
		CMAKE_LIBRARY_PATH='$(PROTOBUF_LIB_PATH):$(OPENSSL_LIB_PATH):$(CURL_LIB_PATH):$(USRLIB64):/usr/bin'  \
		CMAKE_BUILD_TYPE=$(PULSAR_BUILDTYPE)  \
		\
		cmake3 \
			-DCMAKE_POLICY_DEFAULT_CMP0074=NEW \
			-DBUILD_TESTS=OFF -DLINK_STATIC=OFF -DUSE_LOG4CXX=OFF -DLIB_SNAPPY=OFF -DBUILD_PYTHON_WRAPPER=OFF  \
			-DCMAKE_BUILD_TYPE=$(PULSAR_BUILDTYPE)  \
			-DOPENSSL_INCLUDE_DIR=$(OPENSSL_INCLUDE_PATH)  \
			-DOPENSSL_CRYPTO_LIBRARY=$(OPENSSL_LIB_PATH)  \
			-DOPENSSL_SSL_LIBRARY=$(OPENSSL_LIB_PATH)  \
			-DOPENSSL_LIBRARIES=$(OPENSSL_LIB_PATH)  \
			-DZLIB_LIBRARIES=$(USRLIB64)  \
			-DCURL_LIBRARIES=$(CURL_LIBRARIES) \
			-DPROTOBUF_LIBRARIES=$(PROTOBUF_LIB_PATH) \
			-DProtobuf_LITE_LIBRARIES=$(PROTOBUF_LIB_PATH)/libprotobuf.so  \
			-DProtobuf_INCLUDE_DIRS=$(PROTOBUF_INCLUDE_PATH) \
			-DCLANG_FORMAT_BIN=/usr/bin/clang-format  \
			-DCLANG_TIDY_BIN=/usr/bin/clang-tidy  \
			-DCCACHE_PROGRAM=/usr/bin/ccache  \
			.
	@echo ""
	@echo ""
	@echo "=== Configuring $(LIBNAME): done !"
	@echo ""

build:
	@echo ""
	@echo "=== Building $(LIBNAME)"
	@echo ""
	cd $(PULSAR_DIR_NAME)/$(PULSAR_CLIENT_CPP_DIR_NAME) && \
		PATH="$(CURL_INCLUDE_PATH):$$PATH" \
		LD_LIBRARY_PATH='$(OPENSSL_LIB_PATH):$(CURL_LIB_PATH)' \
		CPATH="$(BUILD_INCLUDE_PATH)" \
		C_INCLUDE_PATH="$(BUILD_INCLUDE_PATH)" \
		CPLUS_INCLUDE_PATH="$(BUILD_INCLUDE_PATH)" \
		OBJC_INCLUDE_PATH="$(BUILD_INCLUDE_PATH)" \
		VERBOSE=1 \
		make pulsarShared -j$(NUM_PROCS)  
	cp -fv $(PULSAR_DIR_NAME)/$(PULSAR_CLIENT_CPP_DIR_NAME)/lib/libpulsar.so.$(PULSAR_SOVER)      ./$(PRECOMPILED_DIR)
	cp -fvr $(PULSAR_DIR_NAME)/$(PULSAR_CLIENT_CPP_DIR_NAME)/include/*                            ./include
	# custom Empirix file injected in the list of Pulsar include files:
	cp -fvr patches/Version.h                                                                     ./include/pulsar/
	@$(LIBLINKS) $(PRECOMPILED_DIR)/*.so.$(PULSAR_SOVER)
	@echo ""
	@echo "=== Building $(LIBNAME): done !"
	@echo ""

clean_build_intermediate_artifacts:
	@echo ""
	@echo "Cleaning Build Intermediate Artifacts "
	rm -rf $(PULSAR_DIR_NAME)

clean_build_outputs: clean
	@echo ""
	@echo "Cleaning Build Outputs"
	@echo ""
	rm -f $(PRECOMPILED_DIR)/*.so*
	rm -rf include/*

include $(TOPDIR)/Makefiles/ThirdPartyTargetHelpers.mk
LINKER_FLAGS+= -Xlinker -rpath -Xlinker $(EMPIRIX_OPT) \
