| # | |
| # 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. | |
| # | |
| ifneq (,$(filter $(BuildProduct),diamond3 sunstone)) | |
| EnableParallel = No | |
| else | |
| EnableParallel = Yes | |
| endif | |
| include pre.mak | |
| PackageRoot := . | |
| PackageSeparator := | |
| PackageSourceDir := $(PackageRoot)/$(LinuxPackageName) | |
| PackageBuildConfig := $(call GenerateBuildPaths,.config) | |
| PackageBuildMakefile := $(call GenerateBuildPaths,Makefile) | |
| CleanPaths += $(PackageLicenseFile) | |
| MAKEIMAGE := mkimage | |
| CP := cp | |
| # | |
| # 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 | |
| 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))) | |
| LinuxDtbFolder = arch/$(LinuxProductArch)/boot/dts | |
| LinuxDtbDir = $(call GenerateBuildPaths,$(LinuxDtbFolder)) | |
| LinuxDtbBuildPaths = $(call GenerateBuildPaths,$(addprefix $(call Slashify,$(LinuxDtbFolder)),$(LinuxDtbFiles))) | |
| LinuxDtbResultPaths = $(call GenerateResultPaths,,$(notdir $(LinuxDtbBuildPaths))) | |
| LinuxItbFolder = arch/$(LinuxProductArch)/boot | |
| LinuxItbDir = $(call GenerateBuildPaths,$(LinuxItbFolder)) | |
| LinuxItbBuildPaths = $(call GenerateBuildPaths,$(addprefix $(call Slashify,$(LinuxItbFolder)),$(LinuxItbFile))) | |
| LinuxItbResultPaths = $(call GenerateResultPaths,,$(notdir $(LinuxItbBuildPaths))) | |
| LinuxConfigsDir = $(PackageSourceDir)/arch/arm/configs | |
| # | |
| # Common make arguments shared by all Linux target commands | |
| # | |
| LinuxCommonMakeArgs = $(JOBSFLAG) -C $(PackageSourceDir) O=$(CURDIR)/$(BuildDirectory) ARCH=$(LinuxProductArch) | |
| 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 stage-modules: PATH := $(PATH):$(ToolBinDir)$(if $(MkimageDir),:$(MkimageDir),) | |
| CROSS_COMPILE:= $(CCACHE) $(CROSS_COMPILE) | |
| # 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 | |
| ifeq ($(PackageSourceConfig),) | |
| DefconfigBasename=$(subst _defconfig,,$(LinuxDefaultConfig)) | |
| ConfigFragment=$(DefconfigBasename)_$(BuildConfig)_fragment | |
| $(PackageBuildConfig): $(LinuxConfigsDir)/$(LinuxDefaultConfig) $(LinuxConfigsDir)/$(ConfigFragment) | $(BuildDirectory) | |
| $(Echo) "The default Linux build configuration is \"$(LinuxDefaultConfig)\"." | |
| $(Verbose)$(MAKE) $(LinuxCommonMakeArgs) $(LinuxDefaultConfig) | |
| $(Echo) "Applying config fragment \"$(ConfigFragment)\"." | |
| $(PackageSourceDir)/scripts/kconfig/merge_config.sh -O $(BuildDirectory) -m $(BuildDirectory)/.config $(LinuxConfigsDir)/$(ConfigFragment) | |
| $(Echo) "Setting unspecified options to defaults" | |
| $(Verbose) yes " " | $(MAKE) $(LinuxCommonMakeArgs) oldconfig | |
| else | |
| $(PackageBuildConfig): $(PackageSourceConfig) | $(PackageSourceDir) $(BuildDirectory) | |
| $(Echo) "The default Linux build configuration is \"$(PackageSourceConfig)\"." | |
| $(copy-result) | |
| endif | |
| # 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) $(LinuxProductMakeArgs) $(LinuxBuildTargets) $(LinuxDtbFiles) | |
| $(LinuxItbBuildPaths) : images | |
| $(Verbose)$(CP) $(PackageSourceDir)/$(LinuxItbFolder)/its/$(basename $(LinuxItbFile)).its $(LinuxItbDir) | |
| $(Verbose)$(MAKEIMAGE) -f $(LinuxItbDir)/$(basename $(LinuxItbFile)).its $(LinuxItbBuildPaths) | |
| # Stage the build to a temporary installation area. | |
| .PHONY: stage stage-boot stage-modules stage-headers | |
| stage: stage-boot stage-modules stage-headers | |
| stage-boot stage-modules stage-headers: build | $(ResultDirectory) | |
| stage-modules: | |
| $(Verbose)$(MAKE) $(LinuxCommonMakeArgs) INSTALL="$(INSTALL) $(INSTALLFLAGS)" INSTALL_MOD_PATH=$(ResultDirectory) DEPMOD=$(DEPMOD) modules_install | |
| stage-headers: | |
| $(Verbose)$(MAKE) $(LinuxCommonMakeArgs) INSTALL="$(INSTALL) $(INSTALLFLAGS)" INSTALL_HDR_PATH=$(ResultDirectory) headers_install | |
| $(LinuxBootResultPaths): $(ResultDirectory)/%: $(LinuxBootDir)/% | |
| $(copy-result) | |
| $(LinuxKernelResultPaths): $(ResultDirectory)/%: $(LinuxKernelDir)/% | |
| $(copy-result) | |
| $(LinuxDtbResultPaths): $(ResultDirectory)/%: $(LinuxDtbDir)/% | |
| $(copy-result) | |
| $(LinuxItbResultPaths): $(ResultDirectory)/%: $(LinuxItbDir)/% | |
| $(copy-result) | |
| stage-boot: $(LinuxDtbResultPaths) $(LinuxItbResultPaths) $(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 |