#
#    Copyright (c) 2010-2012 Nest, Inc.
#    All rights reserved.
#
#    This document is the property of Nest. It is considered
#    confidential and proprietary information.
#
#    This document may not be reproduced or transmitted in any form,
#    in whole or in part, without the express written permission of
#    Nest.
#
#    Description:
#      This file is the makefile for the Open Secure Socket Layer
#      (SSL) library.
#

BuildConfigSpecialized	:= No

include pre.mak

PackageName		:= openssl

PackageExtension	:= tar.gz
PackageSeparator	:= -

PackagePatchArgs	:= -p1

PackageArchive		:= $(PackageName).$(PackageExtension)
PackageSourceDir	:= $(PackageName)$(PackageSeparator)$(PackageVersion)

PackageBuildMakefile	= $(call GenerateBuildPaths,Makefile)

CleanPaths		+= $(PackageLicenseFile)

LinuxDir		:= sw/tps/linux
LinuxIncDir		:= $(call GenerateResultPaths,$(LinuxDir),include)

ZlibDir			:= sw/tps/zlib
ZlibIncDir      	:= $(call GenerateResultPaths,$(ZlibDir),usr/include)
ZlibLibDir      	:= $(call GenerateResultPaths,$(ZlibDir),usr/lib)

CLibraryDir                    := sw/tps/newlib
CLibraryIncludeDir             := $(call GenerateResultPaths,$(CLibraryDir),usr/arm-none-eabi/include)
CLibraryLibDir                 := $(call GenerateResultPaths,$(CLibraryDir),usr/arm-none-eabi/lib)

all: $(PackageDefaultGoal)

# Generate the package license contents.

$(PackageSourceDir)/LICENSE: source

$(PackageLicenseFile): $(PackageSourceDir)/LICENSE
	$(copy-result)

# Extract the source from the archive and apply patches, if any.

$(PackageSourceDir): $(PackageArchive) $(PackagePatchPaths)
	$(expand-and-patch-package)

# Prepare the sources.

.PHONY: source
source: | $(PackageSourceDir)

# Patch the sources, if necessary.

.PHONY: patch
patch: source

$(PackageBuildMakefile): | $(PackageSourceDir) $(BuildDirectory)
	$(call create-links,$(CURDIR)/$(PackageSourceDir),$(BuildDirectory))

# Configure the source for building.

OpenSSLTargetConfig   = gcc

ifneq ($(CONFIG_OSM_HOST),1)
OpenSSLPackageOptions = $(MACHFLAGS) \
						-DDEVRANDOM= -DNO_SYSLOG -DNO_CHMOD -DNO_MEMORY_H

OpenSSLCC_LD	      = CC="$(CC)" LD=$(LD) LDFLAGS="$(LDFLAGS)"

OpenSSLCCFlags        =	$(MACHFLAGS) -Wno-unused-value \
						-Wno-implicit-function-declaration

OpenSSLCCFlags        += no-asm no-threads no-shared no-zlib no-idea no-camellia no-seed no-bf no-cast \
			 no-des no-rc2 no-rc4 no-rc5 no-md2 no-md4 no-ripemd no-mdc2 no-rsa no-dsa no-dh \
			 no-sock no-dgram no-ssl2 no-ssl3 no-err no-krb5 no-engine no-hw no-dso \
			 no-devrandom no-sha512 no-dir no-egd
			 
ifeq ($(BuildProduct),topaz)

OpenSSLCCFlags        += no-ecdh no-tty

endif

OpenSSLCCFlags	      += $(call ToolGenerateIncludeArgument,$(CLibraryIncludeDir))

OpenSSLTargets	      = build_crypto
OpenSSLInstallTargets = install_crypto
else
OpenSSLTargets	      = all
OpenSSLInstallTargets = install
endif

.PHONY: configure
configure: source $(PackageBuildMakefile)
	$(Verbose)cd $(BuildDirectory) && \
	$(OpenSSL_LD) \
	./Configure \
	--prefix=/usr \
	--openssldir=/usr/lib/ssl \
	shared \
	zlib \
	$(call ToolGenerateIncludeArgument,$(ZlibIncDir)) \
	$(call ToolGenerateLibraryPathArgument,$(ZlibLibDir)) \
	$(OpenSSLPackageOptions) \
	$(OpenSSLCCFlags) \
	$(OpenSSLTargetConfig)

# Build the source.
#
# We have to unset MAKEFLAGS since they confuse the package build otherwise.

.PHONY: build
build: configure | $(BuildDirectory)
	$(Verbose)unset MAKEFLAGS && \
	$(MAKE) -C $(BuildDirectory) \
	CC="$(CC)" AR="$(AR) $(ARFLAGS)" RANLIB=$(RANLIB) \
	INSTALL_PREFIX=$(ResultDirectory) \
	$(OpenSSLTargets)

# Stage the build to a temporary installation area.
#
# We have to unset MAKEFLAGS since they confuse the package build otherwise.

.PHONY: stage
stage: build | $(ResultDirectory)
	$(Verbose)unset MAKEFLAGS && \
	$(MAKE) -C $(BuildDirectory) \
	CC="$(CC)" AR="$(AR) $(ARFLAGS)" RANLIB=$(RANLIB) \
	INSTALL_PREFIX=$(ResultDirectory) \
	$(OpenSSLInstallTargets)

clean:
	$(Verbose)$(RM) $(RMFLAGS) -r $(PackageSourceDir)
	$(Verbose)$(RM) $(RMFLAGS) -r $(BuildDirectory)
	$(Verbose)$(RM) $(RMFLAGS) -r $(ResultDirectory)

include post.mak
