blob: 5165324dcaf9e21aabc08bc661e824d250986f76 [file] [log] [blame]
Armando Montanez256fb502021-06-28 10:47:49 -07001# Copyright 2021 The Pigweed Authors
2#
3# Licensed under the Apache License, Version 2.0 (the "License"); you may not
4# use this file except in compliance with the License. You may obtain a copy of
5# the License at
6#
7# https://www.apache.org/licenses/LICENSE-2.0
8#
9# Unless required by applicable law or agreed to in writing, software
10# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12# License for the specific language governing permissions and limitations under
13# the License.
14
15import("//build_overrides/pigweed.gni")
16
17import("$dir_pw_build/cc_library.gni")
18
19# Note: In general, prefer to import target_types.gni rather than this file.
20# cc_executable.gni and cc_library.gni are both provided by target_types.gni.
21#
22# cc_library.gni is split out from cc_executable.gni because pw_executable
23# templates may need to create pw_source_set targets internally, and can't
24# import target_types.gni because it creates a circular import path.
25
26declare_args() {
27 # The name of the GN target type used to build Pigweed executables.
28 #
29 # If this is a custom template, the .gni file containing the template must
30 # be imported at the top of the target configuration file to make it globally
31 # available.
32 pw_build_EXECUTABLE_TARGET_TYPE = "executable"
33
34 # The path to the .gni file that defines pw_build_EXECUTABLE_TARGET_TYPE.
35 #
36 # If pw_build_EXECUTABLE_TARGET_TYPE is not the default of `executable`, this
37 # .gni file is imported to provide the template definition.
38 pw_build_EXECUTABLE_TARGET_TYPE_FILE = ""
39}
40
41if (pw_build_EXECUTABLE_TARGET_TYPE != "executable" &&
42 pw_build_EXECUTABLE_TARGET_TYPE_FILE != "") {
43 import(pw_build_EXECUTABLE_TARGET_TYPE_FILE)
44}
45
46_supported_toolchain_defaults = [
47 "configs",
48 "public_deps",
49]
50
51# Wrapper for Pigweed executable build targets which uses a globally-defined,
52# configurable target type.
53template("pw_executable") {
Erik Gilling703abad2021-11-09 11:54:44 -080054 _pw_source_files = []
55
56 # Boilerplate for tracking target sources. For more information see
57 # https://pigweed.dev/pw_build/#target-types
58 if (defined(invoker.sources)) {
59 foreach(path, invoker.sources) {
60 _pw_source_files += [ path ]
61 }
62 }
63 if (defined(invoker.public)) {
64 foreach(path, invoker.public) {
65 _pw_source_files += [ path ]
66 }
67 }
68
Armando Montanez256fb502021-06-28 10:47:49 -070069 _executable_output_dir = "${target_out_dir}/bin"
70 if (defined(invoker.output_dir)) {
71 _executable_output_dir = invoker.output_dir
72 }
73
74 target(pw_build_EXECUTABLE_TARGET_TYPE, target_name) {
75 import("$dir_pw_build/defaults.gni")
76
77 forward_variables_from(invoker, "*", _supported_toolchain_defaults)
78
Erik Gilling703abad2021-11-09 11:54:44 -080079 # Ensure that we don't overwrite metadata forwared from the invoker above.
80 if (defined(metadata)) {
81 metadata.pw_source_files = _pw_source_files
82 } else {
83 metadata = {
84 pw_source_files = _pw_source_files
85 }
86 }
87
Armando Montanez256fb502021-06-28 10:47:49 -070088 if (!defined(configs)) {
89 configs = []
90 }
91 if (defined(pw_build_defaults.configs)) {
92 configs += pw_build_defaults.configs
93 }
94 if (defined(remove_configs)) {
95 if (remove_configs != [] && remove_configs[0] == "*") {
96 configs = []
97 } else {
98 configs += remove_configs # Add configs in case they aren't already
99 configs -= remove_configs # present, then remove them.
100 }
101 }
102 if (defined(invoker.configs)) {
103 configs += invoker.configs
104 }
105
106 public_deps = [ "$dir_pw_build:link_deps" ]
107 if (defined(pw_build_defaults.public_deps)) {
108 public_deps += pw_build_defaults.public_deps
109 }
110 if (defined(remove_public_deps)) {
111 if (remove_public_deps != [] && remove_public_deps[0] == "*") {
112 public_deps = []
113 } else {
114 public_deps += remove_public_deps
115 public_deps -= remove_public_deps
116 }
117 }
118 if (defined(invoker.public_deps)) {
119 public_deps += invoker.public_deps
120 }
121
122 output_dir = _executable_output_dir
123 }
124}