#############################################################################
# apps/netutils/libwebsockets/Makefile
#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.  The
# ASF licenses this file to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance with the
# License.  You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
# License for the specific language governing permissions and limitations
# under the License.
#
#############################################################################

include $(APPDIR)/Make.defs

LIBWEBSOCKETS_URL     ?= "https://github.com/warmcat/libwebsockets/archive"

LIBWEBSOCKETS_VERSION := $(patsubst "%",%,$(CONFIG_NETUTILS_LIBWEBSOCKETS_VERSION))
LIBWEBSOCKETS_TARBALL  = v$(LIBWEBSOCKETS_VERSION).tar.gz
LIBWEBSOCKETS_UNPACK   = libwebsockets

word-dot = $(word $2,$(subst ., ,$1))

CFLAGS += \
	-DLWS_LIBRARY_VERSION_MAJOR=$(call word-dot,$(LIBWEBSOCKETS_VERSION),1) \
	-DLWS_LIBRARY_VERSION_MINOR=$(call word-dot,$(LIBWEBSOCKETS_VERSION),2) \
	-DLWS_LIBRARY_VERSION_PATCH=$(call word-dot,$(LIBWEBSOCKETS_VERSION),3) \
	-DLWS_LIBRARY_VERSION_PATCH_ELABORATED=$(call word-dot,$(LIBWEBSOCKETS_VERSION),3)-unknown \
	-DLWS_LIBRARY_VERSION=\"$(LIBWEBSOCKETS_VERSION)-unknown\" \
	-Wno-shadow \

CFLAGS += \
	-I. \
	-I$(LIBWEBSOCKETS_UNPACK)/lib/core \
	-I$(LIBWEBSOCKETS_UNPACK)/lib/plat/unix \
	-I$(LIBWEBSOCKETS_UNPACK)/lib/event-libs \
	-I$(LIBWEBSOCKETS_UNPACK)/lib/event-libs/libuv \
	-I$(LIBWEBSOCKETS_UNPACK)/lib/system/smd \
	-I$(LIBWEBSOCKETS_UNPACK)/lib/system/metrics \
	-I$(LIBWEBSOCKETS_UNPACK)/lib/core-net \
	-I$(LIBWEBSOCKETS_UNPACK)/lib/roles \
	-I$(LIBWEBSOCKETS_UNPACK)/lib/roles/http \
	-I$(LIBWEBSOCKETS_UNPACK)/lib/roles/h1 \
	-I$(LIBWEBSOCKETS_UNPACK)/lib/roles/h2 \
	-I$(LIBWEBSOCKETS_UNPACK)/lib/roles/ws \
	-I$(LIBWEBSOCKETS_UNPACK)/lib/tls \
	-I${LIBWEBSOCKETS_UNPACK}/lib/tls/mbedtls/wrapper/include \
	-I${LIBWEBSOCKETS_UNPACK}/lib/tls/mbedtls/wrapper/include/internal \
	-I${LIBWEBSOCKETS_UNPACK}/lib/tls/mbedtls/wrapper/include/openssl \
	-I${LIBWEBSOCKETS_UNPACK}/lib/tls/mbedtls/wrapper/include/platform

