# 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",

    # TODO(pwbug/368): This should be in the pw_doc_gen target instead of here.
    "_static/css/pigweed.css",
  ]
  sources = [
    "code_of_conduct.rst",
    "contributing.rst",
    "embedded_cpp_guide.rst",
    "faq.rst",
    "getting_started.rst",
    "module_structure.rst",
    "os_abstraction_layers.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_analog: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_function:docs",
    "$dir_pw_fuzzer:docs",
    "$dir_pw_hdlc:docs",
    "$dir_pw_hex_dump:docs",
    "$dir_pw_i2c:docs",
    "$dir_pw_interrupt:docs",
    "$dir_pw_interrupt_cortex_m:docs",
    "$dir_pw_kvs:docs",
    "$dir_pw_libc: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_malloc:docs",
    "$dir_pw_malloc_freelist: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_snapshot:docs",
    "$dir_pw_span:docs",
    "$dir_pw_status:docs",
    "$dir_pw_stm32cube_build: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 = [
    # Note: These must use the "docs" prefix for links and image references. In
    # contrast, the pw_doc_group above should not use the docs prefix.
    "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",
  ]
}
