# Copyright 2020 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.

declare_args() {
  # This file defines a directory variable for each of Pigweed's modules. This
  # allows modules to be moved or swapped out without breaking existing builds.
  # All module variables are prefixed with dir_.
  dir_docker = get_path_info("docker", "abspath")
  dir_pw_allocator = get_path_info("pw_allocator", "abspath")
  dir_pw_arduino_build = get_path_info("pw_arduino_build", "abspath")
  dir_pw_assert = get_path_info("pw_assert", "abspath")
  dir_pw_assert_basic = get_path_info("pw_assert_basic", "abspath")
  dir_pw_assert_log = get_path_info("pw_assert_log", "abspath")
  dir_pw_base64 = get_path_info("pw_base64", "abspath")
  dir_pw_bloat = get_path_info("pw_bloat", "abspath")
  dir_pw_blob_store = get_path_info("pw_blob_store", "abspath")
  dir_pw_boot_armv7m = get_path_info("pw_boot_armv7m", "abspath")
  dir_pw_build = get_path_info("pw_build", "abspath")
  dir_pw_bytes = get_path_info("pw_bytes", "abspath")
  dir_pw_checksum = get_path_info("pw_checksum", "abspath")
  dir_pw_chrono = get_path_info("pw_chrono", "abspath")
  dir_pw_chrono_embos = get_path_info("pw_chrono_embos", "abspath")
  dir_pw_chrono_freertos = get_path_info("pw_chrono_freertos", "abspath")
  dir_pw_chrono_stl = get_path_info("pw_chrono_stl", "abspath")
  dir_pw_chrono_threadx = get_path_info("pw_chrono_threadx", "abspath")
  dir_pw_cli = get_path_info("pw_cli", "abspath")
  dir_pw_containers = get_path_info("pw_containers", "abspath")
  dir_pw_cpu_exception = get_path_info("pw_cpu_exception", "abspath")
  dir_pw_cpu_exception_cortex_m =
      get_path_info("pw_cpu_exception_cortex_m", "abspath")
  dir_pw_docgen = get_path_info("pw_docgen", "abspath")
  dir_pw_doctor = get_path_info("pw_doctor", "abspath")
  dir_pw_hex_dump = get_path_info("pw_hex_dump", "abspath")
  dir_pw_env_setup = get_path_info("pw_env_setup", "abspath")
  dir_pw_hdlc = get_path_info("pw_hdlc", "abspath")
  dir_pw_i2c = get_path_info("pw_i2c", "abspath")
  dir_pw_interrupt = get_path_info("pw_interrupt", "abspath")
  dir_pw_interrupt_cortex_m = get_path_info("pw_interrupt_cortex_m", "abspath")
  dir_pw_kvs = get_path_info("pw_kvs", "abspath")
  dir_pw_log = get_path_info("pw_log", "abspath")
  dir_pw_log_basic = get_path_info("pw_log_basic", "abspath")
  dir_pw_log_multisink = get_path_info("pw_log_multisink", "abspath")
  dir_pw_log_null = get_path_info("pw_log_null", "abspath")
  dir_pw_log_rpc = get_path_info("pw_log_rpc", "abspath")
  dir_pw_log_sink = get_path_info("pw_log_sink", "abspath")
  dir_pw_log_tokenized = get_path_info("pw_log_tokenized", "abspath")
  dir_pw_malloc = get_path_info("pw_malloc", "abspath")
  dir_pw_malloc_freelist = get_path_info("pw_malloc_freelist", "abspath")
  dir_pw_metric = get_path_info("pw_metric", "abspath")
  dir_pw_minimal_cpp_stdlib = get_path_info("pw_minimal_cpp_stdlib", "abspath")
  dir_pw_module = get_path_info("pw_module", "abspath")
  dir_pw_fuzzer = get_path_info("pw_fuzzer", "abspath")
  dir_pw_package = get_path_info("pw_package", "abspath")
  dir_pw_polyfill = get_path_info("pw_polyfill", "abspath")
  dir_pw_preprocessor = get_path_info("pw_preprocessor", "abspath")
  dir_pw_presubmit = get_path_info("pw_presubmit", "abspath")
  dir_pw_protobuf = get_path_info("pw_protobuf", "abspath")
  dir_pw_protobuf_compiler = get_path_info("pw_protobuf_compiler", "abspath")
  dir_pw_random = get_path_info("pw_random", "abspath")
  dir_pw_result = get_path_info("pw_result", "abspath")
  dir_pw_ring_buffer = get_path_info("pw_ring_buffer", "abspath")
  dir_pw_router = get_path_info("pw_router", "abspath")
  dir_pw_rpc = get_path_info("pw_rpc", "abspath")
  dir_pw_span = get_path_info("pw_span", "abspath")
  dir_pw_status = get_path_info("pw_status", "abspath")
  dir_pw_stream = get_path_info("pw_stream", "abspath")
  dir_pw_string = get_path_info("pw_string", "abspath")
  dir_pw_sync = get_path_info("pw_sync", "abspath")
  dir_pw_sync_embos = get_path_info("pw_sync_embos", "abspath")
  dir_pw_sync_freertos = get_path_info("pw_sync_freertos", "abspath")
  dir_pw_sync_baremetal = get_path_info("pw_sync_baremetal", "abspath")
  dir_pw_sync_stl = get_path_info("pw_sync_stl", "abspath")
  dir_pw_sync_threadx = get_path_info("pw_sync_threadx", "abspath")
  dir_pw_sys_io = get_path_info("pw_sys_io", "abspath")
  dir_pw_sys_io_baremetal_lm3s6965evb =
      get_path_info("pw_sys_io_baremetal_lm3s6965evb", "abspath")
  dir_pw_sys_io_baremetal_stm32f429 =
      get_path_info("pw_sys_io_baremetal_stm32f429", "abspath")
  dir_pw_sys_io_arduino = get_path_info("pw_sys_io_arduino", "abspath")
  dir_pw_sys_io_stdio = get_path_info("pw_sys_io_stdio", "abspath")
  dir_pw_target_runner = get_path_info("pw_target_runner", "abspath")
  dir_pw_thread = get_path_info("pw_thread", "abspath")
  dir_pw_thread_stl = get_path_info("pw_thread_stl", "abspath")
  dir_pw_thread_embos = get_path_info("pw_thread_embos", "abspath")
  dir_pw_thread_freertos = get_path_info("pw_thread_freertos", "abspath")
  dir_pw_thread_threadx = get_path_info("pw_thread_threadx", "abspath")
  dir_pw_third_party = get_path_info("third_party", "abspath")
  dir_pw_tokenizer = get_path_info("pw_tokenizer", "abspath")
  dir_pw_toolchain = get_path_info("pw_toolchain", "abspath")
  dir_pw_trace = get_path_info("pw_trace", "abspath")
  dir_pw_trace_tokenized = get_path_info("pw_trace_tokenized", "abspath")
  dir_pw_unit_test = get_path_info("pw_unit_test", "abspath")
  dir_pw_varint = get_path_info("pw_varint", "abspath")
  dir_pw_watch = get_path_info("pw_watch", "abspath")
  dir_pw_web_ui = get_path_info("pw_web_ui", "abspath")
}
