blob: f7f9962c97f0f417156b6d4a8c7255d6c5152086 [file] [log] [blame]
# Copyright 2019 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.
import("arm_gcc.gni")
import("host_clang.gni")
import("host_gcc.gni")
# Creates a series of toolchain targets with common compiler options.
#
# Args:
# toolchain_template: The target template to use to create the toolchains.
# common_toolchain_cflags: cflags to be shared by all toolchains.
# common_toolchain_ldflags: ldflags to be shared by all toolchains.
# toolchains: List of scopes defining each of the desired toolchains.
# Each scope contains up to three variables:
# toolchain_name: The full target name of the toolchain.
# additional_cflags: Optional list of extra cflags for the toolchain.
# additional_ldflags: Optional list of extra ldflags for the toolchain.
template("generate_toolchains") {
not_needed([ "target_name" ])
assert(defined(invoker.toolchain_template),
"generate_toolchains requires a toolchain template")
assert(defined(invoker.toolchains),
"generate_toolchains must be called with a list of toolchains")
if (defined(invoker.common_toolchain_cflags)) {
_common_cflags = invoker.common_toolchain_cflags
} else {
_common_cflags = []
}
if (defined(invoker.common_toolchain_ldflags)) {
_common_ldflags = invoker.common_toolchain_ldflags
} else {
_common_ldflags = []
}
# Create a target for each of the desired toolchains, appending its own cflags
# and ldflags to the common ones.
foreach(toolchain_config, invoker.toolchains) {
# GN does not allow assigning a non-empty array to a non-empty array.
# This must be done as two assignments, first clearing the original value.
_toolchain_cflags = []
_toolchain_cflags = _common_cflags
if (defined(toolchain_config.additional_cflags)) {
_toolchain_cflags += toolchain_config.additional_cflags
}
_toolchain_ldflags = []
_toolchain_ldflags = _common_ldflags
if (defined(toolchain_config.additional_ldflags)) {
_toolchain_ldflags += toolchain_config.additional_ldflags
}
target(invoker.toolchain_template, toolchain_config.toolchain_name) {
toolchain_cflags = _toolchain_cflags
toolchain_ldflags = _toolchain_ldflags
}
}
}
generate_toolchains("cortex_m4") {
toolchain_template = "arm_gcc_toolchain"
software_fpu_cflags = [ "-mfloat-abi=soft" ]
hardware_fpu_cflags = [
# When hardware FPU is enabled, PW_ARMV7M_ENABLE_FPU is set to 1.
# TODO(pwbug/17): Replace when there's a more sophisticated configuration
# system.
"-DPW_ARMV7M_ENABLE_FPU=1",
"-mfloat-abi=hard",
"-mfpu=fpv4-sp-d16",
]
common_toolchain_cflags = [
"-mabi=aapcs",
"-mcpu=cortex-m4",
"-mthumb",
"-specs=nano.specs",
"-specs=nosys.specs",
]
common_toolchain_ldflags = [
"-lnosys",
"-lc",
]
toolchains = [
# Cortex-M4 toolchains that use software-emulated floating point.
{
toolchain_name = "arm_gcc_cortex_m4_og"
additional_cflags = [ "-Og" ]
additional_cflags += software_fpu_cflags
},
{
toolchain_name = "arm_gcc_cortex_m4_o1"
additional_cflags = [ "-O1" ]
additional_cflags += software_fpu_cflags
},
{
toolchain_name = "arm_gcc_cortex_m4_o2"
additional_cflags = [ "-O2" ]
additional_cflags += software_fpu_cflags
},
{
toolchain_name = "arm_gcc_cortex_m4_os"
additional_cflags = [ "-Os" ]
additional_cflags += software_fpu_cflags
},
# Cortex-M4 toolchains that use hardware FPU instructions.
{
toolchain_name = "arm_gcc_cortex_m4f_og"
additional_cflags = [ "-Og" ]
additional_cflags += hardware_fpu_cflags
},
{
toolchain_name = "arm_gcc_cortex_m4f_o1"
additional_cflags = [ "-O1" ]
additional_cflags += hardware_fpu_cflags
},
{
toolchain_name = "arm_gcc_cortex_m4f_o2"
additional_cflags = [ "-O2" ]
additional_cflags += hardware_fpu_cflags
},
{
toolchain_name = "arm_gcc_cortex_m4f_os"
additional_cflags = [ "-Os" ]
additional_cflags += hardware_fpu_cflags
},
]
}
generate_toolchains("host_gcc_suite") {
toolchain_template = "host_gcc"
toolchains = [
{
toolchain_name = "host_gcc_og"
additional_cflags = [ "-Og" ]
},
{
toolchain_name = "host_gcc_o2"
additional_cflags = [ "-O2" ]
},
{
toolchain_name = "host_gcc_os"
additional_cflags = [ "-Os" ]
},
]
}
generate_toolchains("host_clang_suite") {
toolchain_template = "host_clang"
common_toolchain_cflags = [ "-g3" ]
toolchains = [
{
toolchain_name = "host_clang_og"
additional_cflags = [ "-Og" ]
},
{
toolchain_name = "host_clang_o2"
additional_cflags = [ "-O2" ]
},
{
toolchain_name = "host_clang_os"
additional_cflags = [ "-Os" ]
},
]
}