########################################################################### ### #@File #@Copyright Copyright (c) Imagination Technologies Ltd. All Rights Reserved #@License Dual MIT/GPLv2 # # The contents of this file are subject to the MIT license as set out below. # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # Alternatively, the contents of this file may be used under the terms of # the GNU General Public License Version 2 ("GPL") in which case the provisions # of GPL are applicable instead of those above. # # If you wish to allow use of your version of this file only under the terms of # GPL, and not to allow others to use your version of this file under the terms # of the MIT license, indicate your decision by deleting the provisions above # and replace them with the notice and other provisions required by GPL as set # out in the file called "GPL-COPYING" included in this distribution. If you do # not delete the provisions above, a recipient may use your version of this file # under the terms of either the MIT license or GPL. # # This License is also included in this distribution in the file called # "MIT-COPYING". # # EXCEPT AS OTHERWISE STATED IN A NEGOTIATED AGREEMENT: (A) THE SOFTWARE IS # PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING # BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR # PURPOSE AND NONINFRINGEMENT; AND (B) IN NO EVENT SHALL THE AUTHORS OR # COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER # IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ### ########################################################################### # Define the default goal. This masks a previous definition of the default # goal in config/core.mk, which must match this one .PHONY: build build: components firmware MAKE_TOP := build/linux THIS_MAKEFILE := (top-level makefiles) include $(MAKE_TOP)/defs.mk ifeq ($(OUT),) $(error Must specify output directory with OUT=) endif ifeq ($(TOP),) $(error Must specify root of source tree with TOP=) endif $(call directory-must-exist,$(TOP)) # RELATIVE_OUT is relative only if it's under $(TOP) RELATIVE_OUT := $(patsubst $(TOP)/%,%,$(OUT)) CONFIG_MK := $(RELATIVE_OUT)/config.mk CONFIG_H := $(RELATIVE_OUT)/config.h CONFIG_KERNEL_MK := $(RELATIVE_OUT)/config_kernel.mk CONFIG_KERNEL_H := $(RELATIVE_OUT)/config_kernel.h # Convert commas to spaces in $(D). This is so you can say "make # D=config-changes,freeze-config" and have $(filter config-changes,$(D)) # still work. override D := $(subst $(comma),$(space),$(D)) ifneq ($(INTERNAL_CLOBBER_ONLY),true) # Create the out directory # $(shell mkdir -p $(OUT)) # If these generated files differ from any pre-existing ones, # replace them, causing affected parts of the driver to rebuild. # _want_config_diff := $(filter config-changes,$(D)) _freeze_config := $(strip $(filter freeze-config,$(D))) _updated_config_files := $(shell \ $(if $(_want_config_diff),rm -f $(OUT)/config.diff;,) \ for file in $(CONFIG_MK) $(CONFIG_H) \ $(CONFIG_KERNEL_MK) $(CONFIG_KERNEL_H); do \ diff -U 0 $$file $$file.new \ >>$(if $(_want_config_diff),$(OUT)/config.diff,/dev/null) 2>/dev/null \ && rm -f $$file.new \ || echo $$file; \ done) ifneq ($(_want_config_diff),) # We send the diff to stderr so it isn't captured by $(shell) $(shell [ -s $(OUT)/config.diff ] && echo >&2 "Configuration changed in $(RELATIVE_OUT):" && cat >&2 $(OUT)/config.diff) endif ifneq ($(_freeze_config),) $(if $(_updated_config_files),$(error Configuration change in $(RELATIVE_OUT) prevented by D=freeze-config),) endif # Update the config, if changed $(foreach _f,$(_updated_config_files), \ $(shell mv -f $(_f).new $(_f) >/dev/null 2>/dev/null)) endif # INTERNAL_CLOBBER_ONLY MAKEFLAGS := -Rr --no-print-directory ifneq ($(INTERNAL_CLOBBER_ONLY),true) # This is so you can say "find $(TOP) -name Linux.mk > /tmp/something; export # ALL_MAKEFILES=/tmp/something; make" and avoid having to run find. This is # handy if your source tree is mounted over NFS or something override ALL_MAKEFILES := $(call relative-to-top,$(if $(strip $(ALL_MAKEFILES)),$(shell cat $(ALL_MAKEFILES)),$(shell find $(TOP) -type f -name Linux.mk -print -o -type d -name '.*' -prune))) ifeq ($(strip $(ALL_MAKEFILES)),) $(info ** Unable to find any Linux.mk files under $$(TOP). This could mean that) $(info ** there are no makefiles, or that ALL_MAKEFILES is set in the environment) $(info ** and points to a nonexistent or empty file.) $(error No makefiles) endif else # clobber-only ALL_MAKEFILES := endif unexport ALL_MAKEFILES REMAINING_MAKEFILES := $(ALL_MAKEFILES) ALL_MODULES := INTERNAL_INCLUDED_ALL_MAKEFILES := ALL_LDFLAGS := # Please do not change the format of the following lines -include $(CONFIG_MK) -include $(CONFIG_KERNEL_MK) # OK to change now define is-host-os $(if $(HOST_OS),$(if $(filter $(1),$(HOST_OS)),true),$(error HOST_OS not set)) endef define is-not-host-os $(if $(HOST_OS),$(if $(filter-out $(1),$(HOST_OS)),true),$(error HOST_OS not set)) endef define is-target-os $(if $(TARGET_OS),$(if $(filter $(1),$(TARGET_OS)),true),$(error TARGET_OS not set)) endef define is-not-target-os $(if $(TARGET_OS),$(if $(filter-out $(1),$(TARGET_OS)),true),$(error TARGET_OS not set)) endef # If we haven't set host/target archs, set some sensible defaults now. # This allows things like prune.sh to work ifeq ($(HOST_PRIMARY_ARCH),) ifneq ($(FORCE_ARCH),) HOST_PRIMARY_ARCH := host_x86_64 HOST_32BIT_ARCH := host_i386 # We set HOST_ALL_ARCH this way, as HOST_32BIT_ARCH may be overridden on the # command line. ifeq ($(HOST_PRIMARY_ARCH),$(HOST_32BIT_ARCH)) HOST_ALL_ARCH := $(HOST_PRIMARY_ARCH) else HOST_ALL_ARCH := $(HOST_PRIMARY_ARCH) $(HOST_32BIT_ARCH) endif _ALL_ARCHS := \ $(filter-out %target_neutral.mk,$(wildcard $(MAKE_TOP)/moduledefs/target_*.mk)) TARGET_PRIMARY_ARCH := \ $(patsubst $(MAKE_TOP)/moduledefs/%.mk,%,$(word 1, $(_ALL_ARCHS))) TARGET_ALL_ARCH := $(TARGET_PRIMARY_ARCH) endif endif # Output directory for configuration, object code, # final programs/libraries, and install/rc scripts. HOST_OUT := $(RELATIVE_OUT)/$(HOST_PRIMARY_ARCH) HOST_32BIT_OUT := $(RELATIVE_OUT)/$(HOST_32BIT_ARCH) TARGET_OUT := $(RELATIVE_OUT)/$(TARGET_PRIMARY_ARCH) TARGET_PRIMARY_OUT := $(RELATIVE_OUT)/$(TARGET_PRIMARY_ARCH) TARGET_NEUTRAL_OUT := $(RELATIVE_OUT)/target_neutral BRIDGE_SOURCE_ROOT := $(call if-exists,$(TOP)/generated/$(PVR_ARCH),$(TARGET_NEUTRAL_OUT)/intermediates) GENERATED_CODE_OUT := $(TARGET_NEUTRAL_OUT)/intermediates DOCS_OUT := $(RELATIVE_OUT)/doc # # neutrino/subst_makefiles.mk must be included after Output directories have been defined, # because it overrides BRIDGE_SOURCE_ROOT of bridges to be built. If we include this makefile # earlier, the value of BRIDGE_SOURCE_ROOT set in neutrino/subst_makefiles.mk will be overwritten. ifeq ($(SUPPORT_NEUTRINO_PLATFORM),1) include $(MAKE_TOP)/common/neutrino/subst_makefiles.mk # neutrino/subst_makefiles.mk overrides ALL_MAKEFILES. # Set REMAINING_MAKEFILES to the new value of ALL_MAKEFILES REMAINING_MAKEFILES := $(ALL_MAKEFILES) endif # Mark subdirectories of $(OUT) as secondary, and provide rules to create # them. OUT_SUBDIRS := $(addprefix $(RELATIVE_OUT)/,$(TARGET_ALL_ARCH)) \ $(TARGET_NEUTRAL_OUT) $(DOCS_OUT) $(if $(HOST_PRIMARY_ARCH),$(sort $(HOST_OUT) $(HOST_32BIT_OUT))) .SECONDARY: $(OUT_SUBDIRS) $(OUT_SUBDIRS): $(make-directory) ifneq ($(INTERNAL_CLOBBER_ONLY),true) -include $(MAKE_TOP)/pvrversion.mk -include $(MAKE_TOP)/llvm.mk ifeq ($(SERVICES_SC),1) -include $(MAKE_TOP)/common/bridges_sc.mk else -include $(MAKE_TOP)/common/bridges.mk endif endif ifeq ($(INTERNAL_CLOBBER_ONLY)$(SUPPORT_ANDROID_PLATFORM)$(SUPPORT_NEUTRINO_PLATFORM)$(SUPPORT_INTEGRITY_PLATFORM),) # doing a Linux build. We need to worry about sysroots. # The directories containing linux window system related components LWS_DIR := $(TOP)/lws LWS_TARBALL_DIR ?= $(TOP)/external/lws LWS_PATCH_DIR := $(LWS_DIR)/dist/patches LWS_GIT_PATCH_DIR := $(LWS_DIR)/patches ifneq ($(SUPPORT_BUILD_LWS),) -include $(MAKE_TOP)/lwsconf.mk else ifneq ($(SYSROOT),) LWS_PREFIX ?= /usr XORG_CONFDIR ?= /etc/X11 override SYS_CFLAGS += --sysroot=${SYSROOT} override SYS_CXXFLAGS += --sysroot=${SYSROOT} override SYS_LDFLAGS += --sysroot=${SYSROOT} PKG_CONFIG_SYSROOT_DIR := ${SYSROOT} ifneq ($(SYSROOT),/) # Override PKG_CONFIG_PATH to prevent additional host paths from being # searched PKG_CONFIG_PATH := endif else ifneq ($(CROSS_COMPILE),) $(info WARNING: You are not specifying how to find dependent libraries, e.g., by specifying SYSROOT.) $(info The build may fail.) endif endif # This has to come after including lwsconf.mk since it relies on LWS_PREFIX # to construct the path to wayland-scanner include $(MAKE_TOP)/commands.mk BUILD_CACHES=$(sort $(LWS_BUILD_CACHES)) ifneq ($(BUILD_CACHES),) .SECONDARY: $(BUILD_CACHES) $(BUILD_CACHES): $(make-directory) endif # We don't need to include this if we're just doing a clean or a clobber # ifneq ($(INTERNAL_CLOBBER_ONLY),true) include $(MAKE_TOP)/buildvars.mk endif HOST_INTERMEDIATES := $(HOST_OUT)/intermediates TARGET_INTERMEDIATES := $(TARGET_OUT)/intermediates ifneq ($(KERNEL_COMPONENTS),) build: kbuild endif # The 'bridges' target is used to make all the modules that are of the bridge # type. One of its main uses is to pregenerate the bridge files for inclusion # into the DDK source packages. Since there is no need and no facility to # generate the bridge files when the pregenerated files exist, make the target # a no-op in this case. .PHONY: bridges ifeq ($(BRIDGE_SOURCE_ROOT),$(TOP)/generated/$(PVR_ARCH)) bridges: else bridges: $(BRIDGES) endif # Include each Linux.mk, then include modules.mk to save some information # about each module include $(foreach _Linux.mk,$(ALL_MAKEFILES),$(MAKE_TOP)/this_makefile.mk $(_Linux.mk) $(MAKE_TOP)/modules.mk) ifeq ($(strip $(REMAINING_MAKEFILES)),) INTERNAL_INCLUDED_ALL_MAKEFILES := true else $(error Impossible: $(words $(REMAINING_MAKEFILES)) makefiles were mysteriously ignored when reading $$(ALL_MAKEFILES)) endif # For the special "all_modules" target, filter out any kernel_module modules # These are explicitly non-buildable in isolation. ALL_NON_KERNEL_MODULES := \ $(foreach _m,$(ALL_MODULES),\ $(if $(filter-out kernel_module,$($(_m)_type)),$(_m))) # Compute the isystem paths passed in via SYS_INCLUDES. We'll use this in # the module target_xxx makefiles to filter duplicate -isystem and -I flags, # to ensure the module can always override the include precedence. (Also # calculate any 'residual' non-include flags, as we need to put them back.) SYS_INCLUDES_ISYSTEM := \ $(subst -isystem,,$(filter -isystem%,$(subst -isystem ,-isystem,$(SYS_INCLUDES)))) SYS_INCLUDES_RESIDUAL := \ $(strip $(filter-out -isystem%,$(subst -isystem ,-isystem,$(SYS_INCLUDES)))) # At this point, all Linux.mks have been included. Now generate rules to build # each module: for each module in $(ALL_MODULES), set per-makefile variables ALL_BAD_MODULES := $(foreach _m,$(ALL_MODULES),$(eval $(call process-module,$(_m)))) # Filter out any modules that were missing their module 'type' makefile. These # modules will break the packaging process and can't be built anyway. ALL_MODULES := $(filter-out $(ALL_BAD_MODULES),$(ALL_MODULES)) .PHONY: kbuild install kbuild install: ifneq ($(INTERNAL_CLOBBER_ONLY),true) ifeq ($(SUPPORT_ANDROID_PLATFORM)$(SUPPORT_NEUTRINO_PLATFORM)$(SUPPORT_INTEGRITY_PLATFORM),) -include $(MAKE_TOP)/packaging.mk endif -include $(MAKE_TOP)/scripts.mk -include $(MAKE_TOP)/kbuild/kbuild.mk endif # We won't depend on 'build' here so that people can build subsets of # components and still have the install script attempt to install the # subset. install: @if [ ! -d "$(DISCIMAGE)" -a -z "$(INSTALL_TARGET)" ]; then \ echo; \ echo "** DISCIMAGE was not set or does not point to a valid directory."; \ echo "** Either use INSTALL_TARGET or set DISCIMAGE."; \ echo "** Cannot continue with install."; \ echo; \ exit 1; \ fi @if [ ! -f $(RELATIVE_OUT)/install.sh ]; then \ echo; \ echo "** install.sh not found in $(RELATIVE_OUT)."; \ echo "** Cannot continue with install."; \ echo; \ exit 1; \ fi @cd $(RELATIVE_OUT) && ./install.sh installfw: install_script_fw @if [ ! -f $(RELATIVE_OUT)/install.sh ]; then \ echo; \ echo "** install.sh not found in $(RELATIVE_OUT)."; \ echo "** Cannot continue with install."; \ echo; \ exit 1; \ fi @cd $(RELATIVE_OUT) && ./install.sh --fw installcomponents: install_script @if [ ! -f $(RELATIVE_OUT)/install.sh ]; then \ echo; \ echo "** install.sh not found in $(RELATIVE_OUT)."; \ echo "** Cannot continue with install."; \ echo; \ exit 1; \ fi @cd $(RELATIVE_OUT) && ./install.sh --um installkm: install_script_km @if [ ! -d "$(DISCIMAGE)" -a -z "$(INSTALL_TARGET)" ]; then \ echo; \ echo "** DISCIMAGE was not set or does not point to a valid directory."; \ echo "** Either use INSTALL_TARGET or set DISCIMAGE."; \ echo "** Cannot continue with install."; \ echo; \ exit 1; \ fi @if [ ! -f $(RELATIVE_OUT)/install.sh ]; then \ echo; \ echo "** install.sh not found in $(RELATIVE_OUT)."; \ echo "** Cannot continue with install."; \ echo; \ exit 1; \ fi @cd $(RELATIVE_OUT) && ./install.sh --km .PHONY: uninstall uninstall: install_script install_script_fw install_script_km @if [ ! -d "$(DISCIMAGE)" -a -z "$(INSTALL_TARGET)" ]; then \ echo; \ echo "** DISCIMAGE was not set or does not point to a valid directory."; \ echo "** Either use INSTALL_TARGET or set DISCIMAGE."; \ echo "** Cannot continue with uninstall."; \ echo; \ exit 1; \ fi @if [ ! -f $(RELATIVE_OUT)/install.sh ]; then \ echo; \ echo "** install.sh not found in $(RELATIVE_OUT)."; \ echo "** Cannot continue with uninstall."; \ echo; \ exit 1; \ fi @cd $(RELATIVE_OUT) && ./install.sh -u # You can say 'make all_modules' to attempt to make everything, or 'make # components' to only make the things which are listed (in the per-build # makefiles) as components of the build. .PHONY: all_modules all_docs components firmware all_modules: $(ALL_NON_KERNEL_MODULES) kbuild all_docs: ; components: $(COMPONENTS) firmware: $(FW_COMPONENTS) # Cleaning .PHONY: clean clobber clean: MODULE_DIRS_TO_REMOVE := $(OUT_SUBDIRS) clean: $(clean-dirs) clobber: MODULE_DIRS_TO_REMOVE := $(OUT) clobber: $(clean-dirs) # Saying 'make clean-MODULE' removes the intermediates for MODULE. # clobber-MODULE deletes the output files as well clean-%: $(if $(V),,@echo " RM " $(call relative-to-top,$(INTERNAL_CLEAN_TARGETS_FOR_$*))) $(RM) -rf $(INTERNAL_CLEAN_TARGETS_FOR_$*) clobber-%: $(if $(V),,@echo " RM " $(call relative-to-top,$(INTERNAL_CLOBBER_TARGETS_FOR_$*))) $(RM) -rf $(INTERNAL_CLOBBER_TARGETS_FOR_$*) include $(MAKE_TOP)/bits.mk # D=nobuild stops the build before any recipes are run. This line should # come at the end of this makefile. $(if $(filter nobuild,$(D)),$(error D=nobuild given),)