#
#    Copyright (c) 2014-2017 Nest Labs, Inc.
#    All rights reserved.
#
#    Licensed 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.
#

#
#    Description:
#      This file is the GNU automake template for the Nest Weave
#      Device Manager Python script binding module.
#
#      NOTE: The Python module loader cannot differentiate between
#            WeaveDeviceMgr.py and WeaveDeviceMgr.so when attempting
#            to import WeaveDeviceMgr. Consequently, we follow typical
#            Python convention and name the DLL/DSO with a leading
#            underscore (_) to disambiguate them when they are sitting
#            in the same directory during development.
#

include $(abs_top_nlbuild_autotools_dir)/automake/pre.am

define set-relocation-path
	$(AM_V_at)if [[ "$(target_os)" == darwin* ]]; then \
	    install_name_tool -change `otool -L $(1) | grep -Eo '.*$(2)'` $(call Slashify,$(3))$(2) $(1) ; \
	fi
endef # change-library-paths


EXTRA_DIST                                        = \
    weave-device-mgr.py                             \
    $(NULL)

if WEAVE_WITH_PYTHON
pyexec_LTLIBRARIES                                = _WeaveDeviceMgr.la

noinst_HEADERS                                    = \
    $(NULL)

_WeaveDeviceMgr_la_SOURCES                        = \
    WeaveDeviceManager-ScriptBinding.cpp            \
    $(NULL)

_WeaveDeviceMgr_la_CPPFLAGS                       = \
    -I$(srcdir)/..                                  \
    $(LWIP_CPPFLAGS)                                \
    $(SOCKETS_CPPFLAGS)                             \
    $(NULL)

_WeaveDeviceMgr_la_LIBADD                         = \
    ../libWeaveDeviceManager.la                     \
    -L$(top_builddir)/src/lib -lWeave               \
    $(NULL)

_WeaveDeviceMgr_la_DEPENDENCIES                   = \
    $(top_builddir)/src/lib/libWeave.a              \
    $(NULL)

_WeaveDeviceMgr_la_LDFLAGS                        = \
    -avoid-version                                  \
    -module                                         \
    -no-undefined                                   \
    $(NULL)

weavedir                                          = $(pyexecdir)/weave

modules                                           = \
    WeaveDeviceMgr.py                               \
    $(NULL)

if CONFIG_NETWORK_LAYER_BLE

noinst_HEADERS                                   += \
    WeaveDeviceManager-BleApplicationDelegate.h     \
    WeaveDeviceManager-BlePlatformDelegate.h        \
    $(NULL)

_WeaveDeviceMgr_la_SOURCES                       += \
    WeaveDeviceManager-BlePlatformDelegate.cpp      \
    WeaveDeviceManager-BleApplicationDelegate.cpp   \
    $(NULL)

modules                                          += \
    WeaveBleBase.py                                    \
    WeaveCoreBluetoothMgr.py                        \
    WeaveBluezMgr.py                                \
    WeaveBleUtility.py                              \
    $(NULL)

endif # CONFIG_NETWORK_LAYER_BLE

srcmodules                                        = $(addprefix $(srcdir)/,$(modules))
buildmodules                                      = $(addprefix $(builddir)/,$(modules))
cleanmodules                                      = $(if $(call IsRealPath,$(buildmodules)),,$(buildmodules))

weave_SCRIPTS                                     = \
    $(modules)                                      \
    $(NULL)

weave_PYTHON                                      = \
    $(weave_SCRIPTS)                                \
    $(NULL)

# Tool scripts that should be installed when the 'install' target is run.
#
# These will be part of the externally-consumable SDK.
#
# These need to go in libexec since they need to be "trampolined"
# through the 'weave-run' script due to runtime dependencies on
# DLLs/DSOs that the runtime linker / loader will need to resolve when
# they invoked.

libexec_SCRIPTS                                   = \
    weave-device-mgr                                \
    $(NULL)

# Create a convenience link between the suffixed script and the actual
# name by which the script will be installed for non-co-located build
# and source directories.

%: %.py
	$(AM_V_LN_S)$(LN_S) $(<) $(@)

# The bin_LINKS variable enumerates programs that need to be
# "trampolined" through the 'weave-run' script due to runtime
# dependencies on DLLs/DSOs that the runtime linker / loader will need
# to resolve when they invoked.

bin_LINKS                                         = \
    $(libexec_SCRIPTS)                              \
    $(NULL)

CLEANFILES                                        = \
    $(libexec_SCRIPTS)                              \
    _WeaveDeviceMgr.so                              \
    $(cleanmodule)                                  \
    $(NULL)

# Create convenience links so that those that are doing Weave Device
# Manager development can run the script right from this directory,
# picking up both the Python module and the DLL/DSO, without having to
# do a 'make install'.
#
# Because of automake's VPATH getting in our way, we need to play a
# "trick" to get the "buildmodule" DLL/DSO link to work.

all-local: _WeaveDeviceMgr.so $(buildmodule)

_WeaveDeviceMgr.so: _WeaveDeviceMgr.la
	$(AM_V_LN_S)$(LN_S) -f .libs/$(@) $(@)
	$(AM_V_at)if test "${srcmodule}" != "${buildmodule}" && \
           ! test -L "${buildmodule}"; then \
	    echo "  LN       ${buildmodule}"; \
	    $(LN_S) "${srcmodule}" "${buildmodule}"; \
        fi
	$(call set-relocation-path,$(@),libWeaveDeviceManager.$(LIBWEAVE_VERSION_CURRENT).dylib,@loader_path/../.libs/)

install-exec-local: install-exec-binLINKS

uninstall-local: uninstall-exec-binLINKS

install-exec-binLINKS: $(bin_LINKS)
	@$(NORMAL_INSTALL)
	@list='$(bin_LINKS)'; test -n "$(bindir)" || list=; \
	if test -n "$$list"; then \
          echo "  MKDIR    $(DESTDIR)$(bindir)"; \
	  $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \
	fi; \
	for link in $${list}; do \
            echo "  LN       $${link}"; \
	    $(LN_S) -f "../`echo ${libexecdir} | sed -e 's,${exec_prefix}/,,g'`/weave-run" "$(DESTDIR)$(bindir)/$${link}"; \
        done

uninstall-exec-binLINKS: $(bin_LINKS)
	@$(NORMAL_UNINSTALL)
	@list='$(bin_LINKS)'; test -n "$(bindir)" || exit 0; \
	files=`for p in $$list; do echo "$$p"; done | \
	       sed -e 's,.*/,,;$(transform)'`; \
	dir='$(DESTDIR)$(bindir)'; $(am__uninstall_files_from_dir)

install-exec-hook:
	$(call set-relocation-path,$(DESTDIR)$(pyexecdir)/_WeaveDeviceMgr.so,libWeaveDeviceManager.$(LIBWEAVE_VERSION_CURRENT).dylib,@loader_path/../)

endif # WEAVE_WITH_PYTHON

include $(abs_top_nlbuild_autotools_dir)/automake/post.am
