# 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_build/python.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",
    "size_optimizations.rst",
    "style_guide.rst",
  ]
}

# Documentation for upstream Pigweed targets.
group("target_docs") {
  deps = [
    "$dir_pigweed/targets/android:target_docs",
    "$dir_pigweed/targets/arduino:target_docs",
    "$dir_pigweed/targets/docs:target_docs",
    "$dir_pigweed/targets/host:target_docs",
    "$dir_pigweed/targets/host_device_simulator:target_docs",
    "$dir_pigweed/targets/lm3s6965evb_qemu:target_docs",
    "$dir_pigweed/targets/mimxrt595_evk:target_docs",
    "$dir_pigweed/targets/stm32f429i_disc1:target_docs",
    "$dir_pigweed/targets/stm32f429i_disc1_stm32cube:target_docs",
  ]
}

group("module_docs") {
  deps = [
    "$dir_docker:docs",
    "$dir_pw_allocator:docs",
    "$dir_pw_analog:docs",
    "$dir_pw_android_toolchain:docs",
    "$dir_pw_arduino_build:docs",
    "$dir_pw_assert:docs",
    "$dir_pw_assert_basic:docs",
    "$dir_pw_assert_log:docs",
    "$dir_pw_assert_zephyr:docs",
    "$dir_pw_base64:docs",
    "$dir_pw_bloat:docs",
    "$dir_pw_blob_store:docs",
    "$dir_pw_bluetooth_hci:docs",
    "$dir_pw_boot:docs",
    "$dir_pw_boot_cortex_m:docs",
    "$dir_pw_build:docs",
    "$dir_pw_build_info:docs",
    "$dir_pw_build_mcuxpresso: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_chrono_zephyr: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_file: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_interrupt_zephyr:docs",
    "$dir_pw_kvs:docs",
    "$dir_pw_libc:docs",
    "$dir_pw_log:docs",
    "$dir_pw_log_basic:docs",
    "$dir_pw_log_null:docs",
    "$dir_pw_log_rpc: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_software_update:docs",
    "$dir_pw_span:docs",
    "$dir_pw_spi:docs",
    "$dir_pw_status:docs",
    "$dir_pw_stm32cube_build:docs",
    "$dir_pw_stream:docs",
    "$dir_pw_string:docs",
    "$dir_pw_symbolizer: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_sync_zephyr:docs",
    "$dir_pw_sys_io:docs",
    "$dir_pw_sys_io_arduino:docs",
    "$dir_pw_sys_io_baremetal_stm32f429:docs",
    "$dir_pw_sys_io_mcuxpresso:docs",
    "$dir_pw_sys_io_stdio:docs",
    "$dir_pw_sys_io_zephyr:docs",
    "$dir_pw_system: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",
    "$dir_pw_work_queue:docs",
  ]
}

group("third_party_docs") {
  deps = [
    "$dir_pigweed/third_party/freertos:docs",
    "$dir_pigweed/third_party/nanopb: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.
    "automated_analysis.rst",
    "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",
    ":sphinx_themes.install",
    ":target_docs",
    ":third_party_docs",
    "$dir_pw_env_setup:python.install",
  ]
}

# Install Pigweed specific sphinx themes.
pw_python_requirements("sphinx_themes") {
  requirements = [
    "furo",
    "sphinx_design",
  ]
}
