# Copyright 2023 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_async/async.gni") import("$dir_pw_async/fake_dispatcher_fixture.gni") import("$dir_pw_async/fake_dispatcher_test.gni") import("$dir_pw_async/heap_dispatcher.gni") import("$dir_pw_bloat/bloat.gni") import("$dir_pw_build/target_types.gni") import("$dir_pw_chrono/backend.gni") import("$dir_pw_docgen/docs.gni") import("$dir_pw_sync/backend.gni") import("$dir_pw_thread/backend.gni") import("$dir_pw_unit_test/test.gni") config("public_include_path") { include_dirs = [ "public" ] } config("backend_config") { include_dirs = [ "public_overrides" ] visibility = [ ":*" ] } # Backend for //pw_async:task pw_source_set("task") { public_configs = [ ":public_include_path", ":backend_config", ] public = [ "public/pw_async_basic/task.h", "public_overrides/pw_async_backend/task.h", ] public_deps = [ "$dir_pw_async:task.facade", "$dir_pw_containers:intrusive_list", ] visibility = [ ":*", "$dir_pw_async:*", "size_report:*", ] + pw_async_EXPERIMENTAL_MODULE_VISIBILITY } # Backend for //pw_async:fake_dispatcher pw_source_set("fake_dispatcher") { public_configs = [ ":public_include_path", ":backend_config", ] sources = [ "fake_dispatcher.cc" ] public = [ "public/pw_async_basic/fake_dispatcher.h", "public_overrides/pw_async_backend/fake_dispatcher.h", ] public_deps = [ ":task", "$dir_pw_async:fake_dispatcher.facade", ] deps = [ dir_pw_log ] visibility = [ ":*", "$dir_pw_async:*", ] + pw_async_EXPERIMENTAL_MODULE_VISIBILITY } fake_dispatcher_test("fake_dispatcher_test") { backend = ":fake_dispatcher" } fake_dispatcher_fixture("fake_dispatcher_fixture") { backend = ":fake_dispatcher" } pw_test("fake_dispatcher_fixture_test") { enable_if = pw_chrono_SYSTEM_CLOCK_BACKEND != "" sources = [ "fake_dispatcher_fixture_test.cc" ] deps = [ ":fake_dispatcher_fixture" ] } pw_source_set("dispatcher") { public_configs = [ ":public_include_path" ] public = [ "public/pw_async_basic/dispatcher.h" ] sources = [ "dispatcher.cc" ] public_deps = [ ":task", "$dir_pw_async:dispatcher", "$dir_pw_containers:intrusive_list", "$dir_pw_sync:interrupt_spin_lock", "$dir_pw_sync:timed_thread_notification", "$dir_pw_thread:thread_core", ] visibility = [ ":*", "$dir_pw_grpc/*", "size_report:*", ] + pw_async_EXPERIMENTAL_MODULE_VISIBILITY } pw_test("dispatcher_test") { enable_if = pw_chrono_SYSTEM_CLOCK_BACKEND != "" && pw_thread_THREAD_BACKEND == "$dir_pw_thread_stl:thread" public_deps = [ ":dispatcher", "$dir_pw_thread:thread", dir_pw_log, ] sources = [ "dispatcher_test.cc" ] } # This target cannot be labeled "heap_dispatcher" or else the outpath Ninja uses # for heap_dispatcher.cc will collide with $dir_pw_async:heap_dispatcher. pw_async_heap_dispatcher_source_set("heap_dispatcher_basic") { task_backend = ":task" visibility = [ ":*" ] } group("heap_dispatcher") { public_deps = [ ":heap_dispatcher_basic" ] visibility = [ ":*" ] + pw_async_EXPERIMENTAL_MODULE_VISIBILITY } pw_test("heap_dispatcher_test") { enable_if = pw_chrono_SYSTEM_CLOCK_BACKEND != "" && pw_thread_THREAD_BACKEND == "$dir_pw_thread_stl:thread" sources = [ "heap_dispatcher_test.cc" ] deps = [ ":fake_dispatcher_fixture", ":heap_dispatcher", ] } pw_test_group("tests") { tests = [ ":dispatcher_test", ":fake_dispatcher_test", ":fake_dispatcher_fixture_test", ":heap_dispatcher_test", ] } pw_doc_group("docs") { sources = [ "docs.rst" ] report_deps = [ ":docs_size_report" ] } pw_size_diff("docs_size_report") { title = "pw_async_basic Docs Size Report" base = "$dir_pw_bloat:bloat_base" binaries = [] if (pw_chrono_SYSTEM_CLOCK_BACKEND != "") { binaries += [ { target = "size_report:task" label = "Construct a Task" }, ] } if (binaries == []) { binaries += [ { target = "$dir_pw_bloat:bloat_base" label = "No backend is selected." }, ] } } # This size report can't be included in docs because the docs build target uses # the target-stm32f429i-disc1 toolchain, which does not support timed thread # notifications (mutex & condition_variable headers are not available). pw_size_diff("size_report") { title = "pw_async_basic Size Report" base = "$dir_pw_bloat:bloat_base" binaries = [] if (pw_chrono_SYSTEM_CLOCK_BACKEND != "" && pw_sync_THREAD_NOTIFICATION_BACKEND != "" && pw_sync_TIMED_THREAD_NOTIFICATION_BACKEND != "") { binaries += [ { target = "size_report:post_1_task" label = "Post 1 Task to BasicDispatcher" }, ] } }