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

# gn-format disable
import("//build_overrides/pigweed.gni")

import("$dir_pw_docgen/docs.gni")
pw_doc_group("core_docs") {
  inputs = [
    "images/pw_env_setup_demo.gif",
    "images/pw_presubmit_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 = [
    "embedded_cpp_guide.rst",
    "faq.rst",
    "getting_started.md",
    "module_structure.rst",
    "style_guide.rst",
  ]
}

# Documentation for upstream Pigweed targets.
group("target_docs") {
  deps = [
    "$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",
  ]
}

pw_doc_gen("docs") {
  conf = "conf.py"
  sources = [
    "../CODE_OF_CONDUCT.md",
    "../CONTRIBUTING.md",
    "../README.md",
    "build_system.rst",
    "index.rst",
    "module_guides.rst",
    "targets.rst",
  ]
  output_directory = target_gen_dir
  deps = [
    ":core_docs",
    ":target_docs",
    "$dir_docker:docs",
    "$dir_pw_allocator:docs",
    "$dir_pw_assert:docs",
    "$dir_pw_assert_basic:docs",
    "$dir_pw_base64:docs",
    "$dir_pw_bloat:docs",
    "$dir_pw_boot_armv7m:docs",
    "$dir_pw_build:docs",
    "$dir_pw_bytes:docs",
    "$dir_pw_checksum:docs",
    "$dir_pw_cli:docs",
    "$dir_pw_containers:docs",
    "$dir_pw_cpu_exception:docs",
    "$dir_pw_cpu_exception_armv7m:docs",
    "$dir_pw_docgen:docs",
    "$dir_pw_doctor:docs",
    "$dir_pw_env_setup:docs",
    "$dir_pw_fuzzer:docs",
    "$dir_pw_hex_dump:docs",
    "$dir_pw_kvs:docs",
    "$dir_pw_log:docs",
    "$dir_pw_log_basic:docs",
    "$dir_pw_log_tokenized:docs",
    "$dir_pw_minimal_cpp_stdlib:docs",
    "$dir_pw_module:docs",
    "$dir_pw_polyfill:docs",
    "$dir_pw_preprocessor:docs",
    "$dir_pw_presubmit:docs",
    "$dir_pw_protobuf:docs",
    "$dir_pw_protobuf_compiler:docs",
    "$dir_pw_result:docs",
    "$dir_pw_ring_buffer:docs",
    "$dir_pw_rpc:docs",
    "$dir_pw_span:docs",
    "$dir_pw_status:docs",
    "$dir_pw_stream:docs",
    "$dir_pw_string:docs",
    "$dir_pw_sys_io:docs",
    "$dir_pw_sys_io_baremetal_stm32f429:docs",
    "$dir_pw_sys_io_stdio:docs",
    "$dir_pw_target_runner:docs",
    "$dir_pw_tokenizer:docs",
    "$dir_pw_toolchain:docs",
    "$dir_pw_trace:docs",
    "$dir_pw_unit_test:docs",
    "$dir_pw_varint:docs",
    "$dir_pw_watch:docs",
    "$dir_pw_web_ui:docs",
  ]
}
