############################################################################
# apps/system/psmq/Makefile
#
#   Copyright (C) 2019 Michał Łyszczek. All rights reserved.
#   Author: Michał Łyszczek <michal.lyszczek@bofc.pl>
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
#
# 1. Redistributions of source code must retain the above copyright
#    notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
#    notice, this list of conditions and the following disclaimer in
#    the documentation and/or other materials provided with the
#    distribution.
# 3. Neither the name NuttX nor the names of its contributors may be
#    used to endorse or promote products derived from this software
#    without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
# OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
#
############################################################################

-include $(TOPDIR)/Make.defs

WGET = wget
CP = cp -R
UNPACK = tar -xzf
PACKEXT = .tar.gz
NXTOOLSDIR = $(APPDIR)/tools

PSMQ_URL = https://distfiles.kurwinet.pl/psmq
PSMQ_VERSION = 0.1.0
PSMQ_SRC_SHA256 = 52dce7d6fcbf84243e11afdb953eea6a6eb405fd81c8e71bc556bb63090e1284
PSMQ_EXT = tar.gz
PSMQ_SOURCES = psmq-$(PSMQ_VERSION)
PSMQ_TARBALL = $(PSMQ_SOURCES).$(PSMQ_EXT)

CFLAGS += -I$(APPDIR)/include/system
CFLAGS += -I$(APPDIR)/system/psmq/$(PSMQ_SOURCES)

# mandatory source files to compile
CSRCS = $(PSMQ_SOURCES)/lib/psmq.c \
	$(PSMQ_SOURCES)/src/broker.c \
	$(PSMQ_SOURCES)/src/cfg.c \
	$(PSMQ_SOURCES)/src/globals.c \
	$(PSMQ_SOURCES)/src/psmqd.c \
	$(PSMQ_SOURCES)/src/topic-list.c

# optional source files to compile depending on Kconfig options
ifeq ($(CONFIG_PSMQ_TOOLS_PUB),y)
	CSRCS += $(PSMQ_SOURCES)/src/psmq-pub.c
endif

ifeq ($(CONFIG_PSMQ_TOOLS_SUB),y)
	CSRCS += $(PSMQ_SOURCES)/src/psmq-sub.c
endif

# compile-time options from Kconfig
CFLAGS += -DPSMQ_MAX_CLIENTS=$(CONFIG_PSMQ_MAX_CLIENTS)
CFLAGS += -DPSMQ_PAYLOAD_MAX=$(CONFIG_PSMQ_PAYLOAD_MAX)
CFLAGS += -DPSMQ_TOPIC_MAX=$(CONFIG_PSMQ_TOPIC_MAX)

# build psmq as library and disable standalone applications (apps will
# still be compiled but into shared library rather than standalone application
CFLAGS += -DPSMQ_LIBRARY=1
CFLAGS += -DPSMQ_STANDALONE=0

# psmq cannot be damonized in nuttx
CFLAGS += -DPSMQ_ENABLE_DAEMON=0

# nuttx has no opterr variable
CFLAGS += -DPSMQ_NO_OPTERR=1

# nuttx does not really support signals, so disable them. There will be no way
# to gently kill programs.
CFLAGS += -DPSMQ_NO_SIGNALS=1

# package string needed by tools when passing '-v' option
CFLAGS += -DPACKAGE_STRING="\"psmq $(PSMQ_VERSION)\""
CFLAGS += -DPACKAGE_VERSION=\"$(PSMQ_VERSION)\"

# register psmqd broker daemon application
PRIORITY = $(CONFIG_PSMQD_PRIORITY)
STACKSIZE = $(CONFIG_PSMQD_STACKSIZE)
APPNAME = psmqd
PROGNAME = psmqd$(EXEEXT)

# register psmq_pub application if it was enabled
ifeq ($(CONFIG_PSMQ_TOOLS_PUB),y)
	PRIORITY += $(CONFIG_PSMQ_PUB_PRIORITY)
	STACKSIZE += $(CONFIG_PSMQ_PUB_STACKSIZE)
	APPNAME += psmq_pub
	PROGNAME += psmq_pub$(EXEEXT)
endif

# register psmq_sub application if it was enabled
ifeq ($(CONFIG_PSMQ_TOOLS_SUB),y)
	PRIORITY += $(CONFIG_PSMQ_SUB_PRIORITY)
	STACKSIZE += $(CONFIG_PSMQ_SUB_STACKSIZE)
	APPNAME += psmq_sub
	PROGNAME += psmq_sub$(EXEEXT)
endif

# download and build psmq

$(PSMQ_TARBALL):
	@echo "Downloading: $@"
	$(Q) $(WGET) -O $@ $(PSMQ_URL)/$@
	$(Q) $(NXTOOLSDIR)/check-hash.sh sha256 $(PSMQ_SRC_SHA256) $@
	$(Q) touch $@

$(PSMQ_SOURCES): $(PSMQ_TARBALL)
	@echo "Unpacking $< -> $@"
	$(Q) $(call DELDIR, $@)
	$(Q) $(UNPACK) $<
	$(Q) touch $@

create_includes:
	$(Q) $(CP) $(PSMQ_SOURCES)/inc/psmq.h $(APPDIR)/include/system

context:: $(PSMQ_SOURCES)
	$(Q) $(MAKE) create_includes

clean::
	$(Q) $(call DELFILE, $(APPDIR)/include/system/psmq.h)
	$(Q) $(foreach COBJ, $(COBJS), $(call DELFILE, $(COBJ)))

distclean::
	$(Q) $(call DELDIR, $(PSMQ_SOURCES))
	$(Q) $(call DELDIR, $(PSMQ_TARBALL))

include $(APPDIR)/Application.mk
