| # 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_bloat/bloat.gni") |
| import("$dir_pw_build/python_action.gni") |
| import("$dir_pw_build/target_types.gni") |
| |
| # A convenient template for generating example applications with different |
| # tls/transport backends. |
| # |
| # The template accepts the following arguments: |
| # |
| # tls_backend Required. A target specifying the tls library. |
| # |
| # transport_backend: Required. A target specifying the transport implementation. |
| # |
| # no_bloaty: Whether to generate bloaty size report. Default |
| # to true |
| # |
| # bloaty_config: An optional config file for bloaty report |
| # |
| # time: An optional date string to inject as time. If not spedified, |
| # build time will be used. Must be format |
| # month/day/year hour:minute:second |
| template("tls_client_example") { |
| assert(defined(invoker.tls_backend) && invoker.tls_backend != "", |
| "must provide a tls backend") |
| assert(defined(invoker.transport_backend) && invoker.transport_backend != "", |
| "must provide a transport backend") |
| |
| example_binary_target_name = target_name + "_binary" |
| size_report_target_name = target_name + "_tls_size_report" |
| |
| group(target_name) { |
| deps = [ |
| ":$example_binary_target_name", |
| ":$size_report_target_name", |
| ] |
| } |
| |
| # Target that implements time(time_t*) to provide an injected time. |
| time_injection_target_name = target_name + "_time_injection" |
| time_source_code_output = "$target_gen_dir/$target_name/injected_time.c" |
| pw_python_action(time_injection_target_name) { |
| script = "//applications/tls_example/time_injection/generate_time_code.py" |
| outputs = [ time_source_code_output ] |
| args = [ rebase_path(time_source_code_output) ] |
| if (defined(invoker.time)) { |
| args += [ |
| "-t", |
| invoker.time, |
| ] |
| } |
| } |
| |
| # Target that provides a set of hardcoded root certificates. |
| root_certificates = [] |
| if (defined(invoker.root_certificates)) { |
| root_certificates += invoker.root_certificates |
| } |
| |
| trust_store_target = target_name + "_trust_store" |
| trust_store_code_output = "$target_gen_dir/$target_name/trust_store.cc" |
| trust_store_code_path = rebase_path(trust_store_code_output) |
| pw_python_action(trust_store_target) { |
| script = "//applications/tls_example/trust_store/py" + |
| "/trust_store_generation/generate_trust_store.py" |
| outputs = [ trust_store_code_output ] |
| args = [ trust_store_code_path ] |
| foreach(cert, root_certificates) { |
| args += [ |
| "-r", |
| rebase_path(cert), |
| ] |
| } |
| python_deps = [ "//applications/tls_example/trust_store/py" ] |
| } |
| |
| executable_exclude_vars = [ |
| "tls_backend", |
| "transport_backend", |
| "no_bloaty", |
| "bloaty_config", |
| ] |
| |
| executable_common_vars = { |
| forward_variables_from(invoker, "*", executable_exclude_vars) |
| if (!defined(sources)) { |
| sources = [] |
| } |
| time_source_file = get_target_outputs(":$time_injection_target_name") |
| sources += [ |
| "sysdeps.cc", |
| "tls_client_example.cc", |
| time_source_file[0], |
| trust_store_code_path, |
| ] |
| |
| if (!defined(deps)) { |
| deps = [] |
| } |
| deps += [ |
| ":$time_injection_target_name", |
| ":$trust_store_target", |
| "$dir_pw_log", |
| "$dir_pw_spin_delay", |
| "$dir_pw_sys_io", |
| invoker.transport_backend, |
| ] |
| } |
| |
| # Runnable target |
| pw_executable(example_binary_target_name) { |
| forward_variables_from(executable_common_vars, "*") |
| deps += [ |
| dir_pw_span, |
| invoker.tls_backend, |
| ] |
| } |
| |
| # Size report target. |
| if (!defined(invoker.no_bloaty) || !invoker.no_bloaty) { |
| # A similar target but with a noop tls backend for size comparison |
| base_target_name = example_binary_target_name + "_without_tls" |
| pw_executable(base_target_name) { |
| forward_variables_from(executable_common_vars, "*") |
| deps += [ "//applications/tls_example/backends/tls/dummy:dummy" ] |
| } |
| |
| # Bloaty size report. |
| pw_size_report(size_report_target_name) { |
| title = size_report_target_name |
| base = ":$base_target_name" |
| full_report = true |
| binaries = [ |
| { |
| target = ":$example_binary_target_name" |
| label = "$example_binary_target_name" |
| if (defined(invoker.bloaty_config)) { |
| bloaty_config = invoker.bloaty_config |
| } |
| }, |
| ] |
| } |
| } else { |
| group(size_report_target_name) { |
| } |
| } |
| } |