# Copyright 2019 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_docgen/docs.gni")

# Note: These may be useful for downstream projects, which is why they are
# split out from the overall docgen target below.
pw_doc_group("core_docs") {
  inputs = [
    "images/pw_env_setup_demo.gif",
    "images/pw_status_test.png",
    "images/pw_watch_build_demo.gif",
    "images/pw_watch_on_device_demo.gif",
    "images/pw_watch_test_demo.gif",
    "images/stm32f429i-disc1_connected.jpg",
  ]
  sources = [
    "code_of_conduct.rst",
    "contributing.rst",
    "embedded_cpp_guide.rst",
    "faq.rst",
    "getting_started.rst",
    "module_structure.rst",
    "style_guide.rst",
  ]
}

# Documentation for upstream Pigweed targets.
group("target_docs") {
  deps = [
    "$dir_pigweed/targets/arduino:target_docs",
    "$dir_pigweed/targets/docs:target_docs",
    "$dir_pigweed/targets/host:target_docs",
    "$dir_pigweed/targets/lm3s6965evb-qemu:target_docs",
    "$dir_pigweed/targets/stm32f429i-disc1:target_docs",
  ]
}

group("module_docs") {
  deps = [
    "$dir_docker:docs",
    "$dir_pw_allocator:docs",
    "$dir_pw_arduino_build:docs",
    "$dir_pw_assert:docs",
    "$dir_pw_assert_basic:docs",
    "$dir_pw_assert_log:docs",
    "$dir_pw_base64:docs",
    "$dir_pw_bloat:docs",
    "$dir_pw_blob_store:docs",
    "$dir_pw_boot_armv7m:docs",
    "$dir_pw_build:docs",
    "$dir_pw_bytes:docs",
    "$dir_pw_checksum:docs",
    "$dir_pw_chrono:docs",
    "$dir_pw_chrono_embos:docs",
    "$dir_pw_chrono_freertos:docs",
    "$dir_pw_chrono_stl:docs",
    "$dir_pw_chrono_threadx:docs",
    "$dir_pw_cli:docs",
    "$dir_pw_containers:docs",
    "$dir_pw_cpu_exception:docs",
    "$dir_pw_cpu_exception_cortex_m:docs",
    "$dir_pw_docgen:docs",
    "$dir_pw_doctor:docs",
    "$dir_pw_env_setup:docs",
    "$dir_pw_fuzzer:docs",
    "$dir_pw_hdlc:docs",
    "$dir_pw_hex_dump:docs",
    "$dir_pw_interrupt:docs",
    "$dir_pw_interrupt_cortex_m:docs",
    "$dir_pw_kvs:docs",
    "$dir_pw_log:docs",
    "$dir_pw_log_basic:docs",
    "$dir_pw_log_multisink:docs",
    "$dir_pw_log_null:docs",
    "$dir_pw_log_rpc:docs",
    "$dir_pw_log_sink:docs",
    "$dir_pw_log_tokenized:docs",
    "$dir_pw_metric:docs",
    "$dir_pw_minimal_cpp_stdlib:docs",
    "$dir_pw_module:docs",
    "$dir_pw_multisink:docs",
    "$dir_pw_package:docs",
    "$dir_pw_persistent_ram:docs",
    "$dir_pw_polyfill:docs",
    "$dir_pw_preprocessor:docs",
    "$dir_pw_presubmit:docs",
    "$dir_pw_protobuf:docs",
    "$dir_pw_protobuf_compiler:docs",
    "$dir_pw_random:docs",
    "$dir_pw_result:docs",
    "$dir_pw_ring_buffer:docs",
    "$dir_pw_router:docs",
    "$dir_pw_rpc:docs",
    "$dir_pw_span:docs",
    "$dir_pw_status:docs",
    "$dir_pw_stream:docs",
    "$dir_pw_string:docs",
    "$dir_pw_sync:docs",
    "$dir_pw_sync_baremetal:docs",
    "$dir_pw_sync_embos:docs",
    "$dir_pw_sync_freertos:docs",
    "$dir_pw_sync_stl:docs",
    "$dir_pw_sync_threadx:docs",
    "$dir_pw_sys_io:docs",
    "$dir_pw_sys_io_arduino:docs",
    "$dir_pw_sys_io_baremetal_stm32f429:docs",
    "$dir_pw_sys_io_stdio:docs",
    "$dir_pw_target_runner:docs",
    "$dir_pw_thread:docs",
    "$dir_pw_thread_embos:docs",
    "$dir_pw_thread_freertos:docs",
    "$dir_pw_thread_stl:docs",
    "$dir_pw_thread_threadx:docs",
    "$dir_pw_tokenizer:docs",
    "$dir_pw_toolchain:docs",
    "$dir_pw_trace:docs",
    "$dir_pw_trace_tokenized:docs",
    "$dir_pw_unit_test:docs",
    "$dir_pw_varint:docs",
    "$dir_pw_watch:docs",
    "$dir_pw_web_ui:docs",
  ]
}

pw_doc_gen("docs") {
  conf = "conf.py"
  sources = [
    "build_system.rst",
    "index.rst",
    "module_guides.rst",
    "python_build.rst",
    "targets.rst",
  ]
  output_directory = target_gen_dir
  deps = [
    ":core_docs",
    ":module_docs",
    ":target_docs",
    "$dir_pw_env_setup:python.install",
  ]
}
