#
#    Copyright (c) 2010-2011 Nest, Inc.
#    All rights reserved.
#
#    This document is the property of Nest Labs. 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 Labs.
#
#    Description:
#      This file is the makefile for the Universal Bootloader, u-boot.
#

include pre.mak

PackageRoot		:= .

PackageName		:= u-boot

PackageSeparator	:= 

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

PackageBuildMakefile	= $(call GenerateBuildPaths,include/config.mk)

CleanPaths		+= $(PackageLicenseFile)

#
# Build and result paths for staging targets
#

UBootResultBinDir	:= $(call GenerateResultPaths,,bin)
UBootResultSbinDir	:= $(call GenerateResultPaths,,sbin)

UBootPrintEnvBuildPath	:= $(call GenerateBuildPaths,tools/env/fw_printenv)
UBootPrintEnvResultPath	:= $(call GenerateResultPaths,,sbin/fw_printenv)

UBootSetEnvResultPath	:= $(call GenerateResultPaths,,sbin/fw_setenv)

UBootMkimageBuildPath	:= $(call GenerateBuildPaths,tools/mkimage)
UBootMkimageResultPath	:= $(call GenerateResultPaths,,bin/mkimage)

NestBuildDefines	:= NEST_BUILD_CONFIG_$(call ToUpper,$(BuildConfig)) NEST_BUILD_CONFIG=\\\"$(BuildConfig)\\\"
NestBuildDefineFlags	:= $(call ToolGenerateDefineArgument,$(NestBuildDefines))

all: $(PackageDefaultGoal)

# Generate the package license contents.

$(PackageSourceDir)/COPYING: source

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

# We are building this package from version-controller 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

# U-Boot has no way of explicitly setting CC, LD, OBJCOPY, et al and
# instead relies on the value of CROSS_COMPILE. Consequently, we have
# to ensure that 'ToolBinDir' is in 'PATH' so that the kernel build
# infrastructure can find $(CROSS_COMPILE)gcc, $(CROSS_COMPILE)ld, et
# al.

configure build stage: PATH := $(PATH):$(ToolBinDir)

# Generate the package build makefile.

$(PackageBuildMakefile): | $(PackageSourceDir) $(BuildDirectory)
	$(Verbose)unset MAKEFLAGS && \
	$(MAKE) -C $(PackageSourceDir) \
	O=$(CURDIR)/$(BuildDirectory) \
	$(UBootDefaultConfig)

# Configure the source for building.

.PHONY: configure
configure: source $(PackageBuildMakefile)

# Build the source.

.PHONY: build
build: configure
	$(Verbose)unset MAKEFLAGS && \
	$(MAKE) -C $(PackageSourceDir) \
	O=$(CURDIR)/$(BuildDirectory) \
	TOOLSUBDIRS=env \
	NestBuildDefineFlags="$(NestBuildDefineFlags)" \
	all

# Stage the build to a temporary installation area.
#
# U-Boot does not support a notion of installing, so we have to
# cherry-pick the components we want from the build directory and
# copy/install them to the results directory.

.PHONY: stage stage-target stage-target-tools stage-host-tools
stage: stage-target stage-target-tools stage-host-tools

stage-target: build | $(ResultDirectory)
	$(Verbose)cp -f $(wildcard $(call GenerateBuildPaths,u-boot*)) $(ResultDirectory)
	$(Verbose)cp -f $(call GenerateBuildPaths,System.map) $(ResultDirectory)

#
# Targets and commands for staging target (i.e cross-compiled) tools.
#

$(UBootResultSbinDir): | $(ResultDirectory)
	$(create-directory)

$(UBootPrintEnvBuildPath): build

$(UBootPrintEnvResultPath): $(UBootPrintEnvBuildPath) | $(UBootResultSbinDir)
	$(copy-result)

$(UBootSetEnvResultPath):
	$(Echo) "Creating \"$(call GenerateBuildRootEllipsedPath,$@)\""
	$(Verbose)ln -sf fw_printenv "$(@)"

stage-target-tools: $(UBootPrintEnvResultPath) $(UBootSetEnvResultPath)

#
# Targets and commands for staging host (i.e. natively-compiled) tools
# that may be used elsewhere in the build.
#

$(UBootResultBinDir): | $(ResultDirectory)
	$(create-directory)

$(UBootMkimageBuildPath): build

$(UBootMkimageResultPath): $(UBootMkimageBuildPath) | $(UBootResultBinDir)
	$(copy-result)

stage-host-tools: $(UBootMkimageResultPath)

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

include post.mak