CSRCS += \
	$(LIBWEBSOCKETS_UNPACK)/lib/plat/unix/unix-caps.c \
	$(LIBWEBSOCKETS_UNPACK)/lib/plat/unix/unix-misc.c \
	$(LIBWEBSOCKETS_UNPACK)/lib/plat/unix/unix-init.c \
	$(LIBWEBSOCKETS_UNPACK)/lib/plat/unix/unix-file.c \
	$(LIBWEBSOCKETS_UNPACK)/lib/plat/unix/unix-pipe.c \
	$(LIBWEBSOCKETS_UNPACK)/lib/plat/unix/unix-service.c \
	$(LIBWEBSOCKETS_UNPACK)/lib/plat/unix/unix-sockets.c \
	$(LIBWEBSOCKETS_UNPACK)/lib/plat/unix/unix-fds.c \
	$(LIBWEBSOCKETS_UNPACK)/lib/core/alloc.c \
	$(LIBWEBSOCKETS_UNPACK)/lib/core/buflist.c \
	$(LIBWEBSOCKETS_UNPACK)/lib/core/context.c \
	$(LIBWEBSOCKETS_UNPACK)/lib/core/lws_dll2.c \
	$(LIBWEBSOCKETS_UNPACK)/lib/core/lws_map.c \
	$(LIBWEBSOCKETS_UNPACK)/lib/core/libwebsockets.c \
	$(LIBWEBSOCKETS_UNPACK)/lib/core/logs.c \
	$(LIBWEBSOCKETS_UNPACK)/lib/core/vfs.c \
	$(LIBWEBSOCKETS_UNPACK)/lib/misc/base64-decode.c \
	$(LIBWEBSOCKETS_UNPACK)/lib/misc/cache-ttl/lws-cache-ttl.c \
	$(LIBWEBSOCKETS_UNPACK)/lib/misc/cache-ttl/heap.c \
	$(LIBWEBSOCKETS_UNPACK)/lib/misc/cache-ttl/file.c \
	$(LIBWEBSOCKETS_UNPACK)/lib/misc/dir.c \
	$(LIBWEBSOCKETS_UNPACK)/lib/misc/prng.c \
	$(LIBWEBSOCKETS_UNPACK)/lib/misc/lws-ring.c \
	$(LIBWEBSOCKETS_UNPACK)/lib/misc/lwsac/lwsac.c \
	$(LIBWEBSOCKETS_UNPACK)/lib/misc/lwsac/cached-file.c \
	$(LIBWEBSOCKETS_UNPACK)/lib/misc/lejp.c \
	$(LIBWEBSOCKETS_UNPACK)/lib/misc/sha-1.c \
	$(LIBWEBSOCKETS_UNPACK)/lib/system/system.c \
	$(LIBWEBSOCKETS_UNPACK)/lib/system/smd/smd.c \
	$(LIBWEBSOCKETS_UNPACK)/lib/core-net/dummy-callback.c \
	$(LIBWEBSOCKETS_UNPACK)/lib/core-net/output.c \
	$(LIBWEBSOCKETS_UNPACK)/lib/core-net/close.c \
	$(LIBWEBSOCKETS_UNPACK)/lib/core-net/network.c \
	$(LIBWEBSOCKETS_UNPACK)/lib/core-net/vhost.c \
	$(LIBWEBSOCKETS_UNPACK)/lib/core-net/pollfd.c \
	$(LIBWEBSOCKETS_UNPACK)/lib/core-net/service.c \
	$(LIBWEBSOCKETS_UNPACK)/lib/core-net/sorted-usec-list.c \
	$(LIBWEBSOCKETS_UNPACK)/lib/core-net/wsi.c \
	$(LIBWEBSOCKETS_UNPACK)/lib/core-net/wsi-timeout.c \
	$(LIBWEBSOCKETS_UNPACK)/lib/core-net/adopt.c \
	$(LIBWEBSOCKETS_UNPACK)/lib/core-net/state.c \
	$(LIBWEBSOCKETS_UNPACK)/lib/core-net/client/client.c \
	$(LIBWEBSOCKETS_UNPACK)/lib/core-net/client/connect.c \
	$(LIBWEBSOCKETS_UNPACK)/lib/core-net/client/connect2.c \
	$(LIBWEBSOCKETS_UNPACK)/lib/core-net/client/connect3.c \
	$(LIBWEBSOCKETS_UNPACK)/lib/core-net/client/connect4.c \
	$(LIBWEBSOCKETS_UNPACK)/lib/core-net/client/sort-dns.c \
	$(LIBWEBSOCKETS_UNPACK)/lib/core-net/client/conmon.c \
	$(LIBWEBSOCKETS_UNPACK)/lib/roles/pipe/ops-pipe.c \
	$(LIBWEBSOCKETS_UNPACK)/lib/roles/http/header.c \
	$(LIBWEBSOCKETS_UNPACK)/lib/roles/http/date.c \
	$(LIBWEBSOCKETS_UNPACK)/lib/roles/http/parsers.c \
	$(LIBWEBSOCKETS_UNPACK)/lib/roles/http/cookie.c \
	$(LIBWEBSOCKETS_UNPACK)/lib/roles/h1/ops-h1.c \
	$(LIBWEBSOCKETS_UNPACK)/lib/roles/h2/http2.c \
	$(LIBWEBSOCKETS_UNPACK)/lib/roles/h2/hpack.c \
	$(LIBWEBSOCKETS_UNPACK)/lib/roles/h2/ops-h2.c \
	$(LIBWEBSOCKETS_UNPACK)/lib/roles/ws/ops-ws.c \
	$(LIBWEBSOCKETS_UNPACK)/lib/roles/ws/client-ws.c \
	$(LIBWEBSOCKETS_UNPACK)/lib/roles/ws/client-parser-ws.c \
	$(LIBWEBSOCKETS_UNPACK)/lib/roles/raw-skt/ops-raw-skt.c \
	$(LIBWEBSOCKETS_UNPACK)/lib/roles/raw-file/ops-raw-file.c \
	$(LIBWEBSOCKETS_UNPACK)/lib/roles/http/client/client-http.c \
	$(LIBWEBSOCKETS_UNPACK)/lib/event-libs/poll/poll.c \
	$(LIBWEBSOCKETS_UNPACK)/lib/event-libs/libuv/libuv.c

