1# Copyright 2022 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_chrono/backend.gni") 18import("$dir_pw_protobuf_compiler/proto.gni") 19import("$dir_pw_rpc/system_server/backend.gni") 20import("$dir_pw_sync/backend.gni") 21import("$dir_pw_sys_io/backend.gni") 22import("$dir_pw_system/backend.gni") 23import("$dir_pw_third_party/nanopb/nanopb.gni") 24import("$dir_pw_thread/backend.gni") 25import("$dir_pw_toolchain/host_clang/toolchains.gni") 26import("$dir_pw_toolchain/host_gcc/toolchains.gni") 27import("$dir_pw_trace/backend.gni") 28import("$dir_pw_trace_tokenized/config.gni") 29 30_host_common = { 31 # Use logging-based test output on host. 32 pw_unit_test_MAIN = "$dir_pw_unit_test:logging_main" 33 34 # Configure backend for assert facade. 35 pw_assert_BACKEND = "$dir_pw_assert_basic" 36 pw_assert_LITE_BACKEND = "$dir_pw_assert:print_and_abort" 37 38 # Configure backend for logging facade. 39 pw_log_BACKEND = "$dir_pw_log_basic" 40 41 # Configure backends for pw_sync's facades. 42 pw_sync_INTERRUPT_SPIN_LOCK_BACKEND = "$dir_pw_sync_stl:interrupt_spin_lock" 43 pw_sync_BINARY_SEMAPHORE_BACKEND = "$dir_pw_sync_stl:binary_semaphore_backend" 44 pw_sync_COUNTING_SEMAPHORE_BACKEND = 45 "$dir_pw_sync_stl:counting_semaphore_backend" 46 pw_sync_MUTEX_BACKEND = "$dir_pw_sync_stl:mutex_backend" 47 pw_sync_TIMED_MUTEX_BACKEND = "$dir_pw_sync_stl:timed_mutex_backend" 48 pw_sync_THREAD_NOTIFICATION_BACKEND = 49 "$dir_pw_sync:binary_semaphore_thread_notification_backend" 50 pw_sync_TIMED_THREAD_NOTIFICATION_BACKEND = 51 "$dir_pw_sync:binary_semaphore_timed_thread_notification_backend" 52 53 # Configure backend for pw_sys_io facade. 54 pw_sys_io_BACKEND = "$dir_pw_sys_io_stdio" 55 56 # Configure backend for pw_rpc_system_server. 57 pw_rpc_system_server_BACKEND = "$dir_pigweed/targets/host:system_rpc_server" 58 pw_rpc_CONFIG = "$dir_pw_rpc:use_global_mutex" 59 60 # Configure backend for trace facade. 61 pw_trace_BACKEND = "$dir_pw_trace_tokenized" 62 63 # Tokenizer trace time. 64 pw_trace_tokenizer_time = "$dir_pw_trace_tokenized:host_trace_time" 65 66 # Configure backend for pw_chrono's facades. 67 pw_chrono_SYSTEM_CLOCK_BACKEND = "$dir_pw_chrono_stl:system_clock" 68 pw_chrono_SYSTEM_TIMER_BACKEND = "$dir_pw_chrono_stl:system_timer" 69 70 # Configure backends for pw_thread's facades. 71 pw_thread_ID_BACKEND = "$dir_pw_thread_stl:id" 72 pw_thread_YIELD_BACKEND = "$dir_pw_thread_stl:yield" 73 pw_thread_SLEEP_BACKEND = "$dir_pw_thread_stl:sleep" 74 pw_thread_THREAD_BACKEND = "$dir_pw_thread_stl:thread" 75 76 pw_build_LINK_DEPS = [] # Explicit list overwrite required by GN 77 pw_build_LINK_DEPS = [ 78 "$dir_pw_assert:impl", 79 "$dir_pw_log:impl", 80 ] 81 82 # Specify builtin GN variables. 83 current_os = host_os 84 current_cpu = host_cpu 85} 86 87# Linux-specific target configuration. 88_linux_config = { 89 pw_bloat_BLOATY_CONFIG = get_path_info("linux.bloaty", "abspath") 90 pw_unit_test_AUTOMATIC_RUNNER = get_path_info("run_test", "abspath") 91} 92 93# macOS-specific target configuration. 94_mac_config = { 95 pw_bloat_BLOATY_CONFIG = get_path_info("macos.bloaty", "abspath") 96 pw_unit_test_AUTOMATIC_RUNNER = get_path_info("run_test", "abspath") 97} 98 99# Windows-specific target configuration. 100_win_config = { 101 # This is here as bloaty_config_file cannot be an empty string or GN fails. 102 # TODO(frolv): Add this file and enable size reports on Windows. 103 pw_bloat_BLOATY_CONFIG = get_path_info("windows.bloaty", "abspath") 104 pw_unit_test_AUTOMATIC_RUNNER = get_path_info("run_test.bat", "abspath") 105} 106 107_os_specific_config = { 108 if (host_os == "linux") { 109 forward_variables_from(_linux_config, "*") 110 } else if (host_os == "mac") { 111 forward_variables_from(_mac_config, "*") 112 } else if (host_os == "win") { 113 forward_variables_from(_win_config, "*") 114 } 115} 116 117_clang_default_configs = [ 118 "$dir_pw_build:extra_strict_warnings", 119 "$dir_pw_build:clang_thread_safety_warnings", 120] 121_gcc_default_configs = [ 122 "$dir_pw_build:extra_strict_warnings", 123 "$dir_pw_toolchain/host_gcc:threading_support", 124] 125 126_excluded_members = [ 127 "defaults", 128 "name", 129] 130 131pw_target_toolchain_host = { 132 clang_debug = { 133 name = "host_clang_debug" 134 _toolchain_base = pw_toolchain_host_clang.debug 135 forward_variables_from(_toolchain_base, "*", _excluded_members) 136 defaults = { 137 forward_variables_from(_toolchain_base.defaults, "*") 138 forward_variables_from(_host_common, "*") 139 forward_variables_from(_os_specific_config, "*") 140 default_configs += _clang_default_configs 141 } 142 } 143 144 clang_speed_optimized = { 145 name = "host_clang_speed_optimized" 146 _toolchain_base = pw_toolchain_host_clang.speed_optimized 147 forward_variables_from(_toolchain_base, "*", _excluded_members) 148 defaults = { 149 forward_variables_from(_toolchain_base.defaults, "*") 150 forward_variables_from(_host_common, "*") 151 forward_variables_from(_os_specific_config, "*") 152 default_configs += _clang_default_configs 153 } 154 } 155 156 clang_size_optimized = { 157 name = "host_clang_size_optimized" 158 _toolchain_base = pw_toolchain_host_clang.size_optimized 159 forward_variables_from(_toolchain_base, "*", _excluded_members) 160 defaults = { 161 forward_variables_from(_toolchain_base.defaults, "*") 162 forward_variables_from(_host_common, "*") 163 forward_variables_from(_os_specific_config, "*") 164 default_configs += _clang_default_configs 165 } 166 } 167 168 clang_fuzz = { 169 name = "host_clang_fuzz" 170 _toolchain_base = pw_toolchain_host_clang.fuzz 171 forward_variables_from(_toolchain_base, "*", _excluded_members) 172 defaults = { 173 forward_variables_from(_toolchain_base.defaults, "*") 174 forward_variables_from(_host_common, "*") 175 forward_variables_from(_os_specific_config, "*") 176 default_configs += _clang_default_configs 177 } 178 } 179 180 clang_asan = { 181 name = "host_clang_asan" 182 _toolchain_base = pw_toolchain_host_clang.asan 183 forward_variables_from(_toolchain_base, "*", _excluded_members) 184 defaults = { 185 forward_variables_from(_toolchain_base.defaults, "*") 186 forward_variables_from(_host_common, "*") 187 forward_variables_from(_os_specific_config, "*") 188 default_configs += _clang_default_configs 189 } 190 } 191 192 clang_ubsan = { 193 name = "host_clang_ubsan" 194 _toolchain_base = pw_toolchain_host_clang.ubsan 195 forward_variables_from(_toolchain_base, "*", _excluded_members) 196 defaults = { 197 forward_variables_from(_toolchain_base.defaults, "*") 198 forward_variables_from(_host_common, "*") 199 forward_variables_from(_os_specific_config, "*") 200 default_configs += _clang_default_configs 201 } 202 } 203 204 clang_ubsan_heuristic = { 205 name = "host_clang_ubsan_heuristic" 206 _toolchain_base = pw_toolchain_host_clang.ubsan_heuristic 207 forward_variables_from(_toolchain_base, "*", _excluded_members) 208 defaults = { 209 forward_variables_from(_toolchain_base.defaults, "*") 210 forward_variables_from(_host_common, "*") 211 forward_variables_from(_os_specific_config, "*") 212 default_configs += _clang_default_configs 213 } 214 } 215 216 clang_msan = { 217 name = "host_clang_msan" 218 _toolchain_base = pw_toolchain_host_clang.msan 219 forward_variables_from(_toolchain_base, "*", _excluded_members) 220 defaults = { 221 forward_variables_from(_toolchain_base.defaults, "*") 222 forward_variables_from(_host_common, "*") 223 forward_variables_from(_os_specific_config, "*") 224 default_configs += _clang_default_configs 225 } 226 } 227 228 clang_tsan = { 229 name = "host_clang_tsan" 230 _toolchain_base = pw_toolchain_host_clang.tsan 231 forward_variables_from(_toolchain_base, "*", _excluded_members) 232 defaults = { 233 forward_variables_from(_toolchain_base.defaults, "*") 234 forward_variables_from(_host_common, "*") 235 forward_variables_from(_os_specific_config, "*") 236 default_configs += _clang_default_configs 237 } 238 } 239 240 gcc_debug = { 241 name = "host_gcc_debug" 242 _toolchain_base = pw_toolchain_host_gcc.debug 243 forward_variables_from(_toolchain_base, "*", _excluded_members) 244 defaults = { 245 forward_variables_from(_toolchain_base.defaults, "*") 246 forward_variables_from(_host_common, "*") 247 forward_variables_from(_os_specific_config, "*") 248 default_configs += _gcc_default_configs 249 } 250 } 251 252 gcc_speed_optimized = { 253 name = "host_gcc_speed_optimized" 254 _toolchain_base = pw_toolchain_host_gcc.speed_optimized 255 forward_variables_from(_toolchain_base, "*", _excluded_members) 256 defaults = { 257 forward_variables_from(_toolchain_base.defaults, "*") 258 forward_variables_from(_host_common, "*") 259 forward_variables_from(_os_specific_config, "*") 260 default_configs += _gcc_default_configs 261 } 262 } 263 264 gcc_size_optimized = { 265 name = "host_gcc_size_optimized" 266 _toolchain_base = pw_toolchain_host_gcc.size_optimized 267 forward_variables_from(_toolchain_base, "*", _excluded_members) 268 defaults = { 269 forward_variables_from(_toolchain_base.defaults, "*") 270 forward_variables_from(_host_common, "*") 271 forward_variables_from(_os_specific_config, "*") 272 default_configs += _gcc_default_configs 273 } 274 } 275} 276 277# This list just contains the members of the above scope for convenience to make 278# it trivial to generate all the toolchains in this file via a 279# `generate_toolchains` target. 280pw_target_toolchain_host_list = [ 281 pw_target_toolchain_host.clang_debug, 282 pw_target_toolchain_host.clang_speed_optimized, 283 pw_target_toolchain_host.clang_size_optimized, 284 pw_target_toolchain_host.clang_fuzz, 285 pw_target_toolchain_host.clang_asan, 286 pw_target_toolchain_host.clang_ubsan, 287 pw_target_toolchain_host.clang_ubsan_heuristic, 288 pw_target_toolchain_host.clang_msan, 289 pw_target_toolchain_host.clang_tsan, 290 pw_target_toolchain_host.gcc_debug, 291 pw_target_toolchain_host.gcc_speed_optimized, 292 pw_target_toolchain_host.gcc_size_optimized, 293] 294 295# Additional configuration intended only for upstream Pigweed use. 296_pigweed_internal = { 297 pw_status_CONFIG = "$dir_pw_status:check_if_used" 298} 299 300# Host toolchains exclusively for upstream Pigweed use. To give upstream Pigweed 301# flexibility in how it compiles code, these toolchains may not be used by 302# downstream projects. 303pw_internal_host_toolchains = [ 304 { 305 name = "pw_strict_host_clang_debug" 306 _toolchain_base = pw_toolchain_host_clang.debug 307 forward_variables_from(_toolchain_base, "*", _excluded_members) 308 defaults = { 309 forward_variables_from(_toolchain_base.defaults, "*") 310 forward_variables_from(_host_common, "*") 311 forward_variables_from(_pigweed_internal, "*") 312 forward_variables_from(_os_specific_config, "*") 313 default_configs += _clang_default_configs 314 } 315 }, 316 { 317 name = "pw_strict_host_clang_speed_optimized" 318 _toolchain_base = pw_toolchain_host_clang.speed_optimized 319 forward_variables_from(_toolchain_base, "*", _excluded_members) 320 defaults = { 321 forward_variables_from(_toolchain_base.defaults, "*") 322 forward_variables_from(_host_common, "*") 323 forward_variables_from(_pigweed_internal, "*") 324 forward_variables_from(_os_specific_config, "*") 325 default_configs += _clang_default_configs 326 } 327 }, 328 { 329 name = "pw_strict_host_clang_size_optimized" 330 _toolchain_base = pw_toolchain_host_clang.size_optimized 331 forward_variables_from(_toolchain_base, "*", _excluded_members) 332 defaults = { 333 forward_variables_from(_toolchain_base.defaults, "*") 334 forward_variables_from(_host_common, "*") 335 forward_variables_from(_pigweed_internal, "*") 336 forward_variables_from(_os_specific_config, "*") 337 default_configs += _clang_default_configs 338 } 339 }, 340 { 341 name = "pw_strict_host_gcc_debug" 342 _toolchain_base = pw_toolchain_host_gcc.debug 343 forward_variables_from(_toolchain_base, "*", _excluded_members) 344 defaults = { 345 forward_variables_from(_toolchain_base.defaults, "*") 346 forward_variables_from(_host_common, "*") 347 forward_variables_from(_pigweed_internal, "*") 348 forward_variables_from(_os_specific_config, "*") 349 default_configs += _gcc_default_configs 350 } 351 }, 352 { 353 name = "pw_strict_host_gcc_speed_optimized" 354 _toolchain_base = pw_toolchain_host_gcc.speed_optimized 355 forward_variables_from(_toolchain_base, "*", _excluded_members) 356 defaults = { 357 forward_variables_from(_toolchain_base.defaults, "*") 358 forward_variables_from(_host_common, "*") 359 forward_variables_from(_pigweed_internal, "*") 360 forward_variables_from(_os_specific_config, "*") 361 default_configs += _gcc_default_configs 362 } 363 }, 364 { 365 name = "pw_strict_host_gcc_size_optimized" 366 _toolchain_base = pw_toolchain_host_gcc.size_optimized 367 forward_variables_from(_toolchain_base, "*", _excluded_members) 368 defaults = { 369 forward_variables_from(_toolchain_base.defaults, "*") 370 forward_variables_from(_host_common, "*") 371 forward_variables_from(_pigweed_internal, "*") 372 forward_variables_from(_os_specific_config, "*") 373 default_configs += _gcc_default_configs 374 } 375 }, 376] 377