#
#    Copyright (c) 2010-2011 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 Avahi ZeroConf (aka Bonjour)
#      multicast DNS (mDNS) Service Discovery (SD) software.
#


include pre.mak

PackageName		:= avahi

PackageExtension	:= tar.gz
PackageSeparator	:= -

PackagePatchArgs	:= -p1

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

PackageBuildMakefile	= $(call GenerateBuildPaths,Makefile)

CleanPaths		+= $(PackageLicenseFile)

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

ExpatDir		:= sw/tps/expat
ExpatIncDir		= $(call GenerateResultPaths,$(ExpatDir),usr/include)
ExpatLibDir		= $(call GenerateResultPaths,$(ExpatDir),usr/lib)

LibCapDir		:= sw/tps/libcap
LibCapIncDir		= $(call GenerateResultPaths,$(LibCapDir),usr/include)
LibCapLibDir		= $(call GenerateResultPaths,$(LibCapDir),lib)

LibDaemonDir		:= sw/tps/libdaemon
LibDaemonIncDir		= $(call GenerateResultPaths,$(LibDaemonDir),usr/include)
LibDaemonLibDir		= $(call GenerateResultPaths,$(LibDaemonDir),usr/lib)

SOURCEDIRS                      = $(PackageSourceDir)
$(PackageSourceDir)_RULE_TARGET = $(BuildDirectory)/configure

all: $(PackageDefaultGoal)

# Generate the package license contents.

$(PackageSourceDir)/LICENSE: $(BuildDirectory)/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.

$(BuildDirectory)/source: | $(PackageSourceDir)
	$(Verbose)touch $@

# Patch the sources, if necessary.

$(BuildDirectory)/patch: $(BuildDirectory)/source
	$(Verbose)touch $@

# Generate the package build makefile.

# Configure the source for building.
#
# Avahi uses and, in fact, requires pkg-config to set-up LDFLAGS and
# CFLAGS for LIBDAEMON even though these are explicitly provided on
# the configure command line above as prescribed in the "how to
# configure WITHOUT pkg-config" instructions.
#
# Unfortunately, some site Linux systems are quite old and have a
# version of pkg-config that avahi refuses to work with.
# Consequently, we place $(HostBinDir) first in the path to ensure
# that the project-local version of pkg-config is detected and used
# rather than a host- or site-local version.

$(BuildDirectory)/configure: PATH := $(HostBinDir):$(PATH)

$(BuildDirectory)/configure: $(BuildDirectory)/source | $(PackageSourceDir) $(BuildDirectory)
	$(Verbose)cd $(BuildDirectory) && \
	$(CURDIR)/$(PackageSourceDir)/configure \
	CC="$(CC)" CXX="$(CXX)" AR=$(AR) RANLIB=$(RANLIB) STRIP=$(STRIP) \
	INSTALL="$(INSTALL) $(INSTALLFLAGS)" \
	CPPFLAGS="-I$(ExpatIncDir) -I$(LibCapIncDir)" \
	LDFLAGS="-L$(ExpatLibDir) -L$(LibCapLibDir)" \
	DBUS_CFLAGS="-I$(DbusIncDir) -I$(DbusArchIncDir)" \
	DBUS_LIBS="-L$(DbusLibDir) -ldbus-1" \
	DBUS_VERSION=$(shell cat $(BuildRoot)/$(DbusDir)/dbus.version) \
	LIBDAEMON_CFLAGS="-I$(LibDaemonIncDir)" \
	LIBDAEMON_LIBS="-L$(LibDaemonLibDir) -ldaemon" \
	--build=$(HostTuple) \
	--host=$(TargetTuple) \
	--disable-autoipd \
	--disable-gdbm \
	--disable-glib \
	--disable-gobject \
	--disable-gtk \
	--disable-gtk3 \
	--disable-manpages \
	--disable-mono \
	--disable-monodoc \
	--disable-python \
	--disable-qt3 \
	--disable-qt4 \
	--enable-dbus \
	--enable-libdaemon \
	--with-distro=none \
	--with-xml=expat \
	--prefix=/usr \
	--sysconfdir=/etc \
	--localstatedir=/var \
	--disable-static
	$(Verbose)touch $@

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

$(BuildDirectory)/build: $(BuildDirectory)/configure
	$(Verbose)unset MAKEFLAGS && \
	$(MAKE) $(JOBSFLAG) -C $(BuildDirectory) all
	$(Verbose)touch $@

# Stage the build to a temporary installation area.
#
# We have to unset MAKEFLAGS since they confuse the package build otherwise.
#
# We explictly remove 'libavahi-core.la' and 'libavahi-common.la'
# because some packages that depend on these libraries 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 '-lavahi-core' or
# '-lavahi-common' to '/usr/lib/libavahi-core.so' and
# '/usr/lib/libavahi-common.so', respectively. 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.

$(BuildDirectory)/stage: $(BuildDirectory)/build | $(ResultDirectory)
	$(Verbose)unset MAKEFLAGS && \
	$(MAKE) $(JOBSFLAG) -C $(BuildDirectory) DESTDIR=$(ResultDirectory) install
	$(Verbose)$(RM) $(RMFLAGS) $(call GenerateResultPaths,,usr/lib/libavahi-common.la usr/lib/libavahi-core.la usr/lib/libavahi-client.la)
	$(Verbose)touch $@

.PHONY: stage
stage: $(BuildDirectory)/stage

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

include post.mak



