Allow deeper platform port directory structure
authorDan Handley <dan.handley@arm.com>
Fri, 27 Mar 2015 17:44:35 +0000 (17:44 +0000)
committerDan Handley <dan.handley@arm.com>
Tue, 28 Apr 2015 18:50:48 +0000 (19:50 +0100)
Update the top level makefile to allow platform ports to exist in
subdirectories at any level instead of one level under `plat/`. The
makefile recursively searches for all files called `platform.mk` in
all subdirectories of `plat/`. The directory containing
`platform.mk` is the platform name. Platform names must be unique
across the codebase.

Replace usage of HELP_PLATFORMS in the Makefile with PLATFORMS since
these are both used to report the same information back to the user.

Update the TSP and cert_create tool makefiles in a similar way
to support a deeper platform port directory structure.

Also add PLAT_<plat_name> as a define passed through the top level
makefile to the source files, to allow build time variation in common
platform code.

Change-Id: I213420164808c5ddb99a26144e8e3f141a7417b7

Makefile
bl32/tsp/tsp.mk
tools/cert_create/Makefile

index 02bb3172e91035042b0496ced4197fc89346e226..d38a28327af21b5fe708e6fbe2836bd8c4803db1 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 2013-2014, ARM Limited and Contributors. All rights reserved.
+# Copyright (c) 2013-2015, 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:
@@ -126,9 +126,14 @@ BL_COMMON_SOURCES  :=      common/bl_common.c                      \
 BUILD_BASE             :=      ./build
 BUILD_PLAT             :=      ${BUILD_BASE}/${PLAT}/${BUILD_TYPE}
 
-PLATFORMS              :=      $(shell ls -I common 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 '|'.
+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)
-HELP_PLATFORMS         :=      $(shell echo ${PLATFORMS} | sed 's/ /|/g')
 
 # Convenience function for adding build definitions
 # $(eval $(call add_define,FOO)) will have:
@@ -144,9 +149,10 @@ $(and $(patsubst 0,,$(value $(1))),$(patsubst 1,,$(value $(1))),$(error $(1) mus
 endef
 
 ifeq (${PLAT},)
-  $(error "Error: Unknown platform. Please use PLAT=<platform name> to specify the platform.")
+  $(error "Error: Unknown platform. Please use PLAT=<platform name> to specify the platform")
 endif
-ifeq ($(findstring ${PLAT},${PLATFORMS}),)
+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
 
@@ -155,7 +161,7 @@ all: msg_start
 msg_start:
        @echo "Building ${PLAT}"
 
-include plat/${PLAT}/platform.mk
+include ${PLAT_MAKEFILE_FULL}
 
 # Include the CPU specific operations makefile. By default all CPU errata
 # workarounds and CPU specifc optimisations are disabled. This can be
@@ -225,6 +231,9 @@ CFLAGS                      +=      -g
 ASFLAGS                        +=      -g -Wa,--gdwarf-2
 endif
 
+# Process PLAT flag
+$(eval $(call add_define,PLAT_${PLAT}))
+
 # Process NS_TIMER_SWITCH flag
 $(eval $(call assert_boolean,NS_TIMER_SWITCH))
 $(eval $(call add_define,NS_TIMER_SWITCH))
@@ -633,7 +642,7 @@ cscope:
        ${Q}cscope -b -q -k
 
 help:
-       @echo "usage: ${MAKE} PLAT=<${HELP_PLATFORMS}> [OPTIONS] [TARGET]"
+       @echo "usage: ${MAKE} PLAT=<${PLATFORMS}> [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}"
index f17ef1e15ccbc3d50a5d5a14a131712dce671d0b..aeda31abe2567029ff4604f92eaf96157e55c806 100644 (file)
@@ -52,7 +52,7 @@ $(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 := plat/${PLAT}/tsp/tsp-${PLAT}.mk
+TSP_PLAT_MAKEFILE := $(shell find plat/ -wholename '*/${PLAT}/tsp/tsp-${PLAT}.mk')
 ifeq (,$(wildcard ${TSP_PLAT_MAKEFILE}))
   $(error TSP is not supported on platform ${PLAT})
 else
index f1aa79743e29ceaab4b578dbd5e58ff85cff90fe..eac8cec80aa10e1bb54d235a265c04f7ec3af674 100644 (file)
@@ -47,7 +47,13 @@ CFLAGS := -Wall -std=c99
 
 # Check the platform
 ifeq (${PLAT},none)
-  $(error Error: No platform defined. Use PLAT=<platform>.)
+  $(error "Error: Unknown platform. Please use PLAT=<platform name> to specify the platform")
+endif
+PLAT_MAKEFILE          :=      platform.mk
+PLAT_INCLUDE   :=      $(shell find ../../plat/ -wholename '*/${PLAT}/${PLAT_MAKEFILE}' |      \
+                               sed 's/${PLAT_MAKEFILE}/include/')
+ifeq ($(PLAT_INCLUDE),)
+  $(error "Error: Invalid platform '${PLAT}'")
 endif
 
 ifeq (${DEBUG},1)
@@ -63,7 +69,7 @@ endif
 
 # Make soft links and include from local directory otherwise wrong headers
 # could get pulled in from firmware tree.
-INC_DIR := -I ./include -I ../../plat/${PLAT}/include
+INC_DIR := -I ./include -I ${PLAT_INCLUDE}
 LIB_DIR :=
 LIB := -lssl -lcrypto