CSRCS += \
	$(LIBWEBSOCKETS_UNPACK)/lib/tls/tls.c \
	$(LIBWEBSOCKETS_UNPACK)/lib/tls/tls-network.c \
	$(LIBWEBSOCKETS_UNPACK)/lib/tls/tls-sessions.c \
	$(LIBWEBSOCKETS_UNPACK)/lib/tls/tls-client.c \
	$(LIBWEBSOCKETS_UNPACK)/lib/tls/mbedtls/mbedtls-tls.c \
	$(LIBWEBSOCKETS_UNPACK)/lib/tls/mbedtls/mbedtls-extensions.c \
	$(LIBWEBSOCKETS_UNPACK)/lib/tls/mbedtls/mbedtls-x509.c \
	$(LIBWEBSOCKETS_UNPACK)/lib/tls/mbedtls/mbedtls-ssl.c \
	$(LIBWEBSOCKETS_UNPACK)/lib/tls/mbedtls/mbedtls-session.c \
	$(LIBWEBSOCKETS_UNPACK)/lib/tls/mbedtls/mbedtls-client.c

ifneq ($(CONFIG_NETUTILS_MQTTC),)
	CFLAGS += -I$(LIBWEBSOCKETS_UNPACK)/lib/roles/mqtt

	CSRCS += \
	$(LIBWEBSOCKETS_UNPACK)/lib/roles/mqtt/mqtt.c \
	$(LIBWEBSOCKETS_UNPACK)/lib/roles/mqtt/ops-mqtt.c \
	$(LIBWEBSOCKETS_UNPACK)/lib/roles/mqtt/primitives.c \
	$(LIBWEBSOCKETS_UNPACK)/lib/roles/mqtt/client/client-mqtt.c \
	$(LIBWEBSOCKETS_UNPACK)/lib/roles/mqtt/client/client-mqtt-handshake.c
endif

