#
# This makefile is used for convenience, and wrap simple cmake commands
# You don't need to use it as an end user, it is more for developer.
#
# * work with docker (linux build)
# * execute the unittest
#
# The default target will install ws, the command line tool coming with
# IXWebSocket into /usr/local/bin
#
#
all: brew

install: brew

-DCMAKE_INSTALL_PREFIX=/opt/homebrew

# Use -DCMAKE_INSTALL_PREFIX= to install into another location
# on osx it is good practice to make /usr/local user writable
# sudo chown -R `whoami`/staff /usr/local
#
# Those days (since Apple Silicon mac shipped), on macOS homebrew installs in /opt/homebrew, and /usr/local is readonly
#
# Release, Debug, MinSizeRel, RelWithDebInfo are the build types
#
# Default rule does not use python as that requires first time users to have Python3 installed
#
brew:
ifeq ($(shell uname),Darwin)
	mkdir -p build && (cd build ; cmake -GNinja -DCMAKE_INSTALL_PREFIX=/opt/homebrew -DCMAKE_UNITY_BUILD=OFF -DCMAKE_INSTALL_MESSAGE=LAZY -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DCMAKE_BUILD_TYPE=Debug -DUSE_TLS=1 -DUSE_WS=1 -DUSE_TEST=1 .. ; ninja)
else
	mkdir -p build && (cd build ; cmake -GNinja -DCMAKE_UNITY_BUILD=OFF -DCMAKE_INSTALL_MESSAGE=LAZY -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DCMAKE_BUILD_TYPE=Debug -DUSE_TLS=1 -DUSE_WS=1 -DUSE_TEST=1 .. ; ninja)
endif

# Docker default target. We've had problems with OpenSSL and TLS 1.3 (on the
# server side ?) and I can't work-around it easily, so we're using mbedtls on
# Linux for the SSL backend, which works great.
ws_mbedtls_install:
	mkdir -p build && (cd build ; cmake -GNinja -DCMAKE_UNITY_BUILD=ON -DCMAKE_INSTALL_MESSAGE=LAZY -DCMAKE_BUILD_TYPE=MinSizeRel -DUSE_ZLIB=OFF -DUSE_TLS=1 -DUSE_WS=1 -DUSE_MBED_TLS=1 .. ; ninja install)

ws:
	mkdir -p build && (cd build ; cmake -GNinja -DCMAKE_INSTALL_MESSAGE=LAZY -DCMAKE_BUILD_TYPE=Debug -DUSE_TLS=1 -DUSE_WS=1 .. && ninja)

ws_unity:
	mkdir -p build && (cd build ; cmake -GNinja -DCMAKE_UNITY_BUILD=ON -DCMAKE_INSTALL_MESSAGE=LAZY -DCMAKE_BUILD_TYPE=Debug -DUSE_TLS=1 -DUSE_WS=1 .. && ninja)

ws_install:
	mkdir -p build && (cd build ; cmake -GNinja -DCMAKE_INSTALL_MESSAGE=LAZY -DCMAKE_BUILD_TYPE=MinSizeRel -DUSE_TLS=1 -DUSE_WS=1 .. -DUSE_TEST=0 && ninja install)

ws_install_release:
	mkdir -p build && (cd build ; cmake -GNinja -DCMAKE_INSTALL_MESSAGE=LAZY -DCMAKE_BUILD_TYPE=MinSizeRel -DUSE_TLS=1 -DUSE_WS=1 .. -DUSE_TEST=0 && ninja install)

ws_openssl_install:
	mkdir -p build && (cd build ; cmake -GNinja -DCMAKE_INSTALL_MESSAGE=LAZY -DCMAKE_BUILD_TYPE=Debug -DUSE_TLS=1 -DUSE_WS=1 -DUSE_OPEN_SSL=1 .. ; ninja install)

ws_mbedtls:
	mkdir -p build && (cd build ; cmake -DCMAKE_INSTALL_MESSAGE=LAZY -DCMAKE_BUILD_TYPE=Debug -DUSE_TLS=1 -DUSE_WS=1 -DUSE_MBED_TLS=1 .. ; ninja)

ws_no_ssl:
	mkdir -p build && (cd build ; cmake -DCMAKE_INSTALL_MESSAGE=LAZY -DCMAKE_BUILD_TYPE=Debug -DUSE_WS=1 .. ; ninja)

