blob: 6bbd9c43c4b2a19d78094d10813db24fa9ba1c47 [file] [log] [blame]
# 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 += [ 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) {
}
}
}