#
#    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 makefile for the Linux kernel.
#

include pre.mak

PackageRoot			:= .

PackageName			:= linux

PackageSeparator		:= 

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

PackageBuildConfig		:= $(call GenerateBuildPaths,.config)
PackageBuildMakefile		:= $(call GenerateBuildPaths,Makefile)

CleanPaths			+= $(PackageLicenseFile)

#
# Configuration
#
# Kernel default configuration is handled from most-specific to
# least-specific, as follows:
#
#   Out-of-tree:
#
#     1) If configs/$(BuildProduct)/$(BuildConfig)_defconfig exists,
#        it is used.
#     2) If configs/$(BuildProduct)/defconfig exists, it is used.
#     3) If configs/$(BuildConfig)_defconfig exists, it is used.
#     4) If configs/defconfig exists, it is used.
#
#   In-tree:
#
#     5) If none of those exist, $(LinuxDefaultConfig) is used, which
#        refers to an architecture- and/or board-specific default
#        configuration.
#
# We go through this elaborate scheme because, once created, the
# kernel loses all association with it configuration file and the
# source it was created from. As a consequence, if the default
# configuration is edited, the kernel doesn't know about the
# change. This is especially problematic when changing branches or
# receiving updates to the default configuration and the kernel
# doesn't rebuild to reflect those changes.
#
# With this scheme, the user can edit .config as before. However, now
# if the default configuration is changed, out-of-tree only, .config
# is updated and the kernel will rebuild to reflect those changes.
#

PackageConfigDir		:= configs
PackageDefaultConfig		:= $(LinuxDefaultConfig)
PackageProjectConfig		:= $(PackageConfigDir)/defconfig
PackageConfigConfig		:= $(PackageConfigDir)/$(BuildConfig)_defconfig
PackageProductConfig		:= $(PackageConfigDir)/$(BuildProduct)/defconfig
PackageProductConfigConfig	:= $(PackageConfigDir)/$(BuildProduct)/$(BuildConfig)_defconfig

PackageMaybeProjectConfig	:= $(wildcard $(PackageProjectConfig))
PackageMaybeConfigConfig	:= $(wildcard $(PackageConfigConfig))
PackageMaybeProductConfig	:= $(wildcard $(PackageProductConfig))
PackageMaybeProductConfigConfig	:= $(wildcard $(PackageProductConfigConfig))

PackageMaybeConfig		:= $(if $(PackageMaybeProductConfigConfig),$(PackageProductConfigConfig),$(if $(PackageMaybeProductConfig),$(PackageProductConfig),$(if $(PackageMaybeConfigConfig),$(PackageConfigConfig),$(if $(PackageMaybeProjectConfig),$(PackageProjectConfig),))))

PackageSourceConfig     	:= $(if $(PackageMaybeConfig),$(PackageMaybeConfig),)

#
# Specific products may want additional build targets beyond those
# produced by the linux build's 'all' target. Process and establish
# those.
#

LinuxAllTarget		:= all
LinuxBuildTargets	:= $(filter-out $(LinuxAllTarget),$(LinuxProductTargets)) $(LinuxAllTarget)

#
# For some architectures, the linux build requires u-boot's host
# 'mkimage' tool. Establish some paths and directories that will be
# used, if present, to help the linux build find it.
#

MkimagePath		:= $(wildcard $(call GenerateResultPaths,fw/u-boot/bin,mkimage))
MkimageDir		:= $(call Deslashify,$(dir $(MkimagePath)))

#
# Architecture-specific boot images that may need to be copied from
# the build to the result directory.
#

LinuxBootFolder		= arch/$(LinuxProductArch)/boot
LinuxBootDir		= $(call GenerateBuildPaths,$(LinuxBootFolder))
LinuxBootBuildPaths	= $(call GenerateBuildPaths,$(addprefix $(LinuxBootFolder)/,$(LinuxProductBootFiles)))
LinuxBootResultPaths	= $(call GenerateResultPaths,,$(notdir $(LinuxBootBuildPaths)))

LinuxKernelFiles	= vmlinux
LinuxKernelFolder	= .
LinuxKernelDir		= $(call GenerateBuildPaths,$(LinuxKernelFolder))
LinuxKernelBuildPaths	= $(call GenerateBuildPaths,$(addprefix $(call Slashify,$(LinuxKernelFolder)),$(LinuxKernelFiles)))
LinuxKernelResultPaths  = $(call GenerateResultPaths,,$(notdir $(LinuxKernelBuildPaths)))

#
# Common make arguments shared by all Linux target commands
#

LinuxCommonMakeArgs	= -C $(PackageSourceDir) O=$(CURDIR)/$(BuildDirectory) ARCH=$(LinuxProductArch)

define echo-defconfig
$(Echo) "The default Linux build configuration is \"$(if $(PackageSourceConfig),$(PackageSourceConfig),$(PackageDefaultConfig))\"."
endef

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

# The Linux kernel build 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.
#
# Additionally, per the above, add the path to U-Boot's 'mkimage' if
# the variable is defined.

configure build images stage: PATH := $(PATH):$(ToolBinDir)$(if $(MkimageDir),:$(MkimageDir),)

# Generate the Linux build configuration and make file
#
# We are either copying and out-of-tree configuration or using an
# in-tree default (see above).

# $(PackageBuildConfig): help-defconfig

$(PackageBuildConfig): $(PackageSourceConfig) | $(PackageSourceDir) $(BuildDirectory)
	$(echo-defconfig)
	$(if $(PackageSourceConfig),$(copy-result),$(Verbose)$(MAKE) $(LinuxCommonMakeArgs) $(LinuxDefaultConfig))

# Configure the source for building.

.PHONY: configure
configure: source $(PackageBuildConfig)

# Build the source.

.PHONY: build
build: configure images

# Build the linux kernel images, including vmlinux (ELF).

.PHONY: images
images: configure | $(BuildDirectory)
	$(Verbose)$(MAKE) $(LinuxCommonMakeArgs) $(LinuxBuildTargets)

# Stage the build to a temporary installation area.

.PHONY: stage stage-boot stage-kernel stage-modules stage-headers
stage: stage-boot stage-kernel stage-modules stage-headers

stage-boot stage-kernel stage-modules stage-headers: build | $(ResultDirectory)

stage-kernel:
	$(Verbose)$(MAKE) $(LinuxCommonMakeArgs) INSTALL_PATH=$(ResultDirectory) INSTALL_MOD_PATH=$(ResultDirectory) install

stage-modules:
	$(Verbose)$(MAKE) $(LinuxCommonMakeArgs) INSTALL_MOD_PATH=$(ResultDirectory) DEPMOD=$(DEPMOD) modules_install

stage-headers:
	$(Verbose)$(MAKE) $(LinuxCommonMakeArgs) INSTALL_HDR_PATH=$(ResultDirectory) headers_install

$(LinuxBootResultPaths): $(ResultDirectory)/%: $(LinuxBootDir)/%
	$(copy-result)

$(LinuxKernelResultPaths): $(ResultDirectory)/%: $(LinuxKernelDir)/%
	$(copy-result)

stage-boot: $(LinuxBootResultPaths) $(LinuxKernelResultPaths)

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

.PHONY: help help-defconfig
help-defconfig:
	$(echo-defconfig)

help: help-defconfig

include post.mak