ws_no_python:
	mkdir -p build && (cd build ; cmake -DCMAKE_INSTALL_MESSAGE=LAZY -DCMAKE_BUILD_TYPE=MinSizeRel -DUSE_TLS=1 -DUSE_WS=1 .. ; ninja install)

uninstall:
	xargs rm -fv < build/install_manifest.txt

tag:
	git tag v"`sh tools/extract_version.sh`"

xcode:
	cmake -DCMAKE_BUILD_TYPE=Debug -DUSE_TLS=1 -DUSE_WS=1 -DUSE_TEST=1 -GXcode && open ixwebsocket.xcodeproj

xcode_openssl:
	cmake -DCMAKE_BUILD_TYPE=Debug -DUSE_TLS=1 -DUSE_WS=1 -DUSE_TEST=1 -DUSE_OPEN_SSL=1 -GXcode && open ixwebsocket.xcodeproj

.PHONY: docker

NAME   := ${DOCKER_REPO}/ws
TAG    := $(shell sh tools/extract_version.sh)
IMG    := ${NAME}:${TAG}
LATEST := ${NAME}:latest
BUILD  := ${NAME}:build

print_version:
	@echo 'IXWebSocket version =>' ${TAG}

set_version:
	sh tools/update_version.sh ${VERSION}

docker_test:
	docker build -f docker/Dockerfile.debian -t bsergean/ixwebsocket_test:build .

docker:
	git clean -dfx
	docker build -t ${IMG} .
	docker tag ${IMG} ${BUILD}

docker_push:
	docker tag ${IMG} ${LATEST}
	docker push ${LATEST}
	docker push ${IMG}

deploy: docker docker_push

run:
	docker run --cap-add sys_ptrace --entrypoint=sh -it bsergean/ws:build

# this is helpful to remove trailing whitespaces
trail:
	sh third_party/remote_trailing_whitespaces.sh

format:
	clang-format -i `find test ixwebsocket ws -name '*.cpp' -o -name '*.h'`

# That target is used to start a node server, but isn't required as we have
# a builtin C++ server started in the unittest now
test_server:
	(cd test && npm i ws && node broadcast-server.js)

test:
	mkdir -p build && (cd build ; cmake -GNinja -DCMAKE_INSTALL_MESSAGE=LAZY -DCMAKE_UNITY_BUILD=ON -DCMAKE_BUILD_TYPE=Debug -DUSE_TLS=1 -DUSE_TEST=1 ..)
	(cd build ; ninja)
	(cd build ; ninja -v test)

test_asan:
	mkdir -p build && (cd build ; cmake -GNinja -DCMAKE_INSTALL_MESSAGE=LAZY -DCMAKE_UNITY_BUILD=ON -DCMAKE_BUILD_TYPE=Debug -DUSE_TLS=1 -DUSE_TEST=1 .. -DCMAKE_C_FLAGS="-fsanitize=address -fno-omit-frame-pointer" -DCMAKE_CXX_FLAGS="-fsanitize=address -fno-omit-frame-pointer")
	(cd build ; ninja)
	(cd build ; ctest -V .)

test_tsan_mbedtls:
	mkdir -p build && (cd build ; cmake -GNinja -DCMAKE_INSTALL_MESSAGE=LAZY -DCMAKE_UNITY_BUILD=ON -DCMAKE_BUILD_TYPE=Debug -DUSE_TLS=1 -DUSE_MBED_TLS=1 -DUSE_TEST=1 .. -DCMAKE_C_FLAGS="-fsanitize=thread -fno-omit-frame-pointer" -DCMAKE_CXX_FLAGS="-fsanitize=thread -fno-omit-frame-pointer")
	(cd build ; ninja)
	(cd build ; ninja test)

test_tsan_openssl:
	mkdir -p build && (cd build ; cmake -GNinja -DCMAKE_INSTALL_MESSAGE=LAZY -DCMAKE_UNITY_BUILD=ON DCMAKE_BUILD_TYPE=Debug -DUSE_TLS=1 -DUSE_OPENS_SSL=1 -DUSE_TEST=1 .. -DCMAKE_C_FLAGS="-fsanitize=thread -fno-omit-frame-pointer" -DCMAKE_CXX_FLAGS="-fsanitize=thread -fno-omit-frame-pointer")
	(cd build ; ninja)
	(cd build ; ninja test)

