#
#    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 Weave in-package,
#      tuned OpenSSL library.
#
#      This serves as "glue" or a proxy from the Weave build system to
#      the OpenSSL build system.
#

include $(abs_top_nlbuild_autotools_dir)/automake/pre.am

if WEAVE_WITH_OPENSSL_INTERNAL
#
# The OpenSSL build system relies on the built-in make variables to
# ensure that ARFLAGS is set such that archive libraries can be
# successfully created.
#
# Consequently, if make is invoked with -R or --no-builtin-variables
# or if MAKEFLAGS contains -R or --no-builtin-variables, then ARFLAGS
# will be unset and OpenSSL will cryptically fail to build.
#
# Attempt to detect this condition and provide the user with a
# corrective action when detected.
#

$(info Checking ARFLAGS...)

IsVariable        = $(findstring $(2),$(origin $(1)))
IsVariableDefault = $(call IsVariable,$(1),default)

$(if $(call IsVariableDefault,ARFLAGS),$(info ARFLAGS is '$(ARFLAGS)', OpenSSL should build correctly),$(error MAKEFLAGS is '$(MAKEFLAGS)' and ARFLAGS is '$(ARFLAGS)'. Your environment may have MAKEFLAGS set with '-R' or '--no-builtin-variables' set from another build system. This prevents the OpenSSL build system from picking up ARFLAGS from make default variables. Please try unsetting MAKEFLAGS from your environment before invoking make.))
endif # WEAVE_WITH_OPENSSL_INTERNAL

EXTRA_DIST                           = \
    README.third_party                 \
    openssl                            \
    openssl.url                        \
    openssl.version                    \
    patches                            \
    $(NULL)

if WEAVE_WITH_OPENSSL_INTERNAL

# OpenSSL preprocessor definitions applicable for all target for the
# in-package OpenSSL.
#
# Pick up any target-specific preprocessor definitions that might be
# required.

WEAVE_OPENSSL_DEFINES                = $(WEAVE_OPENSSL_TARGET_DEFINES)

# Tell the OpenSSL configuration script what features we do and do not
# want enabled.

WEAVE_OPENSSL_DISABLE_OPTIONS	     = no-asm no-engine no-dso no-shared no-apps no-test no-ssl no-tools no-async

WEAVE_OPENSSL_ENABLE_OPTIONS	     = 

WEAVE_OPENSSL_OPTIONS		     = \
    $(WEAVE_OPENSSL_DISABLE_OPTIONS)   \
    $(WEAVE_OPENSSL_ENABLE_OPTIONS)

# OpenSSL generally does a poor job of maintaining the sanctity of its
# source files across configuration and build, overwriting the package
# defaults with the user's selection.
#
# This causes unnecessary changes to appear if OpenSSL has been
# imported under active source code control.

openssl_builddir                     = $(builddir)/$(openssl_buildstem)
abs_openssl_builddir                 = $(abs_builddir)/$(openssl_buildstem)

# Sentinel files used for shadowing and configuring the package.


OPENSSL_SHADOW_SENTINEL		     = $(openssl_builddir)/.shadow-stamp
OPENSSL_CONFIG_SENTINEL		     = $(abs_openssl_builddir)/.configure-stamp

#
# GNU autoconf/automake targets proxied to the OpenSSL makefile.
#

# For the local 'all' target, build the OpenSSL source.

all-local: build-local

# OpenSSL doesn't intrinsically support non-colocated source and build
# directories, so shadow the source directory to the build directory.
#
# Use a dedicated sentinel stamp file to ensure the job is
# done. Attempts to use an actual shadowed file (e.g. Configure) will
# fail with non-colocated source and build directories because VPATH
# will believe it to already be satisfied. Finally, ensure that the
# shadowed tree is user-writable so that operations like 'make
# distcheck' succeed. In such an an environment, the source tree is
# read-only and shadowing it will otherwise create a read-only shadow
# copy.

$(dir $(OPENSSL_SHADOW_SENTINEL)):
	$(create-directory)

