1cc277de8SChris Kay# 2cc277de8SChris Kay# Copyright (c) 2023-2024, Arm Limited and Contributors. All rights reserved. 3cc277de8SChris Kay# 4cc277de8SChris Kay# SPDX-License-Identifier: BSD-3-Clause 5cc277de8SChris Kay# 6cc277de8SChris Kay 7cc277de8SChris Kay# 8cc277de8SChris Kay# TF-A uses three toolchains: 9cc277de8SChris Kay# 10cc277de8SChris Kay# - The host toolchain (`host`) for building native tools 11291e7182SChris Kay# - The AArch32 toolchain (`aarch32`) for building Arm AArch32 images 12cc277de8SChris Kay# - The AArch64 toolchain (`aarch64`) for building Arm AArch64 images 13cc277de8SChris Kay# 14cc277de8SChris Kay# In the main Makefile only one of the two Arm toolchains is enabled in any 15cc277de8SChris Kay# given build, but individual tools and libraries may need access to both. 16cc277de8SChris Kay# 17cc277de8SChris Kay 18291e7182SChris Kayifndef toolchain-mk 19291e7182SChris Kay toolchain-mk := $(lastword $(MAKEFILE_LIST)) 20291e7182SChris Kay 213789c3c0SChris Kay include $(dir $(toolchain-mk))build_env.mk 223789c3c0SChris Kay include $(dir $(toolchain-mk))utilities.mk 23cc277de8SChris Kay 243789c3c0SChris Kay # 253789c3c0SChris Kay # Make assigns generic default values to `CC`, `CPP`, `AS`, etc. if they 263789c3c0SChris Kay # are not explicitly assigned values by the user. These are usually okay 273789c3c0SChris Kay # for very simple programs when building for the host system, but we 283789c3c0SChris Kay # need greater control over the toolchain flow. 293789c3c0SChris Kay # 303789c3c0SChris Kay # Therefore, we undefine these built-in variables if they have default 313789c3c0SChris Kay # values, so that we can provide our own default values later instead. 323789c3c0SChris Kay # 334731c00bSChris Kay 343789c3c0SChris Kay ifeq ($(origin CC),default) 353789c3c0SChris Kay undefine CC 363789c3c0SChris Kay endif 373789c3c0SChris Kay 383789c3c0SChris Kay ifeq ($(origin CPP),default) 393789c3c0SChris Kay undefine CPP 403789c3c0SChris Kay endif 413789c3c0SChris Kay 423789c3c0SChris Kay ifeq ($(origin AS),default) 433789c3c0SChris Kay undefine AS 443789c3c0SChris Kay endif 453789c3c0SChris Kay 463789c3c0SChris Kay ifeq ($(origin AR),default) 473789c3c0SChris Kay undefine AR 483789c3c0SChris Kay endif 493789c3c0SChris Kay 503789c3c0SChris Kay ifeq ($(origin LD),default) 513789c3c0SChris Kay undefine LD 523789c3c0SChris Kay endif 533789c3c0SChris Kay 543789c3c0SChris Kay # 553789c3c0SChris Kay # The full list of toolchains supported by TF-A. 563789c3c0SChris Kay # 573789c3c0SChris Kay # Each of these toolchains defines a file of the same name in the 583789c3c0SChris Kay # `toolchains` directory, which must configure the following variables: 593789c3c0SChris Kay # 603789c3c0SChris Kay # - <toolchain>-name 613789c3c0SChris Kay # 623789c3c0SChris Kay # A human-readable name for the toolchain, 633789c3c0SChris Kay # 643789c3c0SChris Kay # Additionally, for every tool class, it must also define: 653789c3c0SChris Kay # 663789c3c0SChris Kay # - <toolchain>-<tool-class>-parameter 673789c3c0SChris Kay # 683789c3c0SChris Kay # The command line or environment variable used to set the tool for 693789c3c0SChris Kay # for the given tool class. 703789c3c0SChris Kay # 71*9cea2c36SChris Kay # - <toolchain>-<tool-class>-default-id 723789c3c0SChris Kay # 733789c3c0SChris Kay # The default tool identifier used if the tool for the given tool 743789c3c0SChris Kay # class cannot be identified. 753789c3c0SChris Kay # 76*9cea2c36SChris Kay # - <toolchain>-<tool-class>-default 77*9cea2c36SChris Kay # 78*9cea2c36SChris Kay # The default commands to try, in the order defined, for the given 79*9cea2c36SChris Kay # tool class if the user does not explicitly provide one, and if the 80*9cea2c36SChris Kay # command could not be derived from the C compiler. 81*9cea2c36SChris Kay # 823789c3c0SChris Kay 833789c3c0SChris Kay toolchains := host # Used for host targets 843789c3c0SChris Kay toolchains += aarch32 # Used for AArch32 targets 853789c3c0SChris Kay toolchains += aarch64 # Used for AArch64 targets 863789c3c0SChris Kay toolchains += rk3399-m0 # Used for RK3399 Cortex-M0 targets 873789c3c0SChris Kay 883789c3c0SChris Kay include $(toolchains:%=$(dir $(toolchain-mk))toolchains/%.mk) 89cc277de8SChris Kay 90cc277de8SChris Kay # 91cc277de8SChris Kay # Configure tool classes that we recognize. 92cc277de8SChris Kay # 93291e7182SChris Kay # In the context of this build system, a tool class identifies a 94291e7182SChris Kay # specific role or type of tool in the toolchain. 95cc277de8SChris Kay # 96cc277de8SChris Kay 9714260dbfSChris Kay toolchain-tool-classes := cc 9814260dbfSChris Kay toolchain-tool-class-name-cc := C compiler 99cc277de8SChris Kay 10014260dbfSChris Kay toolchain-tool-classes += cpp 10114260dbfSChris Kay toolchain-tool-class-name-cpp := C preprocessor 102cc277de8SChris Kay 10314260dbfSChris Kay toolchain-tool-classes += as 10414260dbfSChris Kay toolchain-tool-class-name-as := assembler 105cc277de8SChris Kay 10614260dbfSChris Kay toolchain-tool-classes += ld 10714260dbfSChris Kay toolchain-tool-class-name-ld := linker 1083d6c7e59SChris Kay 10914260dbfSChris Kay toolchain-tool-classes += oc 11014260dbfSChris Kay toolchain-tool-class-name-oc := object copier 1113d6c7e59SChris Kay 11214260dbfSChris Kay toolchain-tool-classes += od 11314260dbfSChris Kay toolchain-tool-class-name-od := object dumper 1143d6c7e59SChris Kay 11514260dbfSChris Kay toolchain-tool-classes += ar 11614260dbfSChris Kay toolchain-tool-class-name-ar := archiver 1173d6c7e59SChris Kay 11814260dbfSChris Kay toolchain-tool-classes += dtc 11914260dbfSChris Kay toolchain-tool-class-name-dtc := device tree compiler 120cc277de8SChris Kay 121cc277de8SChris Kay # 122cc277de8SChris Kay # Configure tools that we recognize. 123cc277de8SChris Kay # 124291e7182SChris Kay # Here we declare the list of specific toolchain tools that we know how 125291e7182SChris Kay # to interact with. We don't organize these into tool classes yet - that 126291e7182SChris Kay # happens further down. 127cc277de8SChris Kay # 128cc277de8SChris Kay 129291e7182SChris Kay # Arm® Compiler for Embedded 13014260dbfSChris Kay toolchain-tools := arm-clang 13114260dbfSChris Kay toolchain-tool-name-arm-clang := Arm® Compiler for Embedded `armclang` 1323d6c7e59SChris Kay 13314260dbfSChris Kay toolchain-tools += arm-link 13414260dbfSChris Kay toolchain-tool-name-arm-link := Arm® Compiler for Embedded `armlink` 1353d6c7e59SChris Kay 13614260dbfSChris Kay toolchain-tools += arm-ar 13714260dbfSChris Kay toolchain-tool-name-arm-ar := Arm® Compiler for Embedded `armar` 1383d6c7e59SChris Kay 13914260dbfSChris Kay toolchain-tools += arm-fromelf 14014260dbfSChris Kay toolchain-tool-name-arm-fromelf := Arm® Compiler for Embedded `fromelf` 141cc277de8SChris Kay 142cc277de8SChris Kay # LLVM Project 14314260dbfSChris Kay toolchain-tools += llvm-clang 14414260dbfSChris Kay toolchain-tool-name-llvm-clang := LLVM Clang (`clang`) 1453d6c7e59SChris Kay 14614260dbfSChris Kay toolchain-tools += llvm-lld 14714260dbfSChris Kay toolchain-tool-name-llvm-lld := LLVM LLD (`lld`) 1483d6c7e59SChris Kay 14914260dbfSChris Kay toolchain-tools += llvm-objcopy 15014260dbfSChris Kay toolchain-tool-name-llvm-objcopy := LLVM `llvm-objcopy` 1513d6c7e59SChris Kay 15214260dbfSChris Kay toolchain-tools += llvm-objdump 15314260dbfSChris Kay toolchain-tool-name-llvm-objdump := LLVM `llvm-objdump` 1543d6c7e59SChris Kay 15514260dbfSChris Kay toolchain-tools += llvm-ar 15614260dbfSChris Kay toolchain-tool-name-llvm-ar := LLVM `llvm-ar` 157cc277de8SChris Kay 158cc277de8SChris Kay # GNU Compiler Collection & GNU Binary Utilities 15914260dbfSChris Kay toolchain-tools += gnu-gcc 16014260dbfSChris Kay toolchain-tool-name-gnu-gcc := GNU GCC (`gcc`) 1613d6c7e59SChris Kay 16214260dbfSChris Kay toolchain-tools += gnu-ld 16314260dbfSChris Kay toolchain-tool-name-gnu-ld := GNU LD (`ld.bfd`) 1643d6c7e59SChris Kay 16514260dbfSChris Kay toolchain-tools += gnu-objcopy 16614260dbfSChris Kay toolchain-tool-name-gnu-objcopy := GNU `objcopy` 1673d6c7e59SChris Kay 16814260dbfSChris Kay toolchain-tools += gnu-objdump 16914260dbfSChris Kay toolchain-tool-name-gnu-objdump := GNU `objdump` 1703d6c7e59SChris Kay 17114260dbfSChris Kay toolchain-tools += gnu-ar 17214260dbfSChris Kay toolchain-tool-name-gnu-ar := GNU `ar` 173cc277de8SChris Kay 174cc277de8SChris Kay # Other tools 17514260dbfSChris Kay toolchain-tools += generic-dtc 17614260dbfSChris Kay toolchain-tool-name-generic-dtc := Device Tree Compiler (`dtc`) 177cc277de8SChris Kay 178cc277de8SChris Kay # 179cc277de8SChris Kay # Assign tools to tool classes. 180cc277de8SChris Kay # 181291e7182SChris Kay # Multifunctional tools, i.e. tools which can perform multiple roles in 182291e7182SChris Kay # a toolchain, may be specified in multiple tool class lists. For 183291e7182SChris Kay # example, a C compiler which can also perform the role of a linker may 18414260dbfSChris Kay # be placed in both `toolchain-tools-cc` and `toolchain-tools-ld`. 185cc277de8SChris Kay # 186cc277de8SChris Kay 187cc277de8SChris Kay # C-related tools 18814260dbfSChris Kay toolchain-tools-cc := arm-clang llvm-clang gnu-gcc # C compilers 18914260dbfSChris Kay toolchain-tools-cpp := arm-clang llvm-clang gnu-gcc # C preprocessors 190cc277de8SChris Kay 191cc277de8SChris Kay # Assembly-related tools 19214260dbfSChris Kay toolchain-tools-as := arm-clang llvm-clang gnu-gcc # Assemblers 193cc277de8SChris Kay 194cc277de8SChris Kay # Linking and object-handling tools 19514260dbfSChris Kay toolchain-tools-ld := arm-clang arm-link llvm-clang llvm-lld gnu-gcc gnu-ld # Linkers 19614260dbfSChris Kay toolchain-tools-oc := arm-fromelf llvm-objcopy gnu-objcopy # Object copiers 19714260dbfSChris Kay toolchain-tools-od := arm-fromelf llvm-objdump gnu-objdump # Object dumpers 19814260dbfSChris Kay toolchain-tools-ar := arm-ar llvm-ar gnu-ar # Archivers 199cc277de8SChris Kay 200cc277de8SChris Kay # Other tools 20114260dbfSChris Kay toolchain-tools-dtc := generic-dtc # Device tree compilers 202cc277de8SChris Kay 203cc277de8SChris Kay # 204cc277de8SChris Kay # Helper functions to identify toolchain tools. 205cc277de8SChris Kay # 206291e7182SChris Kay # The functions defined in this section return a tool identifier when 207291e7182SChris Kay # given a path to a binary. We generally check a help or version string 208291e7182SChris Kay # to more reliably identify tools than by looking at the path alone 209291e7182SChris Kay # (e.g. `gcc` on macOS is actually Apple Clang). 210cc277de8SChris Kay # 21114260dbfSChris Kay # Each tool-guessing function (`toolchain-guess-tool-$(tool)`) takes a 21214260dbfSChris Kay # single argument giving the path to the tool to guess, and returns a 21314260dbfSChris Kay # non-empty value if the tool corresponds to the tool identifier 21414260dbfSChris Kay # `$(tool)`: 215cc277de8SChris Kay # 21614260dbfSChris Kay # $(call toolchain-guess-tool-llvm-clang,aarch64-none-elf-gcc) # <empty> 21714260dbfSChris Kay # $(call toolchain-guess-tool-gnu-gcc,aarch64-none-elf-gcc) # <non-empty> 218cc277de8SChris Kay # 21914260dbfSChris Kay # The `toolchain-guess-tool` function tries to find the corresponding tool 220291e7182SChris Kay # identifier for a tool given its path. It takes two arguments: 221cc277de8SChris Kay # 222cc277de8SChris Kay # - $(1): a list of candidate tool identifiers to check 223cc277de8SChris Kay # - $(2): the path to the tool to identify 224cc277de8SChris Kay # 225291e7182SChris Kay # If any of the guess functions corresponding to candidate tool 226291e7182SChris Kay # identifiers return a non-empty value then the tool identifier of the 227291e7182SChris Kay # first function to do so is returned: 228cc277de8SChris Kay # 22914260dbfSChris Kay # $(call toolchain-guess-tool,gnu-gcc llvm-clang,armclang) # <empty> 23014260dbfSChris Kay # $(call toolchain-guess-tool,gnu-gcc llvm-clang,clang-14) # llvm-clang 23114260dbfSChris Kay # $(call toolchain-guess-tool,gnu-gcc llvm-clang,aarch64-none-elf-gcc-12) # gnu-gcc 232cc277de8SChris Kay # 23314260dbfSChris Kay # Tools are checked in the order that they are provided, and the first 23414260dbfSChris Kay # match is returned. 235cc277de8SChris Kay # 236cc277de8SChris Kay 237cc277de8SChris Kay # Arm Compiler for Embedded 23814260dbfSChris Kay toolchain-guess-tool-arm-clang = $(shell $(1) --version 2>&1 <$(nul) | grep -o "Tool: armclang") 23914260dbfSChris Kay toolchain-guess-tool-arm-link = $(shell $(1) --help 2>&1 <$(nul) | grep -o "Tool: armlink") 24014260dbfSChris Kay toolchain-guess-tool-arm-fromelf = $(shell $(1) --help 2>&1 <$(nul) | grep -o "Tool: fromelf") 24114260dbfSChris Kay toolchain-guess-tool-arm-ar = $(shell $(1) --version 2>&1 <$(nul) | grep -o "Tool: armar") 242cc277de8SChris Kay 243cc277de8SChris Kay # LLVM Project 24414260dbfSChris Kay toolchain-guess-tool-llvm-clang = $(shell $(1) -v 2>&1 <$(nul) | grep -o "clang version") 24514260dbfSChris Kay toolchain-guess-tool-llvm-lld = $(shell $(1) --help 2>&1 <$(nul) | grep -o "OVERVIEW: lld") 24614260dbfSChris Kay toolchain-guess-tool-llvm-objcopy = $(shell $(1) --help 2>&1 <$(nul) | grep -o "llvm-objcopy tool") 24714260dbfSChris Kay toolchain-guess-tool-llvm-objdump = $(shell $(1) --help 2>&1 <$(nul) | grep -o "llvm object file dumper") 24814260dbfSChris Kay toolchain-guess-tool-llvm-ar = $(shell $(1) --help 2>&1 <$(nul) | grep -o "LLVM Archiver") 249cc277de8SChris Kay 250cc277de8SChris Kay # GNU Compiler Collection & GNU Binary Utilities 25114260dbfSChris Kay toolchain-guess-tool-gnu-gcc = $(shell $(1) -v 2>&1 <$(nul) | grep -o "gcc version") 25214260dbfSChris Kay toolchain-guess-tool-gnu-ld = $(shell $(1) -v 2>&1 <$(nul) | grep -o "GNU ld") 25314260dbfSChris Kay toolchain-guess-tool-gnu-objcopy = $(shell $(1) --version 2>&1 <$(nul) | grep -o "GNU objcopy") 25414260dbfSChris Kay toolchain-guess-tool-gnu-objdump = $(shell $(1) --version 2>&1 <$(nul) | grep -o "GNU objdump") 25514260dbfSChris Kay toolchain-guess-tool-gnu-ar = $(shell $(1) --version 2>&1 <$(nul) | grep -o "GNU ar") 256cc277de8SChris Kay 257cc277de8SChris Kay # Other tools 25814260dbfSChris Kay toolchain-guess-tool-generic-dtc = $(shell $(1) --version 2>&1 <$(nul) | grep -o "Version: DTC") 259cc277de8SChris Kay 26014260dbfSChris Kay toolchain-guess-tool = $(firstword $(foreach candidate,$(1), \ 26114260dbfSChris Kay $(if $(call toolchain-guess-tool-$(candidate),$(2)),$(candidate)))) 262cc277de8SChris Kay 263cc277de8SChris Kay # 2643789c3c0SChris Kay # Warn the user that a tool could not be identified. 2653789c3c0SChris Kay # 2663789c3c0SChris Kay # Parameters: 2673789c3c0SChris Kay # 2683789c3c0SChris Kay # - $1: The toolchain that the tool belongs to. 2693789c3c0SChris Kay # - $2: The tool class that the tool belongs to. 2703789c3c0SChris Kay # 2713789c3c0SChris Kay 2723789c3c0SChris Kay define toolchain-warn-unrecognized 2733789c3c0SChris Kay $(warning ) 274*9cea2c36SChris Kay $(warning The configured $($(1)-name) $(toolchain-tool-class-name-$(2)) could not be identified:) 2753789c3c0SChris Kay $(warning ) 2763789c3c0SChris Kay $(warning $(space) $($(1)-$(2))$(if $($(1)-$(2)-parameter), (via `$($(1)-$(2)-parameter)`))) 2773789c3c0SChris Kay $(warning ) 278*9cea2c36SChris Kay $(warning The following tools were tried, but either did not exist or could not be identified:) 2793789c3c0SChris Kay $(warning ) 280*9cea2c36SChris Kay 281*9cea2c36SChris Kay $(foreach default,$($(1)-$(2)-default), \ 282*9cea2c36SChris Kay $(warning $(space) - $(default))) 283*9cea2c36SChris Kay 2843789c3c0SChris Kay $(warning ) 2853789c3c0SChris Kay $(warning The following tools are supported:) 2863789c3c0SChris Kay $(warning ) 2873789c3c0SChris Kay 2883789c3c0SChris Kay $(foreach tool,$(toolchain-tools-$(2)), \ 2893789c3c0SChris Kay $(warning $(space) - $(toolchain-tool-name-$(tool)))) 2903789c3c0SChris Kay 2913789c3c0SChris Kay $(warning ) 292*9cea2c36SChris Kay $(warning The build system will treat this $(toolchain-tool-class-name-$(2)) as $(toolchain-tool-name-$($(1)-$(2)-default-id)).) 2933789c3c0SChris Kay $(warning ) 2943789c3c0SChris Kay endef 2953789c3c0SChris Kay 2963789c3c0SChris Kay # 297cc277de8SChris Kay # Locate and identify tools belonging to each toolchain. 298cc277de8SChris Kay # 299cc277de8SChris Kay # Each tool class in each toolchain receives a variable of the form 300291e7182SChris Kay # `$(toolchain)-$(tool)` giving the associated path to the program. For 301291e7182SChris Kay # example: 302cc277de8SChris Kay # 303cc277de8SChris Kay # - `aarch64-ld` gives the linker for the AArch64 toolchain, 304cc277de8SChris Kay # - `aarch32-oc` gives the object copier for the AArch32 toolchain, and 305cc277de8SChris Kay # - `host-cc` gives the C compiler for the host toolchain. 306cc277de8SChris Kay # 307291e7182SChris Kay # For each of these variables, if no program path is explicitly provided 308291e7182SChris Kay # by the parent Makefile then the C compiler is queried (if supported) 30914260dbfSChris Kay # for its location. 310cc277de8SChris Kay # 31114260dbfSChris Kay # If the C compiler cannot provide the location (or the tool class *is* 31214260dbfSChris Kay # the C compiler), then it is assigned a default value specific for that 31314260dbfSChris Kay # toolchain. 314cc277de8SChris Kay # 315cc277de8SChris Kay 31614260dbfSChris Kay toolchain-guess-arm-clang-cpp = $(1) 31714260dbfSChris Kay toolchain-guess-arm-clang-as = $(1) 31814260dbfSChris Kay toolchain-guess-arm-clang-ld = # Fall back to `$(toolchain)-ld-default` 31914260dbfSChris Kay toolchain-guess-arm-clang-oc = # Fall back to `$(toolchain)-oc-default` 32014260dbfSChris Kay toolchain-guess-arm-clang-od = # Fall back to `$(toolchain)-od-default` 32114260dbfSChris Kay toolchain-guess-arm-clang-ar = # Fall back to `$(toolchain)-ar-default` 322cc277de8SChris Kay 32314260dbfSChris Kay toolchain-guess-llvm-clang-cpp = $(1) 32414260dbfSChris Kay toolchain-guess-llvm-clang-as = $(1) 32514260dbfSChris Kay toolchain-guess-llvm-clang-ld = $(shell $(1) --print-prog-name ld.lld 2>$(nul)) 32614260dbfSChris Kay toolchain-guess-llvm-clang-oc = $(shell $(1) --print-prog-name llvm-objcopy 2>$(nul)) 32714260dbfSChris Kay toolchain-guess-llvm-clang-od = $(shell $(1) --print-prog-name llvm-objdump 2>$(nul)) 32814260dbfSChris Kay toolchain-guess-llvm-clang-ar = $(shell $(1) --print-prog-name llvm-ar 2>$(nul)) 329cc277de8SChris Kay 33014260dbfSChris Kay toolchain-guess-gnu-gcc-cpp = $(1) 33114260dbfSChris Kay toolchain-guess-gnu-gcc-as = $(1) 33214260dbfSChris Kay toolchain-guess-gnu-gcc-ld = $(1) 33314260dbfSChris Kay toolchain-guess-gnu-gcc-oc = $(shell $(1) --print-prog-name objcopy 2>$(nul)) 33414260dbfSChris Kay toolchain-guess-gnu-gcc-od = $(shell $(1) --print-prog-name objdump 2>$(nul)) 33514260dbfSChris Kay toolchain-guess-gnu-gcc-ar = $(shell $(1) --print-prog-name ar 2>$(nul)) 336cc277de8SChris Kay 3373789c3c0SChris Kay # 3383789c3c0SChris Kay # Configure a toolchain. 3393789c3c0SChris Kay # 3403789c3c0SChris Kay # Parameters: 3413789c3c0SChris Kay # 3423789c3c0SChris Kay # - $1: The toolchain to configure. 3433789c3c0SChris Kay # 3443789c3c0SChris Kay # This function iterates over all tool classes and configures them for 3453789c3c0SChris Kay # the provided toolchain. Toolchain tools are initialized lazily and 3463789c3c0SChris Kay # on-demand based on the first read of the tool path or identifier 3473789c3c0SChris Kay # variables. 3483789c3c0SChris Kay # 3493d6c7e59SChris Kay 3503789c3c0SChris Kay define toolchain-configure 3513789c3c0SChris Kay $$(foreach tool-class,$$(toolchain-tool-classes), \ 3523789c3c0SChris Kay $$(eval $$(call toolchain-configure-tool,$1,$$(tool-class)))) 3533d6c7e59SChris Kay endef 3543d6c7e59SChris Kay 3553789c3c0SChris Kay # 3563789c3c0SChris Kay # Configure a specific tool within a toolchain. 3573789c3c0SChris Kay # 3583789c3c0SChris Kay # Parameters: 3593789c3c0SChris Kay # 3603789c3c0SChris Kay # - $1: The toolchain to configure. 3613789c3c0SChris Kay # - $2: The tool class to configure. 3623789c3c0SChris Kay # 3633789c3c0SChris Kay 3643789c3c0SChris Kay define toolchain-configure-tool 3653789c3c0SChris Kay $1-$2-configure = $\ 3663789c3c0SChris Kay $$(eval $$(call toolchain-determine-tool,$1,$2)) 3673789c3c0SChris Kay 3683789c3c0SChris Kay # 3693789c3c0SChris Kay # When either of the following variables are read for the first 3703789c3c0SChris Kay # time, the appropriate tool is determined and *both* variables 3713789c3c0SChris Kay # are overwritten with their final values. 3723789c3c0SChris Kay # 3733789c3c0SChris Kay 3743789c3c0SChris Kay $1-$2 = $$($1-$2-configure)$$($1-$2) 3753789c3c0SChris Kay $1-$2-id = $$($1-$2-configure)$$($1-$2-id) 3763789c3c0SChris Kay endef 3773789c3c0SChris Kay 3783789c3c0SChris Kay # 3793789c3c0SChris Kay # Determines and identifies a tool. 3803789c3c0SChris Kay # 3813789c3c0SChris Kay # Parameters: 3823789c3c0SChris Kay # 3833789c3c0SChris Kay # - $1: The toolchain identifier. 3843789c3c0SChris Kay # - $2: The tool class. 3853789c3c0SChris Kay # 3863789c3c0SChris Kay # Tool identification happens by reading the designated tool parameter 3873789c3c0SChris Kay # to get the user-specified command for the tool (e.g. `CC` or `LD`). If 3883789c3c0SChris Kay # no tool parameter is defined then try to derive the tool from the C 3893789c3c0SChris Kay # compiler. 3903789c3c0SChris Kay # 3913789c3c0SChris Kay # If all else fails, fall back to the default command defined by the 3923789c3c0SChris Kay # toolchain makefile. 3933789c3c0SChris Kay # 3943789c3c0SChris Kay 395e01c7126SChris Kay define toolchain-determine-tool 396*9cea2c36SChris Kay toolchain-$1-$2-guess-from-cc = $$(if $$(filter-out cc,$2),$\ 3973789c3c0SChris Kay $$(call toolchain-guess-$$($1-cc-id)-$2,$$($1-cc))) 398cc277de8SChris Kay 3993789c3c0SChris Kay toolchain-$1-$2-shell = $$(or $$($$($1-$2-parameter)),$\ 400*9cea2c36SChris Kay $$(toolchain-$1-$2-guess-from-cc),$\ 401*9cea2c36SChris Kay $$(toolchain-$1-$2-default)) 402*9cea2c36SChris Kay 403*9cea2c36SChris Kay toolchain-$1-$2-default = $$(firstword $\ 404*9cea2c36SChris Kay $$(foreach default,$$($1-$2-default),$\ 405*9cea2c36SChris Kay $$(if $$(call which,$$(default)),$$(default))) $\ 406*9cea2c36SChris Kay $$($1-$2-default)) 4073d6c7e59SChris Kay 4083789c3c0SChris Kay $1-$2 := $(if $(call which,$$(toolchain-$1-$2-shell)),$\ 4093789c3c0SChris Kay $$(call escape-shell,$$(toolchain-$1-$2-shell)),$\ 4103789c3c0SChris Kay $$(toolchain-$1-$2-shell)) 4113d6c7e59SChris Kay 4123789c3c0SChris Kay $1-$2-id := $$(or \ 4133789c3c0SChris Kay $$(call toolchain-guess-tool,$$(toolchain-tools-$2),$$($1-$2)),$\ 414*9cea2c36SChris Kay $$(strip $$(call toolchain-warn-unrecognized,$1,$2)$$($1-$2-default-id))) 415cc277de8SChris Kay endef 416cc277de8SChris Kay 417cc277de8SChris Kay $(foreach toolchain,$(toolchains), \ 4183789c3c0SChris Kay $(eval $(call toolchain-configure,$(toolchain)))) 419291e7182SChris Kayendif 420