# defs.base - build system # # Copyright (c) 2013-2014 Wind River Systems, Inc. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # # 1) Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # # 2) Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # # 3) Neither the name of Wind River Systems nor the names of its contributors # may be used to endorse or promote products derived from this software without # specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. # ##### # this file initializes: # # - vBASE, the base VxMicro directory # - vMAKE, the base make fragments directory # - vBSP_BASE_DIR, the base BSP directory # - vCONFIG_BASE_DIR, the configuration directory # - build parallelism # - verbosity levels ##### # verify GNU make has the features used by the build system $(if $(filter .FEATURES,${.VARIABLES}),,$(error GNU make v3.81+ required)) $(if $(filter second-expansion,${.FEATURES}),,$(error Your GNU make does not support .SECONDEXPANSION)) $(if $(filter order-only,${.FEATURES}),,$(error Your GNU make does not support order-only prerequesites)) $(if $(filter else-if,${.FEATURES}),,$(error Your GNU make does not support else-if conditionals)) ##### # $(file ...) has been introduced in GNU make 4.0, but sadly without a way of # checking for its existence in the .FEATURES variable. vFILE_SUPPORTED := $(if $(filter 4.%,${MAKE_VERSION}),y,n) ##### $(if ${VXMICRO_BASE},,$(error VXMICRO_BASE must be set)) vBASE ?= $(strip $(subst ${vDRIVE_BASE},,$(subst \,/,${VXMICRO_BASE}))) vMAKE ?= ${vBASE}/make vBSP_BASE_DIR ?= $(strip $(subst \,/,$(or ${VXMICRO_BSP_BASE},${vBASE}/arch/${vARCH}))) vCONFIG_BASE_DIR ?= $(strip $(subst \,/,${vBASE}/config)) ##### # quiet/verbose # if V=1 from command line => verbose; else, if VERBOSE=1 is set anywhere => verbose; else => quiet iCL_V_undefined = iCL_V_1 = 1 iCL_V = $(or $(filter undefined,$(origin V)),$(if $(filter "command line","$(origin V)"),$V,)) iVERBOSE_1 = 1 vVERBOSE = $(filter 1,$(or ${iCL_V_${iCL_V}},${iVERBOSE_${VERBOSE}})) # for recipe lines: $q = @ if not-verbose q = $(if ${vVERBOSE},,@) SHOW_INFORMATIVE_WARNINGS_ ?= 1 SHOW_INFORMATIVE_WARNINGS ?= $(SHOW_INFORMATIVE_WARNINGS_$q) # invoke with $(eval ${q_include} ) q_include = $(if ${vVERBOSE},,s)include # invoke with $(call q_info,) q_info = $(if ${vVERBOSE},$(info $1),) ##### # To keep things simple, do not allow multiple goals on the command line # since some goals might require autoconf.mk to exist, and might trigger its # rule but require prj.conf to exist, while some rules don't. iONE_GOAL_1 = y iONE_GOAL = ${iONE_GOAL_$(words ${MAKECMDGOALS})} iDEFAULT_GOAL_0 = y iDEFAULT_GOAL = ${iDEFAULT_GOAL_$(words ${MAKECMDGOALS})} iUNIQUE_GOAL_y = y iUNIQUE_GOAL_ = n iUNIQUE_GOAL = ${iUNIQUE_GOAL_${iONE_GOAL}${iDEFAULT_GOAL}} ifneq (${iUNIQUE_GOAL},y) $(error Cannot invoke make with multiple goals on the command line) endif ##### # Find out if the goal is one that does necessitate some user-provided values. # 'help', and the variants of 'clean' can be invoked without knowing about the # BSP, ARCH, CPU, etc. ifeq ($(strip $(findstring help,${MAKECMDGOALS})),help) vGOAL_NEEDS_TARGET_SETUP = n else ifneq ($(strip $(filter ${MAKECMDGOALS},wipe pristine clean)),) vGOAL_NEEDS_TARGET_SETUP = n else ifeq ($(strip $(findstring display_settings,${MAKECMDGOALS})),display_settings) vGOAL_NEEDS_TARGET_SETUP = n else ifeq ($(strip $(findstring display_variables,${MAKECMDGOALS})),display_variables) vGOAL_NEEDS_TARGET_SETUP = n else vGOAL_NEEDS_TARGET_SETUP = y endif ##### # This variable is only to help when debugging the build system. A build # system developer can set it to so that some rules do not # retrigger when the build system change, since this can be very time- # consuming, especially on Windows. Care must be taken that the part of the # build system being worked on do not necessitate these rules to retrigger. iDEPEND_ON_MAKEFILES = ${MAKEFILE_LIST} ##### # figure out which host type we're running on include ${vMAKE}/env/defs.host ##### # global rules # # These are really rules, and should be in a rules. file, but # they must be stated *prior* to rules that need them to be in-effect. To keep # things simple, the only fragment that is required to be included *before* # anything is the current file (it must be the first statement in the top-level # makefile), so put those rules here. .SECONDARY: .SECONDEXPANSION: .SUFFIXES: ##### # obscure string manipulations vCOMMA = , vEMPTY = vSPACE = ${vEMPTY} ${vEMPTY} include ${vMAKE}/env/rules.shared