diff --git a/Makefile b/Makefile index 6d17cfd70..26cfd5ed7 100644 --- a/Makefile +++ b/Makefile @@ -37,7 +37,8 @@ VERSION_MINOR := 2 # Default goal is build all images .DEFAULT_GOAL := all -include make_helpers/build_macros.mk +MAKE_HELPERS_DIRECTORY := make_helpers/ +include ${MAKE_HELPERS_DIRECTORY}build_macros.mk ################################################################################ # Default values for build configurations @@ -111,9 +112,10 @@ CHECK_IGNORE := --ignore COMPLEX_MACRO \ CHECKPATCH_ARGS := --no-tree --no-signoff ${CHECK_IGNORE} CHECKCODE_ARGS := --no-patch --no-tree --no-signoff ${CHECK_IGNORE} # Do not check the coding style on C library files -CHECK_PATHS := $(shell ls -I include -I lib) \ - $(addprefix include/,$(shell ls -I stdlib include)) \ - $(addprefix lib/,$(shell ls -I stdlib lib)) +INCLUDE_DIRS_TO_CHECK := $(sort $(filter-out include/stdlib, $(wildcard include/*))) +LIB_DIRS_TO_CHECK := $(sort $(filter-out lib/stdlib, $(wildcard lib/*))) +ROOT_DIRS_TO_CHECK := $(sort $(filter-out lib include, $(wildcard *)))) +CHECK_PATHS := ${ROOT_DIRS_TO_CHECK} ${INCLUDE_DIRS_TO_CHECK} ${LIB_DIRS_TO_CHECK} ################################################################################ @@ -235,17 +237,12 @@ INCLUDES += -Iinclude/bl1 \ # Generic definitions ################################################################################ +include ${MAKE_HELPERS_DIRECTORY}plat_helpers.mk + BUILD_BASE := ./build BUILD_PLAT := ${BUILD_BASE}/${PLAT}/${BUILD_TYPE} -PLAT_MAKEFILE := platform.mk -# Generate the platforms list by recursively searching for all directories -# under /plat containing a PLAT_MAKEFILE. Append each platform with a `|` -# char and strip out the final '|'. -PLATFORMS := $(shell find plat/ -name '${PLAT_MAKEFILE}' -print0 | \ - sed -r 's%[^\x00]*\/([^/]*)\/${PLAT_MAKEFILE}\x00%\1|%g' | \ - sed -r 's/\|$$//') -SPDS := $(shell ls -I none services/spd) +SPDS := $(sort $(filter-out none, $(patsubst services/spd/%,%,$(wildcard services/spd/*)))) # Platforms providing their own TBB makefile may override this value INCLUDE_TBBR_MK := 1 @@ -261,7 +258,7 @@ ifdef EL3_PAYLOAD_BASE $(warning "The SPD and its BL32 companion will be present but ignored.") endif # We expect to locate an spd.mk under the specified SPD directory - SPD_MAKE := $(shell m="services/spd/${SPD}/${SPD}.mk"; [ -f "$$m" ] && echo "$$m") + SPD_MAKE := $(wildcard services/spd/${SPD}/${SPD}.mk) ifeq (${SPD_MAKE},) $(error Error: No services/spd/${SPD}/${SPD}.mk located) @@ -286,14 +283,6 @@ endif # makefile may use all previous definitions in this file) ################################################################################ -ifeq (${PLAT},) - $(error "Error: Unknown platform. Please use PLAT= to specify the platform") -endif -PLAT_MAKEFILE_FULL := $(shell find plat/ -wholename '*/${PLAT}/${PLAT_MAKEFILE}') -ifeq ($(PLAT_MAKEFILE_FULL),) - $(error "Error: Invalid platform. The following platforms are available: ${PLATFORMS}") -endif - include ${PLAT_MAKEFILE_FULL} # If the platform has not defined ENABLE_PLAT_COMPAT, then enable it by default @@ -622,7 +611,7 @@ cscope: ${Q}cscope -b -q -k help: - @echo "usage: ${MAKE} PLAT=<${PLATFORMS}> [OPTIONS] [TARGET]" + @echo "usage: ${MAKE} PLAT=<${PLATFORM_LIST}> [OPTIONS] [TARGET]" @echo "" @echo "PLAT is used to specify which platform you wish to build." @echo "If no platform is specified, PLAT defaults to: ${DEFAULT_PLAT}" diff --git a/bl32/tsp/tsp.mk b/bl32/tsp/tsp.mk index 9919fe4f2..a50242840 100644 --- a/bl32/tsp/tsp.mk +++ b/bl32/tsp/tsp.mk @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2014, ARM Limited and Contributors. All rights reserved. +# Copyright (c) 2013-2016, ARM Limited and Contributors. All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: @@ -52,8 +52,8 @@ $(eval $(call add_define,TSP_INIT_ASYNC)) # Include the platform-specific TSP Makefile # If no platform-specific TSP Makefile exists, it means TSP is not supported # on this platform. -TSP_PLAT_MAKEFILE := $(shell find plat/ -wholename '*/${PLAT}/tsp/tsp-${PLAT}.mk') -ifeq (,$(wildcard ${TSP_PLAT_MAKEFILE})) +TSP_PLAT_MAKEFILE := $(wildcard ${PLAT_DIR}/tsp/tsp-${PLAT}.mk) +ifeq (,${TSP_PLAT_MAKEFILE}) $(error TSP is not supported on platform ${PLAT}) else include ${TSP_PLAT_MAKEFILE} diff --git a/make_helpers/build_macros.mk b/make_helpers/build_macros.mk index b22eaf900..274f365a4 100644 --- a/make_helpers/build_macros.mk +++ b/make_helpers/build_macros.mk @@ -1,5 +1,5 @@ # -# Copyright (c) 2015, ARM Limited and Contributors. All rights reserved. +# Copyright (c) 2015-2016, ARM Limited and Contributors. All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: @@ -28,6 +28,17 @@ # POSSIBILITY OF SUCH DAMAGE. # +# Some utility macros for manipulating awkward (whitespace) characters. +blank := +space :=${blank} ${blank} + +# A user defined function to recursively search for a filename below a directory +# $1 is the directory root of the recursive search (blank for current directory). +# $2 is the file name to search for. +define rwildcard +$(strip $(foreach d,$(wildcard ${1}*),$(call rwildcard,${d}/,${2}) $(filter $(subst *,%,%${2}),${d}))) +endef + # This table is used in converting lower case to upper case. uppercase_table:=a,A b,B c,C d,D e,E f,F g,G h,H i,I j,J k,K l,L m,M n,N o,O p,P q,Q r,R s,S t,T u,U v,V w,W x,X y,Y z,Z diff --git a/make_helpers/plat_helpers.mk b/make_helpers/plat_helpers.mk new file mode 100644 index 000000000..85ba84fe6 --- /dev/null +++ b/make_helpers/plat_helpers.mk @@ -0,0 +1,62 @@ +# +# Copyright (c) 2016, ARM Limited and Contributors. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# +# 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. +# +# Neither the name of ARM 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. +# + +################################################################################ +# Helpers for finding and referencing platform directories +################################################################################ + +ifndef PLAT_HELPERS_MK + PLAT_HELPERS_MK := $(lastword $(MAKEFILE_LIST)) + + ifeq (${PLAT},) + $(error "Error: Unknown platform. Please use PLAT= to specify the platform") + endif + + # PLATFORM_ROOT can be overridden for when building tools directly + PLATFORM_ROOT ?= plat/ + PLAT_MAKEFILE := platform.mk + + # Generate the platforms list by recursively searching for all directories + # under /plat containing a PLAT_MAKEFILE. Append each platform with a `|` + # char and strip out the final '|'. + ALL_PLATFORM_MK_FILES := $(call rwildcard,${PLATFORM_ROOT},${PLAT_MAKEFILE}) + ALL_PLATFORM_DIRS := $(patsubst %/,%,$(dir ${ALL_PLATFORM_MK_FILES})) + ALL_PLATFORMS := $(sort $(notdir ${ALL_PLATFORM_DIRS})) + + PLAT_MAKEFILE_FULL := $(filter %/${PLAT}/${PLAT_MAKEFILE},${ALL_PLATFORM_MK_FILES}) + PLATFORM_LIST := $(subst ${space},|,${ALL_PLATFORMS}) + ifeq ($(PLAT_MAKEFILE_FULL),) + $(error "Error: Invalid platform. The following platforms are available: ${PLATFORM_LIST}") + endif + + # Record the directory where the platform make file was found. + PLAT_DIR := $(dir ${PLAT_MAKEFILE_FULL}) + +endif diff --git a/tools/cert_create/Makefile b/tools/cert_create/Makefile index 8d7b8a52a..4a6dd6b8c 100644 --- a/tools/cert_create/Makefile +++ b/tools/cert_create/Makefile @@ -47,15 +47,16 @@ OBJECTS := src/cert.o \ CFLAGS := -Wall -std=c99 -# Check the platform -ifeq (${PLAT},none) - $(error "Error: Unknown platform. Please use PLAT= to specify the platform") -endif -PLAT_MAKEFILE := platform.mk -PLAT_INCLUDE := $(shell find ../../plat/ -wholename '*/${PLAT}/${PLAT_MAKEFILE}' | \ - sed 's/${PLAT_MAKEFILE}/include/') +MAKE_HELPERS_DIRECTORY := ../../make_helpers/ +include ${MAKE_HELPERS_DIRECTORY}build_macros.mk + +PLATFORM_ROOT := ../../plat/ +include ${MAKE_HELPERS_DIRECTORY}plat_helpers.mk + +PLAT_INCLUDE := $(wildcard ${PLAT_DIR}include) + ifeq ($(PLAT_INCLUDE),) - $(error "Error: Invalid platform '${PLAT}'") + $(error "Error: Invalid platform '${PLAT}' has no include directory.") endif ifeq (${DEBUG},1)