#
#    Copyright (c) 2010-2012 Nest Labs, 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 make file for wpa_supplicant, a free software
#      implementation of an IEEE 802.11i security supplicant for
#      Linux, FreeBSD, NetBSD and Microsoft Windows.
#

BuildConfigSpecialized	:= No
BuildProductSpecialized	:= No

include pre.mak

PackageRoot		:= .

PackageName		:= hostap

PackageSeparator	:=

PackageSourceDir	:= $(PackageRoot)/$(PackageName)

PackageBuildSubdir	:= $(BuildDirectory)/wpa_supplicant

PackageConfigDir	:= configs
PackageProductConfig 	:= $(PackageConfigDir)/$(BuildProduct)/defconfig
PackageSiteConfig	:= $(PackageConfigDir)/defconfig
PackageDefaultConfig	:= $(PackageBuildSubdir)/defconfig

PackageSiteConfig	:= $(if $(wildcard $(PackageProductConfig)),$(PackageProductConfig),$(wildcard $(PackageSiteConfig)))

PackageSourceConfig	:= $(if $(PackageSiteConfig),$(PackageSiteConfig),$(PackageDefaultConfig))
PackageBuildConfig	:= $(PackageBuildSubdir)/.config

PackageBuildMakefile	= $(call GenerateBuildPaths,Makefile)

LicenseSourceFile	:= $(PackageSourceDir)/COPYING

CleanPaths		+= $(PackageLicenseFile)

DbusDir			:= sw/tps/dbus
DbusIncDirs		:= $(call GenerateResultPaths,$(DbusDir),usr/include/dbus-1.0 usr/lib/dbus-1.0/include)
DbusLibDir		:= $(call GenerateResultPaths,$(DbusDir),usr/lib)

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

NetlinkDir		:= sw/tps/libnl
NetlinkIncDir		:= $(call GenerateResultPaths,$(NetlinkDir),usr/include)
NetlinkLibDir		:= $(call GenerateResultPaths,$(NetlinkDir),usr/lib)

OpenSSLDir		:= sw/tps/openssl
OpenSSLIncDir		:= $(call GenerateResultPaths,$(OpenSSLDir),usr/include)
OpenSSLLibDir		:= $(call GenerateResultPaths,$(OpenSSLDir),usr/lib)

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

WpaDbusConfSourcePath	:= $(PackageSourceDir)/wpa_supplicant/dbus/dbus-wpa_supplicant.conf
WpaDbusConfResultPath	:= $(call GenerateResultPaths,,$(notdir $(WpaDbusConfSourcePath)))

all: $(PackageDefaultGoal)

# Generate the package license contents.

$(LicenseSourceFile): source

$(PackageLicenseFile): $(LicenseSourceFile)
	$(copy-result)

# We are building this package from version-controlled source, so
# there is nothing to do for this target goal.

$(PackageSourceDir):

# Prepare the sources.

.PHONY: source
source: | $(PackageSourceDir)

# Patch the sources, if necessary.

.PHONY: patch
patch: source

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

$(PackageBuildConfig): $(PackageSourceConfig) | $(PackageBuildSubdir)
	$(copy-result)

# Configure the source for building.

.PHONY: configure
configure: source $(PackageBuildConfig)

# Add in extra required feature based defines
ifeq ($(BUILD_FEATURE_WIFI_BCM),1)
EXTRA_PLATFORM_CFLAGS = -DCONFIG_ALWAYS_UP
endif

# 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 $(PackageBuildSubdir) \
	INSTALL="$(INSTALL) $(INSTALLFLAGS)" \
	CC="$(CC)" CXX="$(CXX)" AR=$(AR) NM=$(NM) RANLIB=$(RANLIB) STRIP=$(STRIP) \
	DBUSCFLAGS="$(call ToolGenerateIncludeArgument,$(DbusIncDirs))" \
	DBUSLDFLAGS="-L$(DbusLibDir) -ldbus-1" \
	DBUSVERSION=$(shell cat $(BuildRoot)/$(DbusDir)/dbus.version) \
	LINUXCFLAGS="$(call ToolGenerateIncludeArgument,$(LinuxIncDir))" \
	NETLINKCFLAGS="$(call ToolGenerateIncludeArgument,$(NetlinkIncDir))" \
	NETLINKLDFLAGS="-L$(NetlinkLibDir) -lnl -lnl-genl" \
	OPENSSLCFLAGS="-I$(OpenSSLIncDir)" \
	OPENSSLLDFLAGS="-L$(OpenSSLLibDir) -L$(ZlibLibDir) -lz" \
    EXTRA_PLATFORM_CFLAGS="$(EXTRA_PLATFORM_CFLAGS)" \
	all

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

.PHONY: stage
stage: stage-default stage-other

.PHONY: stage-default
stage-default: build | $(ResultDirectory)
	$(Verbose)unset MAKEFLAGS && \
	$(MAKE) $(JOBSFLAG) -C $(PackageBuildSubdir) \
	INSTALL="$(INSTALL) $(INSTALLFLAGS)" \
	DBUSCFLAGS="$(call ToolGenerateIncludeArgument,$(DbusIncDirs))" \
	DBUSLDFLAGS="-L$(DbusLibDir) -ldbus-1" \
	DBUSVERSION=$(shell cat $(BuildRoot)/$(DbusDir)/dbus.version) \
	LINUXCFLAGS="$(call ToolGenerateIncludeArgument,$(LinuxIncDir))" \
	NETLINKCFLAGS="$(call ToolGenerateIncludeArgument,$(NetlinkIncDir))" \
	NETLINKLDFLAGS="-L$(NetlinkLibDir)" \
	OPENSSLCFLAGS="-I$(OpenSSLIncDir)" \
	OPENSSLLDFLAGS="-L$(OpenSSLLibDir) -L$(ZlibLibDir) -lz" \
	BINDIR=/usr/sbin \
	LIBDIR=/usr/lib \
	DESTDIR=$(ResultDirectory) \
	install

.PHONY: stage-other
stage-other: $(WpaDbusConfResultPath)

$(WpaDbusConfSourcePath): build

$(WpaDbusConfResultPath): $(WpaDbusConfSourcePath) | $(ResultDirectory)
	$(copy-result)

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

include post.mak
