#
#    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 library and command line
#      utility for transferring files with URL syntax, libcurl and
#      curl, respectively.
#

include pre.mak

PackageName		:= curl

PackageExtension	:= tar.gz
PackageSeparator	:= -

PackagePatchArgs    := -p1

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

PackageBuildMakefile	= $(call GenerateBuildPaths,Makefile)

CleanPaths		+= $(PackageLicenseFile)

TpsDir                  = sw/tps

OpenSSLDir              = $(TpsDir)/openssl
OpenSSLPrefixDir        = usr
OpenSSLIncludeDir       = $(OpenSSLPrefixDir)/include
OpenSSLLibraryDir       = $(OpenSSLPrefixDir)/lib
OpenSSLNames            = crypto ssl
OpenSSLSearchPath       = $(call GenerateResultPaths,$(OpenSSLDir),$(OpenSSLPrefixDir))
OpenSSLIncludePath      = $(call GenerateResultPaths,$(OpenSSLDir),$(OpenSSLIncludeDir))
OpenSSLLibraryPath      = $(call GenerateResultPaths,$(OpenSSLDir),$(OpenSSLLibraryDir))
OpenSSLLibraryPaths     = $(call GenerateResultPaths,$(OpenSSLResultsDir),$(addprefix $(OpenSSLLibraryDir)/,$(OpenSSLNames)))
OpenSSLDependPaths      = $(call GenerateSharedLibraryResultPaths,$(OpenSSLDir)/$(OpenSSLLibraryDir),$(OpenSSLNames))

ZlibDir                 = $(TpsDir)/zlib
ZlibPrefixDir           = usr
ZlibIncludeDir          = $(ZlibPrefixDir)/include
ZlibLibraryDir          = $(ZlibPrefixDir)/lib
ZlibName                = z
ZlibSearchPath          = $(call GenerateResultPaths,$(ZlibDir),$(ZlibPrefixDir))
ZlibIncludePath         = $(call GenerateResultPaths,$(ZlibDir),$(ZlibIncludeDir))
ZlibLibraryPath         = $(call GenerateResultPaths,$(ZlibDir),$(ZlibLibraryDir))
ZlibDependPath          = $(call GenerateSharedLibraryResultPaths,$(ZlibDir)/$(ZlibLibraryDir),$(ZlibName))

all: $(PackageDefaultGoal)

# Generate the package license contents.

$(PackageSourceDir)/COPYING: source

$(PackageLicenseFile): $(PackageSourceDir)/COPYING
	$(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

# Generate the package build makefile.
#
# For non-cross-compiled targets (e.g. simulators), the curl configure
# attempts to perform run-time tests.
#
# To ensure this works against the in-project versions of openssl and
# zlib, the paths to these shared objects MUST be found by the dynamic
# loader.

$(PackageBuildMakefile): export $(LoaderSearchPath) := $(OpenSSLLibraryPath):$(ZlibLibraryPath):$($(LoaderSearchPath))

$(PackageBuildMakefile): | $(PackageSourceDir) $(BuildDirectory)
	$(Verbose)cd $(BuildDirectory) && \
	$(CURDIR)/$(PackageSourceDir)/configure \
	INSTALL="$(INSTALL) $(INSTALLFLAGS)" \
	CC="$(CC)" CXX="$(CXX)" AR=$(AR) RANLIB=$(RANLIB) STRIP=$(STRIP) \
	CPPFLAGS="$(call ToolGenerateIncludeArgument,$(OpenSSLIncludePath))" \
	LDFLAGS="$(call GenerateResolveArguments,$(ZlibDependPath)) \
	$(call GenerateResolveArguments,$(OpenSSLDependPaths)) \
	$(call ToolGenerateLibraryPathArgument,$(OpenSSLLibraryPath))" \
	--build=$(HostTuple) \
	--host=$(TargetTuple) \
	$(CurlPackageOptions) \
	--disable-ares \
	--disable-dict \
	--disable-gopher \
	--disable-imap \
	--disable-ldap \
	--disable-ldaps \
	--disable-manual \
	--disable-ntlm-wb \
	--disable-pop3 \
	--disable-rtsp \
	--disable-smtp \
	--disable-telnet \
	--enable-ipv6 \
	--with-ssl=$(OpenSSLSearchPath) \
	--with-zlib=$(ZlibSearchPath) \
	--with-ca-bundle=/usr/lib/ssl/certs/ca-bundle.pem \
	--without-libidn \
	--prefix=/usr \
	--sysconfdir=/etc \
	--localstatedir=/var

# Configure the source for building.

.PHONY: configure
configure: source $(PackageBuildMakefile)

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

.PHONY: build
build: configure
	$(Verbose)unset MAKEFLAGS && \
	$(MAKE) $(JOBSFLAG) -C $(BuildDirectory) all

# Stage the build to a temporary installation area.
#
# We have to unset MAKEFLAGS since they confuse the package build otherwise.
#
# We explictly remove 'libcurl.la' because some packages that depend
# on libcurl use libtool. If libtool finds a '*.la' file for a
# library, it uses the value of 'libdir=<dir>' it finds. In our case,
# since '--prefix=/usr' this value is '/usr/lib'. It then resolves
# '-lcurl' to '/usr/lib/libcurl.so'. In a cross-compilation
# environment, this is likely to be neither the right architecture nor
# the right version to link against. In short, we lose.
#
# We could also handle this by removing DESTDIR and setting the prefix
# to $(ResultDirectory); however, that results in libtool hard-coding
# $(ResultDirectory) as the RPATH in the linked executables which is
# NOT what we want either. We lose again.
#
# By removing the '*.la' file, we win by ensuring neither a misdirected
# link nor an RPATH.

.PHONY: stage
stage: build | $(ResultDirectory)
	$(Verbose)unset MAKEFLAGS && \
	$(MAKE) $(JOBSFLAG) -C $(BuildDirectory) DESTDIR=$(ResultDirectory) install
	$(Verbose)$(RM) $(RMFLAGS) $(call GenerateResultPaths,,usr/lib/libcurl.la) 

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

include post.mak
