# Copyright 2016 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

ifneq ($(MODULE_DEPS)$(MODULE_HOST_LIBS)$(MODULE_HOST_SYSLIBS),)
$(error $(MODULE) $(MODULE_TYPE) fidl modules must use MODULE_FIDL_DEPS)
endif

# build static library
$(MODULE_LIBNAME).a: $(MODULE_FIDL_OBJS)
	@$(MKDIR)
	$(call BUILDECHO,linking $@)
	@rm -f -- "$@"
	$(call BUILDCMD,$(AR),cr $@ $^)

# always build all libraries
EXTRA_BUILDDEPS += $(MODULE_LIBNAME).a make/module-fidl.mk
GENERATED += $(MODULE_LIBNAME).a

MODULE_RULESMK := $(MODULE_SRCDIR)/rules.mk

ifeq ($(filter fidl,$(MODULE_EXPORT)),fidl)
MODULE_PACKAGE += $(sort $(MODULE_PACKAGE) fidl)
endif

ifneq ($(strip $(MODULE_PACKAGE)),)

MODULE_PKG_FILE := $(MODULE_BUILDDIR)/$(MODULE_NAME).pkg
MODULE_EXP_FILE := $(BUILDDIR)/export/$(MODULE_NAME).pkg

MODULE_PKG_SRCS := $(MODULE_SRCS)
MODULE_PKG_DEPS := $(MODULE_FIDL_DEPS)

ifneq ($(strip $(MODULE_PKG_DEPS)),)
MODULE_PKG_DEPS := $(foreach dep,$(MODULE_FIDL_DEPS),$(patsubst system/fidl/%,%,$(dep))=SOURCE/$(dep))
endif

ifneq ($(strip $(MODULE_PKG_SRCS)),)
MODULE_PKG_SRCS := $(foreach src,$(MODULE_PKG_SRCS),$(patsubst $(MODULE_SRCDIR)/%,%,$(src))=SOURCE/$(src))
MODULE_PKG_TAG := "[fidl]"
endif

$(MODULE_PKG_FILE): _NAME := $(MODULE_NAME)
$(MODULE_PKG_FILE): _LIBRARY := $(MODULE_FIDL_LIBRARY)
$(MODULE_PKG_FILE): _SRCS := $(if $(MODULE_PKG_SRCS),$(MODULE_PKG_TAG) $(sort $(MODULE_PKG_SRCS)))
$(MODULE_PKG_FILE): _DEPS := $(if $(MODULE_PKG_DEPS),"[fidl-deps]" $(sort $(MODULE_PKG_DEPS)))
$(MODULE_PKG_FILE): $(MODULE_RULESMK) make/module-fidl.mk
	@$(call BUILDECHO,creating fidl library package $@ ;)\
	$(MKDIR) ;\
	echo "[package]" > $@ ;\
	echo "name=$(_NAME)" >> $@ ;\
	echo "library=$(_LIBRARY)" >> $@ ;\
	echo "arch=fidl" >> $@ ;\
	echo "type=fidl" >> $@ ;\
	for i in $(_SRCS) ; do echo "$$i" >> $@ ; done ;\
	for i in $(_DEPS) ; do echo "$$i" >> $@ ; done


$(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 # // ifneq ($(strip $(MODULE_PACKAGE)),)