$(OPENSSL_SHADOW_SENTINEL): | $(dir $(OPENSSL_SHADOW_SENTINEL))
	@echo "  LNDIR    $(srcdir)"
	$(AM_V_at)$(LNDIR) $(abs_srcdir)/openssl/. $(@D)
	@echo "  CHMOD     $(srcdir)"
	$(AM_V_at)chmod -R u+w $(@D)
	$(AM_V_at)echo "sentinel stamp for openssl shadow" > $(@)

.PHONY: shadow-local
shadow-local: $(OPENSSL_SHADOW_SENTINEL)

# OpenSSL requires configuration prior to building. Configure it
# appropriately for the target system, shadowing the source first
# if necessary.
#
# Note that, particularly for double-dash C compiler flags such as
# --sysroot, OpenSSL Configure will error out if compiler flags are
# placed anywhere other than at the end as os[/compiler][:flags] as
# shown below.
#
# There are no sentinel files created anew after configuration
# different from those prior to configuration. Consequently, create
# out own sentinel file.

$(OPENSSL_CONFIG_SENTINEL): $(OPENSSL_SHADOW_SENTINEL)
	@echo "  CONFIG   $(WEAVE_OPENSSL_TARGET)"
	$(AM_V_CONFIG)cd $(abs_openssl_builddir) && \
                INSTALL="$(INSTALL)" \
		CFLAGS="$(CFLAGS)" \
		LDFLAGS="$(LDFLAGS)" \
		./Configure \
		--prefix=/ \
		--openssldir=/openssl \
		$(VISIBILITY_CFLAGS) \
		$(WEAVE_OPENSSL_OPTIONS) \
		$(WEAVE_OPENSSL_DEFINES) \
		$(WEAVE_OPENSSL_TARGET)
	$(AM_V_at)echo "sentinel stamp for openssl configuration" > $(@)

.PHONY: configure-local
configure-local: $(OPENSSL_CONFIG_SENTINEL)

#
# MakeOpenSSLWithTarget <OpenSSL Target> [<Verbose Target>]
#
# This invokes make against the specified OpenSSL target displaying
# that target or, if provided, the optional "verbose" target as the
# verbose output.

define MakeOpenSSLWithTarget
@echo "  SUBDIR   $(openssl_builddir)"
@echo "  MAKE     $(if $(2),$(2),$(1))"
$(AM_V_at)$(MAKE) $(AM_MAKEFLAGS) -C $(abs_openssl_builddir) \
        CC="$(CC) $(CFLAGS)" AR="$(AR) $(ARFLAGS)" RANLIB=$(RANLIB) \
        CROSS_TOP="$(CROSS_TOP)" \
        CROSS_SDK="$(CROSS_SDK)" \
        CROSS_SYSROOT="$(CROSS_SYSROOT)" \
        DESTDIR="$(DESTDIR)" \
        INSTALLTOP="$(prefix)" \
        $(1)
endef # MakeOpenSSLWithTarget

# Build the configured OpenSSL source.

.PHONY: build-local
build-local: configure-local
	$(call MakeOpenSSLWithTarget, all)

# Install (stage) the built OpenSSL source.

stage-local: build-local
	$(call MakeOpenSSLWithTarget, install_sw, install)

install-data-local: stage-local

install-headers: stage-local

# Uninstall (to support the 'distcheck' and 'distuninstallcheck' targets)

unstage-local:
	$(call MakeOpenSSLWithTarget, uninstall_sw, uninstall)

uninstall: unstage-local

# Clean things up to the requested level.

clean-local:
	$(AM_V_at)if test -d "$(abs_openssl_builddir)"; then \
	    echo "  SUBDIR   $(openssl_builddir)"; \
	    echo "  MAKE     clean";               \
	    $(MAKE) $(AM_MAKEFLAGS) -C $(abs_openssl_builddir) clean; \
	fi

# Remove the entirety of the OpenSSL build directory for the
# 'distclean' target.

distclean-local:
	@echo "  RM       $(openssl_builddir)"
	$(AM_V_at)rm -r -f $(openssl_builddir)

endif # WEAVE_WITH_OPENSSL_INTERNAL

include $(abs_top_nlbuild_autotools_dir)/automake/post.am
