#
#    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.
#

.NOTPARALLEL:

include pre.mak

PackageRoot		:= .

PackageSeparator	:= 

PackageVersion		:= 
PackageSourceDir	:= $(UBootPackageName)$(PackageSeparator)$(PackageVersion)

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

CleanPaths		+= $(PackageLicenseFile)

CP			= cp
DD			= dd
LN			= ln
TAR			= tar
MKDIR			= mkdir
CHMOD			= chmod
PRINTF			= printf
PUSHD			= pushd
POPD			= popd
FSL_HAB_SIGN		= $(BuildRoot)/build/scripts/fsl_hab_sign.sh
FSL_CST			= $(BuildRoot)/build/tools/host/i686-pc-linux-gnu/bin/freescale-cst

GeneratedBuildExtra	:= $(shell bash $(BuildExtraScriptSourcePath) --build-version $(BuildVersion))

LocalBuildExtra		= $(if $(call IsVariable,BuildExtra,undefined),$(call UseIfNotEmpty,$(GeneratedBuildExtra)),$(call UseIfNotEmpty,$(BuildExtra)))

#
# 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)

UnsignedUBootBuildPath	:= $(call GenerateBuildPaths,$(UBootImageFile))

#
# If UBootSignedImageFile AND UBootSignedSDPImageFile are defined, we need to do
# an extra step and sign UBootImageFile to produce signed binaries.
#
# There are three different ways we can generate this signed binary:
# 1) Copy a signed image from within the Git repo*    [ Default behavior if the appropriate signed image folder is present ]
# 2) Copy an unsigned image from the build folder*    [ Fallback behavior if the appropriate signed image folder is not present (deleted or not yet present) ]
# 3) Sign it locally using the private keys           [ Force this by passing 'SIGN_BOOTLOADER=true' on make cmdline ]
#
# *Also generates a signing .tgz archive in the u-boot results folder that can be unpacked on an offline
#  signing workstation that has the necessary signing keys and used to sign the image. It contains:
#  1) The code signing binary: freescale-cst
#  2) The code signing helper script: fsl_hab_sign.sh
#  3) The unsigned u-boot image
#  4) A top-level signing script that defines the input and output filenames, for documentation purposes, and so that we are consistent.
#
ifneq "$(and $(UBootSignedImageFile),$(UBootSignedSDPImageFile))" ""
SignedUBootResultPath	= $(call GenerateResultPaths,,$(UBootSignedImageFile))
SignedSDPUBootResultPath= $(call GenerateResultPaths,,$(UBootSignedSDPImageFile))
BuildResults		= $(SignedUBootResultPath) $(SignedSDPUBootResultPath)

# Generate a signing .tgz archive
UBootSigningArchiveResultPath	= $(call GenerateResultPaths,,u-boot-unsigned-$(BuildVersion)-$(BuildProduct)-$(BuildConfig)$(LocalBuildExtra).tgz)
define SIGNING_SCRIPT
#!/bin/bash
set -e

