307 lines
10 KiB
Plaintext
307 lines
10 KiB
Plaintext
# 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.
|
|
|
|
import("//build_overrides/pigweed.gni")
|
|
|
|
import("$dir_pw_assert/backend.gni")
|
|
import("$dir_pw_bloat/bloat.gni")
|
|
import("$dir_pw_boot/backend.gni")
|
|
import("$dir_pw_build/cc_library.gni")
|
|
import("$dir_pw_chrono/backend.gni")
|
|
import("$dir_pw_interrupt/backend.gni")
|
|
import("$dir_pw_log/backend.gni")
|
|
import("$dir_pw_log_string/backend.gni")
|
|
import("$dir_pw_malloc/backend.gni")
|
|
import("$dir_pw_sync/backend.gni")
|
|
import("$dir_pw_sys_io/backend.gni")
|
|
import("$dir_pw_thread/backend.gni")
|
|
import("$dir_pw_toolchain/arm_gcc/toolchains.gni")
|
|
import("$dir_pw_toolchain/generate_toolchain.gni")
|
|
import("$dir_pw_toolchain/host_clang/toolchains.gni")
|
|
import("$dir_pw_toolchain/host_gcc/toolchains.gni")
|
|
import("$dir_pw_unit_test/test.gni")
|
|
import("backend.gni")
|
|
import("freertos_backends.gni")
|
|
import("stl_backends.gni")
|
|
|
|
# This scope is essentially an enum for pw_system_target's `cpu` selection.
|
|
PW_SYSTEM_CPU = {
|
|
CORTEX_M4F = "cortex-m4f"
|
|
CORTEX_M3 = "cortex-m3"
|
|
CORTEX_M7F = "cortex-m7f"
|
|
|
|
# Native builds for the host CPU.
|
|
NATIVE = "native"
|
|
}
|
|
|
|
# This scope is essentially an enum for pw_system_target's `scheduler`
|
|
# selection.
|
|
PW_SYSTEM_SCHEDULER = {
|
|
FREERTOS = "freertos"
|
|
|
|
# Native uses the host OS's native scheduler and OS primitives as provided
|
|
# through the Standard Template Library.
|
|
NATIVE = "native"
|
|
}
|
|
|
|
# Defines a target toolchain, automatically setting many required build
|
|
# arguments to simplify instantiation of a target.
|
|
#
|
|
# Args:
|
|
# cpu: (required) The architecture to target.
|
|
# Supported choices: PW_SYSTEM_CPU.CORTEX_M7F, PW_SYSTEM_CPU.CORTEX_M4F, PW_SYSTEM_CPU.CORTEX_M3, PW_SYSTEM_CPU.NATIVE
|
|
# scheduler: (required) The scheduler implementation and API to use for this
|
|
# target.
|
|
# Supported choices: PW_SYSTEM_SCHEDULER.FREERTOS, PW_SYSTEM_SCHEDULER.NATIVE
|
|
# use_pw_malloc: Whether or not to replace the default malloc implementation
|
|
# with pw_malloc. Defaults enabled for supported targets.
|
|
# link_deps: Additional link-time dependencies required for all executables.
|
|
# This is a list of source sets.
|
|
# build_args: Additional overrides for GN build arguments.
|
|
# global_configs: Configs that will be globally applied to all pw_source_set,
|
|
# pw_static_library, and pw_executable targets.
|
|
template("pw_system_target") {
|
|
_OPTIMIZATION_LEVELS = {
|
|
SIZE_OPTIMIZED = "size_optimized"
|
|
SPEED_OPTIMIZED = "speed_optimized"
|
|
DEBUG = "debug"
|
|
}
|
|
|
|
# Generic defaults.
|
|
_default_configs = [ "$dir_pw_build:extra_strict_warnings" ]
|
|
if (defined(invoker.global_configs)) {
|
|
foreach(cfg, invoker.global_configs) {
|
|
_default_configs += [ get_path_info(cfg, "abspath") ]
|
|
}
|
|
}
|
|
|
|
_link_deps = [
|
|
"$dir_pw_assert:impl",
|
|
"$dir_pw_log:impl",
|
|
]
|
|
if (defined(invoker.link_deps)) {
|
|
_link_deps += invoker.link_deps
|
|
}
|
|
_final_binary_extension = ""
|
|
|
|
_default_build_args = {
|
|
pw_system_RPC_SERVER_BACKEND = "$dir_pw_system:hdlc_rpc_server"
|
|
pw_system_IO_BACKEND = "$dir_pw_system:sys_io_target_io"
|
|
|
|
# TODO(amontanez): This should be set to pw_assert_log ASAP.
|
|
pw_assert_BACKEND = dir_pw_assert_basic
|
|
|
|
# TODO(amontanez): This should be set to pw_log_tokenized when support
|
|
# is added.
|
|
pw_log_BACKEND = dir_pw_log_basic
|
|
|
|
pw_rpc_CONFIG = "$dir_pw_rpc:use_global_mutex"
|
|
|
|
# TODO(amontanez): This should be set to a "$dir_pw_unit_test:rpc_main"
|
|
# when RPC is working.
|
|
pw_unit_test_MAIN = "$dir_pw_unit_test:logging_main"
|
|
}
|
|
|
|
# Populate architecture-specific build args.
|
|
assert(
|
|
defined(invoker.cpu),
|
|
"Please select a `cpu` for $target_name. Options: PW_SYSTEM_CPU.CORTEX_M7, PW_SYSTEM_CPU.CORTEX_M4F, PW_SYSTEM_CPU.CORTEX_M3, PW_SYSTEM_CPU.NATIVE")
|
|
if (invoker.cpu == PW_SYSTEM_CPU.CORTEX_M7F) {
|
|
_current_cpu = "arm"
|
|
_default_configs += [ "$dir_pw_toolchain/arm_gcc:enable_float_printf" ]
|
|
_arch_build_args = {
|
|
pw_bloat_BLOATY_CONFIG = "$dir_pw_boot_cortex_m/bloaty_config.bloaty"
|
|
pw_boot_BACKEND = "$dir_pw_boot_cortex_m:armv7m"
|
|
pw_interrupt_CONTEXT_BACKEND = "$dir_pw_interrupt_cortex_m:context_armv7m"
|
|
}
|
|
|
|
_final_binary_extension = ".elf"
|
|
|
|
_toolchains = [
|
|
{
|
|
toolchain_base = pw_toolchain_arm_gcc.cortex_m7f_debug
|
|
level_name = _OPTIMIZATION_LEVELS.DEBUG
|
|
},
|
|
{
|
|
toolchain_base = pw_toolchain_arm_gcc.cortex_m7f_size_optimized
|
|
level_name = _OPTIMIZATION_LEVELS.SIZE_OPTIMIZED
|
|
},
|
|
{
|
|
toolchain_base = pw_toolchain_arm_gcc.cortex_m7f_speed_optimized
|
|
level_name = _OPTIMIZATION_LEVELS.SPEED_OPTIMIZED
|
|
},
|
|
]
|
|
} else if (invoker.cpu == PW_SYSTEM_CPU.CORTEX_M4F) {
|
|
_current_cpu = "arm"
|
|
_default_configs += [ "$dir_pw_toolchain/arm_gcc:enable_float_printf" ]
|
|
_arch_build_args = {
|
|
pw_bloat_BLOATY_CONFIG = "$dir_pw_boot_cortex_m/bloaty_config.bloaty"
|
|
pw_boot_BACKEND = "$dir_pw_boot_cortex_m:armv7m"
|
|
pw_interrupt_CONTEXT_BACKEND = "$dir_pw_interrupt_cortex_m:context_armv7m"
|
|
}
|
|
|
|
_final_binary_extension = ".elf"
|
|
|
|
_toolchains = [
|
|
{
|
|
toolchain_base = pw_toolchain_arm_gcc.cortex_m4f_debug
|
|
level_name = _OPTIMIZATION_LEVELS.DEBUG
|
|
},
|
|
{
|
|
toolchain_base = pw_toolchain_arm_gcc.cortex_m4f_size_optimized
|
|
level_name = _OPTIMIZATION_LEVELS.SIZE_OPTIMIZED
|
|
},
|
|
{
|
|
toolchain_base = pw_toolchain_arm_gcc.cortex_m4f_speed_optimized
|
|
level_name = _OPTIMIZATION_LEVELS.SPEED_OPTIMIZED
|
|
},
|
|
]
|
|
} else if (invoker.cpu == PW_SYSTEM_CPU.CORTEX_M3) {
|
|
_current_cpu = "arm"
|
|
_arch_build_args = {
|
|
pw_bloat_BLOATY_CONFIG = "$dir_pw_boot_cortex_m/bloaty_config.bloaty"
|
|
pw_boot_BACKEND = "$dir_pw_boot_cortex_m:armv7m"
|
|
pw_interrupt_CONTEXT_BACKEND = "$dir_pw_interrupt_cortex_m:context_armv7m"
|
|
}
|
|
|
|
_final_binary_extension = ".elf"
|
|
|
|
_toolchains = [
|
|
{
|
|
toolchain_base = pw_toolchain_arm_gcc.cortex_m3_debug
|
|
level_name = _OPTIMIZATION_LEVELS.DEBUG
|
|
},
|
|
{
|
|
toolchain_base = pw_toolchain_arm_gcc.cortex_m3_size_optimized
|
|
level_name = _OPTIMIZATION_LEVELS.SIZE_OPTIMIZED
|
|
},
|
|
{
|
|
toolchain_base = pw_toolchain_arm_gcc.cortex_m3_speed_optimized
|
|
level_name = _OPTIMIZATION_LEVELS.SPEED_OPTIMIZED
|
|
},
|
|
]
|
|
} else if (invoker.cpu == PW_SYSTEM_CPU.NATIVE) {
|
|
_current_cpu = host_cpu
|
|
_arch_build_args = {
|
|
pw_log_BACKEND = dir_pw_log_string
|
|
pw_log_string_HANDLER_BACKEND = "$dir_pw_system:log_backend"
|
|
pw_sys_io_BACKEND = "$dir_pw_sys_io_stdio"
|
|
pw_system_IO_BACKEND = "$dir_pw_system:socket_target_io"
|
|
}
|
|
_link_deps += [ "$dir_pw_log_string:handler.impl" ]
|
|
|
|
if (host_os != "win") {
|
|
_toolchains = [
|
|
{
|
|
toolchain_base = pw_toolchain_host_clang.debug
|
|
level_name = _OPTIMIZATION_LEVELS.DEBUG
|
|
},
|
|
{
|
|
toolchain_base = pw_toolchain_host_clang.size_optimized
|
|
level_name = _OPTIMIZATION_LEVELS.SIZE_OPTIMIZED
|
|
},
|
|
{
|
|
toolchain_base = pw_toolchain_host_clang.speed_optimized
|
|
level_name = _OPTIMIZATION_LEVELS.SPEED_OPTIMIZED
|
|
},
|
|
]
|
|
} else {
|
|
_toolchains = [
|
|
{
|
|
toolchain_base = pw_toolchain_host_gcc.debug
|
|
level_name = _OPTIMIZATION_LEVELS.DEBUG
|
|
},
|
|
{
|
|
toolchain_base = pw_toolchain_host_gcc.size_optimized
|
|
level_name = _OPTIMIZATION_LEVELS.SIZE_OPTIMIZED
|
|
},
|
|
{
|
|
toolchain_base = pw_toolchain_host_gcc.speed_optimized
|
|
level_name = _OPTIMIZATION_LEVELS.SPEED_OPTIMIZED
|
|
},
|
|
]
|
|
}
|
|
}
|
|
assert(defined(_arch_build_args),
|
|
"Unknown cpu choice for $target_name: `${invoker.cpu}`")
|
|
|
|
# Populate OS-specific build args.
|
|
assert(
|
|
defined(invoker.scheduler),
|
|
"Please select an `scheduler` for $target_name. Options: PW_SYSTEM_SCHEDULER.FREERTOS, PW_SYSTEM_SCHEDULER.NATIVE")
|
|
if (invoker.scheduler == PW_SYSTEM_SCHEDULER.FREERTOS) {
|
|
_current_os = "freertos"
|
|
_os_build_args = PW_SYSTEM_FREERTOS_BACKENDS
|
|
} else if (invoker.scheduler == PW_SYSTEM_SCHEDULER.NATIVE) {
|
|
_current_os = host_os
|
|
_os_build_args = PW_SYSTEM_STL_BACKENDS
|
|
}
|
|
assert(defined(_os_build_args),
|
|
"Unknown scheduler choice for $target_name: `${invoker.scheduler}`")
|
|
|
|
# Configure malloc defaults.
|
|
_use_pw_malloc = false
|
|
if (defined(invoker.use_pw_malloc)) {
|
|
_use_pw_malloc = invoker.use_pw_malloc
|
|
} else if (invoker.cpu != PW_SYSTEM_CPU.NATIVE) {
|
|
_use_pw_malloc = true
|
|
}
|
|
|
|
if (_use_pw_malloc) {
|
|
_default_configs += [ "$dir_pw_malloc:pw_malloc_wrapper_config" ]
|
|
_link_deps += [ dir_pw_malloc ]
|
|
_malloc_build_args = {
|
|
pw_malloc_BACKEND = dir_pw_malloc_freelist
|
|
}
|
|
} else {
|
|
_malloc_build_args = {
|
|
}
|
|
}
|
|
|
|
foreach(toolchain_and_level, _toolchains) {
|
|
# Clear from previous iteration.
|
|
_base = {
|
|
}
|
|
_base = toolchain_and_level.toolchain_base
|
|
|
|
generate_toolchain("${target_name}.${toolchain_and_level.level_name}") {
|
|
forward_variables_from(_base,
|
|
"*",
|
|
[
|
|
"defaults",
|
|
"name",
|
|
])
|
|
final_binary_extension = _final_binary_extension
|
|
defaults = {
|
|
current_os = _current_os
|
|
current_cpu = _current_cpu
|
|
forward_variables_from(_base.defaults, "*")
|
|
forward_variables_from(_default_build_args, "*")
|
|
forward_variables_from(_arch_build_args, "*")
|
|
forward_variables_from(_os_build_args, "*")
|
|
forward_variables_from(_malloc_build_args, "*")
|
|
default_configs += _default_configs
|
|
if (!defined(pw_build_LINK_DEPS)) {
|
|
pw_build_LINK_DEPS = []
|
|
}
|
|
pw_build_LINK_DEPS += _link_deps
|
|
|
|
if (defined(invoker.build_args)) {
|
|
forward_variables_from(invoker.build_args, "*")
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|