# Copyright 2017 The Fuchsia Authors
#
# Use of this source code is governed by a MIT-style
# license that can be found in the LICENSE file or at
# https://opensource.org/licenses/MIT

# check for disallowed options
ifneq ($(MODULE_DEPS)$(MODULE_LIBS)$(MODULE_STATIC_LIBS)$(MODULE_FIDL_LIBS)$(MODULE_BANJO_LIBS),)
$(error $(MODULE) $(MODULE_TYPE) modules must not use MODULE_{DEPS,LIBS,STATIC_LIBS,FIDL_LIBS,BANJO_LIBS})
endif

# default install location
ifeq ($(MODULE_HOSTAPP_BIN),)
MODULE_HOSTAPP_BIN := $(BUILDDIR)/tools/$(MODULE_NAME)
endif

MODULE_ALIBS := $(foreach lib,$(MODULE_HOST_LIBS), \
                          $(call TOBUILDDIR,tools/lib/lib$(notdir $(lib)).a))

$(MODULE_HOSTAPP_BIN): _OBJS := $(MODULE_OBJS)
$(MODULE_HOSTAPP_BIN): _LIBS := $(MODULE_ALIBS) $(MODULE_HOST_SYSLIBS)
$(MODULE_HOSTAPP_BIN): _LDFLAGS := $(foreach opt,$(MODULE_LDFLAGS),-Wl,$(opt))
$(MODULE_HOSTAPP_BIN): $(MODULE_OBJS) $(MODULE_ALIBS)
	@$(MKDIR)
	$(call BUILDECHO,linking hostapp $@)
	$(NOECHO)$(HOST_CXX) -o $@ $(HOST_COMPILEFLAGS) $(_LDFLAGS) $(HOST_LDFLAGS) \
		$(_OBJS) $(_LIBS)

ifeq ($(filter bin,$(MODULE_PACKAGE)),bin)
MODULE_PKG_FILE := $(MODULE_BUILDDIR)/$(MODULE_NAME).pkg
MODULE_EXP_FILE := $(BUILDDIR)/export/$(MODULE_NAME).pkg

MODULE_PKG_BIN := $(MODULE_NAME)=$(patsubst $(BUILDDIR)/%,BUILD/%,$(MODULE_HOSTAPP_BIN))

$(MODULE_PKG_FILE): _NAME := $(MODULE_NAME)
$(MODULE_PKG_FILE): _BIN := $(MODULE_PKG_BIN)
$(MODULE_PKG_FILE): $(MODULE_RULESMK) make/module-hostapp.mk
	@$(call BUILDECHO,creating package $@ ;)\
	$(MKDIR) ;\
	echo "[package]" > $@ ;\
	echo "name=$(_NAME)" >> $@ ;\
	echo "type=tool" >> $@ ;\
	echo "arch=host" >> $@ ;\
	echo "[bin]" >> $@ ;\
	echo "$(_BIN)" >> $@

$(MODULE_EXP_FILE): $(MODULE_PKG_FILE)
	@$(MKDIR) ;\
	if [ -f "$@" ]; then \
		if ! cmp "$<" "$@" >/dev/null 2>&1; then \
			$(if $(BUILDECHO),echo installing $@ ;)\
			cp -f $< $@; \
		fi \
	else \
		$(if $(BUILDECHO),echo installing $@ ;)\
		cp -f $< $@; \
	fi

GENERATED += $(MODULE_EXP_FILE) $(MODULE_PKG_FILE)
ALLPKGS += $(MODULE_EXP_FILE)

endif


ALLHOST_APPS += $(MODULE_HOSTAPP_BIN)

GENERATED += $(MODULE_HOSTAPP_BIN)

MODULE_HOSTAPP_BIN :=
