# Copyright 2021 The Pigweed Authors # # Licensed under the Apache License, Version 2.0 (the "License"); you may not # use this file except in compliance with the License. You may obtain a copy of # the License at # # https://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations under # the License. _script_path = get_path_info("../py/pw_toolchain/clang_arm_toolchain.py", "abspath") # This template generates a config that can be used to target ARM cores using # a clang compiler. # # Clang isn't a plug-and-play experience for Cortex-M baremetal targets; it's # missing C runtime libraries, C/C++ standard libraries, and a few other # things. This template uses the provided cflags, asmflags, ldflags, etc. to # generate a config that pulls the missing components from an arm-none-eabi-gcc # compiler on the system PATH. The end result is a clang-based compiler that # pulls in gcc-provided headers and libraries to complete the toolchain. # # Args: # - asmflags, cflags, cflags_c, cflags_cc, ldflags: These flags are used to # locate the correct architecture-specific libraries/headers. To # properly drive the script, provide all architecture flags (e.g. -mcpu, # -mabi, -mthumb, -mfloat-abi, -mfpu) in at least one of these # variables. # # Generated targets: # - $target_name: The final config to use with your clang toolchain. template("pw_clang_arm_config") { config(target_name) { # Pull all the compiler flags into a single list. _compiler_flags = [] forward_variables_from(invoker, "*") if (defined(asmflags)) { _compiler_flags += asmflags } else { asmflags = [] } if (defined(cflags)) { _compiler_flags += cflags } else { cflags = [] } if (defined(cflags_c)) { _compiler_flags += cflags_c } else { cflags_c = [] } if (defined(cflags_cc)) { _compiler_flags += cflags_cc } else { cflags_cc = [] } if (defined(ldflags)) { _compiler_flags += ldflags } else { ldflags = [] } # Invoke the script that will generate clang flags based on the current # compiler version and desired arch. _script_flags = [ "--gn-scope", "--cflags", "--ldflags", "--", ] _script_flags += _compiler_flags _arm_flags = exec_script(_script_path, _script_flags, "scope") cflags += _arm_flags.cflags ldflags += _arm_flags.cflags ldflags += _arm_flags.ldflags libs = [ "c_nano", "m", "gcc", "stdc++_nano", ] } }