mirror of
https://github.com/ARM-software/arm-trusted-firmware.git
synced 2025-04-07 21:33:54 +00:00

Most developers run the `clean`, `checkpatch` and other similar targets without specifying any other additional build options. When combined with a flow where the developer passes `CROSS_COMPILE` or `CC` explicitly, and where the default-configured tools are not on the PATH, these targets will warn about unrecognized toolchain tools. This change is a workaround for this whereby the toolchain makefile is not expanded unless a target *not* named `*clean`, `check*` `doc` or `*tool` has been specified. Change-Id: I2f2a275964b65253df07c2207043217b14f615fe Signed-off-by: Chris Kay <chris.kay@arm.com>
94 lines
3.7 KiB
Makefile
94 lines
3.7 KiB
Makefile
#
|
|
# Copyright (c) 2023-2024, Arm Limited. All rights reserved.
|
|
#
|
|
# SPDX-License-Identifier: BSD-3-Clause
|
|
#
|
|
|
|
# This build helper makefile is used to determine a suitable march build
|
|
# option to be used, based on platform provided ARM_ARCH_MAJOR/MINOR
|
|
# data and compiler supported march version.
|
|
|
|
# Set the compiler's target architecture profile based on
|
|
# ARM_ARCH_MAJOR and ARM_ARCH_MINOR options.
|
|
|
|
|
|
# This is used to collect available march values from compiler.
|
|
# Example on a gcc-12.2 arm64 toolchain it will look like:
|
|
# [...]
|
|
#./aarch64-none-elf-gcc --target-help -march=foo
|
|
# cc1: error: unknown value 'foo' for '-march'
|
|
# cc1: note: valid arguments are: armv8-a armv8.1-a armv8.2-a armv8.3-a armv8.4-a armv8.5-a
|
|
# armv8.6-a armv8.7-a armv8.8-a armv8-r armv9-a
|
|
# [...]
|
|
#
|
|
GCC_MARCH_OUTPUT := $(if $($(ARCH)-cc),$(shell $($(ARCH)-cc) -march=foo -Q --help=target -v 2>&1))
|
|
|
|
# This function is used to find the best march value supported by the given compiler.
|
|
# We try to use `GCC_MARCH_OUTPUT` which has verbose message with supported march values we filter that
|
|
# to find armvX.Y-a or armvX-a values, then filter the best supported arch based on ARM_ARCH_MAJOR.
|
|
#
|
|
# Example on a gcc-12.2 arm64 toolchain this will return armv9-a if platform requested for armv9.2-a
|
|
# Similarly on gcc 11.3 it would return armv8.6-a if platform requested armv8.8-a
|
|
define major_best_avail_march
|
|
$(1) := $(lastword $(filter armv$(ARM_ARCH_MAJOR)% ,$(filter armv%-a, $(GCC_MARCH_OUTPUT))))
|
|
endef
|
|
|
|
# This function is used to just return latest march value supported by the given compiler.
|
|
#
|
|
# Example: this would return armv8.6-a on a gcc-11.3 when platform requested for armv9.0-a
|
|
#
|
|
# Thus this function should be used in conjunction with major_best_avail_march, when best match
|
|
# is not found it should be ok to try with lastest known supported march value from the
|
|
# compiler.
|
|
define latest_match_march
|
|
$(1) := $(lastword $(filter armv%-a, $(GCC_MARCH_OUTPUT)))
|
|
endef
|
|
|
|
ifdef MARCH_DIRECTIVE
|
|
march-directive := $(MARCH_DIRECTIVE)
|
|
else
|
|
|
|
ifeq (${ARM_ARCH_MINOR},0)
|
|
provided-march = armv${ARM_ARCH_MAJOR}-a
|
|
else
|
|
provided-march = armv${ARM_ARCH_MAJOR}.${ARM_ARCH_MINOR}-a
|
|
endif
|
|
|
|
ifeq ($(filter %-clang,$($(ARCH)-cc-id)),)
|
|
|
|
# We expect from Platform to provide a correct Major/Minor value but expecting something
|
|
# from compiler with unsupported march means we shouldn't fail without trying anything,
|
|
# so here we try to find best supported march value and use that for compilation.
|
|
# If we don't support current march version from gcc compiler, try with lower arch based on
|
|
# availability. In TF-A there is no hard rule for need of higher version march for basic
|
|
# functionality, denying a build on only this fact doesn't look correct, so try with best
|
|
# or latest march values from whats available from compiler.
|
|
ifeq (,$(findstring $(provided-march), $(GCC_MARCH_OUTPUT)))
|
|
$(eval $(call major_best_avail_march, available-march))
|
|
|
|
ifeq (, $(available-march))
|
|
$(eval $(call latest_match_march, available-march))
|
|
endif
|
|
|
|
# If we fail to come up with any available-march value so far, don't update
|
|
# provided-march and thus allow the build to fail using the provided-march
|
|
# which is derived based on arch_major and arch_minor values.
|
|
ifneq (,$(available-march))
|
|
provided-march := ${available-march}
|
|
endif
|
|
|
|
endif # provided-march supported
|
|
endif # not clang
|
|
|
|
march-directive := -march=${provided-march}
|
|
|
|
# Set the compiler's architecture feature modifiers
|
|
ifneq ($(arch-features), none)
|
|
# Strip "none+" from arch-features
|
|
arch-features := $(subst none+,,$(arch-features))
|
|
march-directive := $(march-directive)+$(arch-features)
|
|
# Print features
|
|
$(info Arm Architecture Features specified: $(subst +, ,$(arch-features)))
|
|
endif #(arch-features)
|
|
|
|
endif # MARCH_DIRECTIVE
|