# 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_console:docs",
    "$dir_pw_containers:docs",
    "$dir_pw_cpu_exception:docs",
    "$dir_pw_cpu_exception_cortex_m:docs",
    "$dir_pw_crypto: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_tls_client:docs",
    "$dir_pw_tls_client_boringssl:docs",
    "$dir_pw_tls_client_mbedtls:docs",
    "$dir_pw_tokenizer:docs",
    "$dir_pw_toolchain:docs",
    "$dir_pw_trace:docs",
    "$dir_pw_trace_tokenized:docs",
    "$dir_pw_transfer:docs",
    "$dir_pw_unit_test:docs",
    "$dir_pw_varint:docs",
    "$dir_pw_watch:docs",
    "$dir_pw_web_ui:docs",
  ]
}

group("third_party_docs") {
  deps = [ "$dir_pigweed/third_party/freertos: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",
    "third_party_support.rst",
  ]
  output_directory = target_gen_dir
  deps = [
    ":core_docs",
    ":module_docs",
    ":target_docs",
    ":third_party_docs",
    "$dir_pw_env_setup:python.install",
  ]
}