# Check the input args
if [ $${#} -ne 2 ]; then
  name=`basename $${0}`
  echo "Usage: $${name} <password file> <key dir>"
  exit 1
elif [ ! -f $${1} ]; then
  echo "Password file not found: $${1}"
  exit 1
elif [ ! -d $${2} ]; then
  echo "Key dir not found: $${2}"
  exit 1
fi

./$(notdir $(FSL_HAB_SIGN)) --passin $${1} --keypath $${2} $(basename $(UBootImageFile))-$(BuildVersion)$(LocalBuildExtra)$(suffix $(UBootImageFile)) $(basename $(UBootSignedImageFile))-$(BuildVersion)$(LocalBuildExtra)$(suffix $(UBootSignedImageFile))
./$(notdir $(FSL_HAB_SIGN)) --sdp --passin $${1} --keypath $${2} $(basename $(UBootImageFile))-$(BuildVersion)$(LocalBuildExtra)$(suffix $(UBootImageFile)) $(basename $(UBootSignedImageFile))-sdp-$(BuildVersion)$(LocalBuildExtra)$(suffix $(UBootSignedImageFile))
echo "Done, no errors"

endef
export SIGNING_SCRIPT
GenerateUBootSigningArchive	= $(eval TMPDIR := $(shell mktemp -d)) \
				  $(MKDIR) -p $(TMPDIR)/$(BuildProduct)/$(BuildConfig) && \
				  $(CP) $(FSL_HAB_SIGN) $(TMPDIR)/$(BuildProduct)/$(BuildConfig) && \
				  $(CP) $(FSL_CST) $(TMPDIR)/$(BuildProduct)/$(BuildConfig) && \
				  $(CP) $(1) $(TMPDIR)/$(BuildProduct)/$(BuildConfig)/$(basename $(UBootImageFile))-$(BuildVersion)$(LocalBuildExtra)$(suffix $(UBootImageFile)) && \
				  $(PRINTF) "$$SIGNING_SCRIPT" > $(TMPDIR)/$(BuildProduct)/$(BuildConfig)/sign.sh && \
				  $(CHMOD) u+x $(TMPDIR)/$(BuildProduct)/$(BuildConfig)/sign.sh && \
				  $(PUSHD) $(TMPDIR) && sha256sum $(BuildProduct)/$(BuildConfig)/* > $(BuildProduct)/$(BuildConfig)/SHA256SUMS && $(POPD) && \
				  $(TAR) -czf $(UBootSigningArchiveResultPath) --directory $(TMPDIR) $(BuildProduct) && \
				  $(RM) -rf $(TMPDIR)

ifdef SIGN_BOOTLOADER
# This is option (3) above
# This option also copies the signed result, places it into the signed u-boot images folder with a name that reflects the
# BuildExtra (tag, last commit hash, etc) and updates the symlinks to it so that it is ready to commit into the repo.
GenerateSignedResult	= $(Echo) "Signing result \"$(call GenerateBuildRootEllipsedPath,$2)\" locally" && \
			  $(FSL_HAB_SIGN) $(3) $(1) $(2) $(LocalBuildExtra) && \
			  $(CP) $(2) $(UBootSignedImagesFolder)/$(basename $(notdir $(2)))$(LocalBuildExtra)$(suffix $(2)) && \
			  $(LN) -fs $(basename $(notdir $(2)))$(LocalBuildExtra)$(suffix $(2)) $(UBootSignedImagesFolder)/$(notdir $(2))
else ifneq ($(wildcard $(UBootSignedImagesFolder)),)
# This is option (1) above
GenerateSignedResult	= $(Echo) "Copying signed result \"$(call GenerateBuildRootEllipsedPath,$2)\" from repo ($(UBootSignedImagesFolder)/$(notdir $(2)))" && \
			  $(call GenerateUBootSigningArchive,$(1)) && \
			  $(CP) $(UBootSignedImagesFolder)/$(notdir $(2)) $(2)
else
# This is option (2) above
#
# Note that setting CONFIG_SECURE_BOOT in the U-boot config causes a 'CSF 0x2000' command to be
# added to the mkimage config, which causes the CSF field in the the IVT header to be nonzero,
# and increases the length of the image given in the header by 0x2000 Bytes. If cases such as this,
# where we don't actually do the signing and append the CSF data, we need to zero the field and
# append 0x2000 Bytes of zeros, so that the boot ROM won't die trying to read it.
GenerateSignedResult	= $(Echo) "Copying result \"$(call GenerateBuildRootEllipsedPath,$2)\" without signing" && \
			  $(call GenerateUBootSigningArchive,$(1)) && \
			  $(CP) $(1) $(2) && \
			  $(DD) if=/dev/zero of=$(2) seek=24 bs=1 count=4 conv=notrunc > /dev/null 2>&1 && \
			  $(DD) if=/dev/zero of=$(2) bs=$$((0x2000)) count=1 conv=notrunc oflag=append > /dev/null 2>&1
endif

else
UnsignedUBootResultPath	= $(call GenerateResultPaths,,$(UBootImageFile))
BuildResults		= $(UnsignedUBootResultPath)
endif

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


# The diamond1 and j49 u-boot builds require the HOSTCC and HOSTSTRIP flags to point to the cross-toolchain so that
# fw_printenv/fw_setenv will be built for the target arch. Doing this with the newer (2014.04) diamond3 and flintstone
# builds causes the host tools to be cross-compiled, and is unnecessary, which is more in line with what seems logical.
ifeq ($(UBootPackageName),u-boot)
toolHostCCFlags		= HOSTCC="$(CC)" HOSTSTRIP=$(STRIP)
else
toolHostCCFlags		=
endif

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

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
$(BuildDirectory)/source: | $(PackageSourceDir)
	$(Verbose)touch $@

# Patch the sources, if necessary.

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

# 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.

$(BuildDirectory)/configure $(BuildDirectory)/build $(BuildDirectory)/stage: PATH := $(PATH):$(ToolBinDir)
$(BuildDirectory)/configure $(BuildDirectory)/build $(BuildDirectory)/stage: CROSS_COMPILE := $(CCACHE) $(CROSS_COMPILE)

# Generate the package build makefile.

# Configure the source for building.

$(BuildDirectory)/configure: $(BuildDirectory)/source | $(PackageSourceDir) $(BuildDirectory)
	$(Verbose)unset MAKEFLAGS && \
	$(MAKE) $(JOBSFLAG) -C $(PackageSourceDir) \
	INSTALL="$(INSTALL) $(INSTALLFLAGS)" \
	O=$(CURDIR)/$(BuildDirectory) \
	$(UBootDefaultConfig)
	$(Verbose)touch $@

# Build the source.

$(BuildDirectory)/build: $(UnsignedUBootBuildPath)
	$(Verbose)touch $@

$(UnsignedUBootBuildPath): $(BuildDirectory)/configure
	$(Verbose)unset MAKEFLAGS && \
	$(MAKE) $(JOBSFLAG) -C $(PackageSourceDir) \
	INSTALL="$(INSTALL) $(INSTALLFLAGS)" \
	O=$(CURDIR)/$(BuildDirectory) \
	NestBuildDefineFlags="$(NestBuildDefineFlags)" \
	all

$(UBootPrintEnvBuildPath): $(BuildDirectory)/configure $(UnsignedUBootBuildPath)
	$(Verbose)unset MAKEFLAGS && \
	$(MAKE) $(JOBSFLAG) -C $(PackageSourceDir) \
	INSTALL="$(INSTALL) $(INSTALLFLAGS)" \
	O=$(CURDIR)/$(BuildDirectory) \
	$(toolHostCCFlags) \
	TOOLSUBDIRS=env \
	NestBuildDefineFlags="$(NestBuildDefineFlags)" \
	env tools

# 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: $(BuildDirectory)/stage

$(BuildDirectory)/stage: $(BuildDirectory)/stage-target $(BuildDirectory)/stage-target-tools $(BuildDirectory)/stage-host-tools
	$(Verbose)touch $@

$(BuildDirectory)/stage-target: $(BuildResults)
	$(Verbose)$(CP) -f $(call GenerateBuildPaths,System.map) $(ResultDirectory)
	$(Verbose)touch $@

$(BuildDirectory)/stage-target-tools: $(UBootPrintEnvResultPath) $(UBootSetEnvResultPath)
	$(Verbose)touch $@

$(BuildDirectory)/stage-host-tools: $(UBootMkimageResultPath)
	$(Verbose)touch $@

#
# Targets and commands for signing compiled images.
# Generates a regular signed image for NAND boot AND a special SDP one for USB DFU boot
#

$(UnsignedUBootResultPath): $(UnsignedUBootBuildPath) | $(ResultDirectory)
	$(Verbose)$(CP) -f $< $@

$(SignedUBootResultPath): $(UnsignedUBootBuildPath) | $(ResultDirectory)
	$(Verbose)$(call GenerateSignedResult,$<,$@,)

$(SignedSDPUBootResultPath): $(UnsignedUBootBuildPath) | $(ResultDirectory)
	$(Verbose)$(call GenerateSignedResult,$<,$@,--sdp)

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

$(UBootResultSbinDir):
	$(create-directory)

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

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

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

$(UBootResultBinDir):
	$(create-directory)

$(UBootMkimageBuildPath): $(BuildDirectory)/build

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

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

include post.mak