ifneq ($(CONFIG_NETUTILS_LIBWEBSOCKETS_TEST),)
	LIBWEBSOCKETS_API_TEST_DIR   = $(LIBWEBSOCKETS_UNPACK)/minimal-examples/api-tests
	LIBWEBSOCKETS_HTTP_CLIENT_TEST_DIR   = $(LIBWEBSOCKETS_UNPACK)/minimal-examples/http-client
	LIBWEBSOCKETS_WS_CLIENT_TEST_DIR   = $(LIBWEBSOCKETS_UNPACK)/minimal-examples/ws-client

	PRIORITY  = SCHED_PRIORITY_DEFAULT
	STACKSIZE = $(CONFIG_NETUTILS_LIBWEBSOCKETS_TEST_STACKSIZE)
	MODULE    = $(CONFIG_NETUTILS_LIBWEBSOCKETS_TEST)
	MAINSRC  += $(LIBWEBSOCKETS_API_TEST_DIR)/api-test-lejp/main.c
	PROGNAME += libwebsockets_test_lejp

	MAINSRC  += $(LIBWEBSOCKETS_API_TEST_DIR)/api-test-lws_tokenize/main.c
	PROGNAME += libwebsockets_test_lws_tokenize

	MAINSRC  += $(LIBWEBSOCKETS_API_TEST_DIR)/api-test-lws_map/main.c
	PROGNAME += libwebsockets_test_lws_map

	MAINSRC  += $(LIBWEBSOCKETS_API_TEST_DIR)/api-test-lwsac/main.c
	PROGNAME += libwebsockets_test_lwsac

	MAINSRC  += $(LIBWEBSOCKETS_API_TEST_DIR)/api-test-lws_cache/main.c
	PROGNAME += libwebsockets_test_lws_cache

	CSRCS    += \
		$(LIBWEBSOCKETS_UNPACK)/lib/misc/lecp.c \
		$(LIBWEBSOCKETS_UNPACK)/lib/misc/ieeehalfprecision.c
	MAINSRC  += $(LIBWEBSOCKETS_API_TEST_DIR)/api-test-lecp/main.c
	PROGNAME += libwebsockets_test_lws_lecp

	CSRCS    += $(LIBWEBSOCKETS_UNPACK)/lib/core-net/lws-dsh.c
	MAINSRC  += $(LIBWEBSOCKETS_API_TEST_DIR)/api-test-lws_dsh/main.c
	PROGNAME += libwebsockets_test_lws_dsh

	CSRCS    += \
		$(LIBWEBSOCKETS_API_TEST_DIR)/api-test-lws_struct-json/test2.c \
		$(LIBWEBSOCKETS_UNPACK)/lib/misc/lws-struct-lejp.c
	MAINSRC  += $(LIBWEBSOCKETS_API_TEST_DIR)/api-test-lws_struct-json/main.c
	PROGNAME += libwebsockets_test_lws_struct_json

	MAINSRC  += $(LIBWEBSOCKETS_HTTP_CLIENT_TEST_DIR)/minimal-http-client/minimal-http-client.c
	PROGNAME += libwebsockets_test_lws_http_client

	MAINSRC  += $(LIBWEBSOCKETS_HTTP_CLIENT_TEST_DIR)/minimal-http-client-certinfo/minimal-http-client-certinfo.c
	PROGNAME += libwebsockets_test_lws_http_client_certinfo

	MAINSRC  += $(LIBWEBSOCKETS_HTTP_CLIENT_TEST_DIR)/minimal-http-client-h2-rxflow/minimal-http-client.c
	PROGNAME += libwebsockets_test_lws_http_client_h2_rxflow

	MAINSRC  += $(LIBWEBSOCKETS_HTTP_CLIENT_TEST_DIR)/minimal-http-client-hugeurl/minimal-http-client-hugeurl.c
	PROGNAME += libwebsockets_test_lws_http_client_hugeurl

	MAINSRC  += $(LIBWEBSOCKETS_HTTP_CLIENT_TEST_DIR)/minimal-http-client-multi/minimal-http-client-multi.c
	PROGNAME += libwebsockets_test_lws_http_client_multi

	MAINSRC  += $(LIBWEBSOCKETS_HTTP_CLIENT_TEST_DIR)/minimal-http-client-post/minimal-http-client-post.c
	PROGNAME += libwebsockets_test_lws_http_client_post

	MAINSRC  += $(LIBWEBSOCKETS_WS_CLIENT_TEST_DIR)/minimal-ws-client/minimal-ws-client.c
	PROGNAME += libwebsockets_test_lws_ws_client

	MAINSRC  += $(LIBWEBSOCKETS_WS_CLIENT_TEST_DIR)/minimal-ws-client-ping/minimal-ws-client-ping.c
	PROGNAME += libwebsockets_test_lws_ws_client_ping

	MAINSRC  += $(LIBWEBSOCKETS_WS_CLIENT_TEST_DIR)/minimal-ws-client-rx/minimal-ws-client.c
	PROGNAME += libwebsockets_test_lws_ws_client_rx

	MAINSRC  += $(LIBWEBSOCKETS_WS_CLIENT_TEST_DIR)/minimal-ws-client-spam/minimal-ws-client-spam.c
	PROGNAME += libwebsockets_test_lws_ws_client_spam
endif

ifeq ($(wildcard $(LIBWEBSOCKETS_UNPACK)/.git),)
$(LIBWEBSOCKETS_TARBALL):
	$(Q) echo "Downloading libwebsockets-$(LIBWEBSOCKETS_VERSION)"
	$(Q) curl -O -L $(LIBWEBSOCKETS_URL)/$(LIBWEBSOCKETS_TARBALL)

$(LIBWEBSOCKETS_UNPACK): $(LIBWEBSOCKETS_TARBALL)
	$(Q) echo "Unpacking: $(LIBWEBSOCKETS_TARBALL) -> $(LIBWEBSOCKETS_UNPACK)"
	$(Q) tar zxf $(LIBWEBSOCKETS_TARBALL)
	$(Q) mv libwebsockets-$(LIBWEBSOCKETS_VERSION) $(LIBWEBSOCKETS_UNPACK)
	$(Q) echo "Patching $(LIBWEBSOCKETS_UNPACK)"
	$(Q) patch -p0 < libwebsockets.patch
	$(Q) touch $(LIBWEBSOCKETS_UNPACK)

context:: $(LIBWEBSOCKETS_UNPACK)

distclean::
	$(call DELFILE, $(LIBWEBSOCKETS_TARBALL))
	$(call DELDIR, $(LIBWEBSOCKETS_UNPACK))
endif

include $(APPDIR)/Application.mk