test_tsan_sectransport:
	mkdir -p build && (cd build ; cmake -GNinja -DCMAKE_INSTALL_MESSAGE=LAZY -DCMAKE_UNITY_BUILD=ON -DCMAKE_BUILD_TYPE=Debug -DUSE_TLS=1 -DUSE_OPENS_SSL=1 -DUSE_TEST=1 .. -DCMAKE_C_FLAGS="-fsanitize=thread -fno-omit-frame-pointer" -DCMAKE_CXX_FLAGS="-fsanitize=thread -fno-omit-frame-pointer")
	(cd build ; ninja)
	(cd build ; ninja test)

ws_test: ws
	(cd ws ; env DEBUG=1 PATH=../ws/build:$$PATH bash test_ws.sh)

autobahn_report:
	cp -rvf ~/sandbox/reports/clients/* ../bsergean.github.io/IXWebSocket/autobahn/

httpd:
	clang++ --std=c++14 --stdlib=libc++ -o ixhttpd httpd.cpp \
		ixwebsocket/IXSelectInterruptFactory.cpp \
		ixwebsocket/IXCancellationRequest.cpp \
		ixwebsocket/IXSocketTLSOptions.cpp \
		ixwebsocket/IXUserAgent.cpp \
		ixwebsocket/IXDNSLookup.cpp \
		ixwebsocket/IXBench.cpp \
		ixwebsocket/IXWebSocketHttpHeaders.cpp \
		ixwebsocket/IXSelectInterruptPipe.cpp \
		ixwebsocket/IXHttp.cpp \
		ixwebsocket/IXSocketConnect.cpp \
		ixwebsocket/IXSocket.cpp \
		ixwebsocket/IXSocketServer.cpp \
		ixwebsocket/IXNetSystem.cpp \
		ixwebsocket/IXHttpServer.cpp \
		ixwebsocket/IXSocketFactory.cpp \
		ixwebsocket/IXConnectionState.cpp \
		ixwebsocket/IXUrlParser.cpp \
		ixwebsocket/IXSelectInterrupt.cpp \
		ixwebsocket/IXSetThreadName.cpp \
		-lz

httpd_linux:
	g++ --std=c++14 -o ixhttpd httpd.cpp -Iixwebsocket \
		ixwebsocket/IXSelectInterruptFactory.cpp \
		ixwebsocket/IXCancellationRequest.cpp \
		ixwebsocket/IXSocketTLSOptions.cpp \
		ixwebsocket/IXUserAgent.cpp \
		ixwebsocket/IXDNSLookup.cpp \
		ixwebsocket/IXBench.cpp \
		ixwebsocket/IXWebSocketHttpHeaders.cpp \
		ixwebsocket/IXSelectInterruptPipe.cpp \
		ixwebsocket/IXHttp.cpp \
		ixwebsocket/IXSocketConnect.cpp \
		ixwebsocket/IXSocket.cpp \
		ixwebsocket/IXSocketServer.cpp \
		ixwebsocket/IXNetSystem.cpp \
		ixwebsocket/IXHttpServer.cpp \
		ixwebsocket/IXSocketFactory.cpp \
		ixwebsocket/IXConnectionState.cpp \
		ixwebsocket/IXUrlParser.cpp \
		ixwebsocket/IXSelectInterrupt.cpp \
		ixwebsocket/IXSetThreadName.cpp \
		-lz -lpthread
	cp -f ixhttpd /usr/local/bin

# For the fork that is configured with appveyor
rebase_upstream:
	git fetch upstream
	git checkout master
	git reset --hard upstream/master
	git push origin master --force

# Legacy target
install_cmake_for_linux:
	mkdir -p /tmp/cmake
	(cd /tmp/cmake ; curl -L -O https://github.com/Kitware/CMake/releases/download/v3.14.0/cmake-3.14.0-Linux-x86_64.tar.gz ; tar zxf cmake-3.14.0-Linux-x86_64.tar.gz)

#  python -m venv venv
#  source venv/bin/activate
#  pip install mkdocs
doc:
	mkdocs gh-deploy

change: format
	vim ixwebsocket/IXWebSocketVersion.h docs/CHANGELOG.md

change_no_format:
	vim ixwebsocket/IXWebSocketVersion.h docs/CHANGELOG.md

commit:
	git commit -am "`sh tools/extract_latest_change.sh`"

.PHONY: test
.PHONY: build
.PHONY: ws
