| # Enumerate a documentation source tree for SphinxSourceSync.cmake. | |
| # | |
| # Usage: | |
| # | |
| # cmake -DSOURCE_DIR=/path/to/project/docs \ | |
| # -DDESTINATION_DIR=/path/to/build/project/docs \ | |
| # -DFILE_LIST=/path/to/build/file-list.txt \ | |
| # -DDESTINATION_DOC_LIST=/path/to/build/destination-docs.txt \ | |
| # -DMISSING_FILE_LIST=/path/to/build/missing-files.txt \ | |
| # -DIGNORE_MISSING_FILE=/path/to/build/ignore-missing.txt \ | |
| # -P /path/to/SphinxSourceScan.cmake | |
| # | |
| # The output file contains source-relative paths, one per line. It is written | |
| # only when the directory listing changes, allowing downstream custom commands | |
| # to skip work when the always-run scan observes no additions, removals, or | |
| # renames. DESTINATION_DOC_LIST similarly records destination-relative .rst and | |
| # .md files so destination-only stale docs can trigger cleanup. | |
| # MISSING_FILE_LIST records source files that do not currently exist in the | |
| # destination tree, excluding paths listed in IGNORE_MISSING_FILE. | |
| include("${CMAKE_CURRENT_LIST_DIR}/SphinxSourceUtils.cmake") | |
| if (NOT DEFINED SOURCE_DIR) | |
| message(FATAL_ERROR "SOURCE_DIR must be set") | |
| endif() | |
| if (NOT DEFINED FILE_LIST) | |
| message(FATAL_ERROR "FILE_LIST must be set") | |
| endif() | |
| if (NOT DEFINED DESTINATION_DIR) | |
| message(FATAL_ERROR "DESTINATION_DIR must be set") | |
| endif() | |
| if (NOT DEFINED DESTINATION_DOC_LIST) | |
| message(FATAL_ERROR "DESTINATION_DOC_LIST must be set") | |
| endif() | |
| if (NOT DEFINED MISSING_FILE_LIST) | |
| message(FATAL_ERROR "MISSING_FILE_LIST must be set") | |
| endif() | |
| if (NOT DEFINED IGNORE_MISSING_FILE) | |
| message(FATAL_ERROR "IGNORE_MISSING_FILE must be set") | |
| endif() | |
| file(GLOB_RECURSE source_files | |
| LIST_DIRECTORIES false | |
| RELATIVE "${SOURCE_DIR}" | |
| "${SOURCE_DIR}/*") | |
| list(SORT source_files) | |
| set(contents) | |
| foreach(relative_path IN LISTS source_files) | |
| string(APPEND contents "${relative_path}\n") | |
| endforeach() | |
| write_if_changed("${FILE_LIST}" "${contents}") | |
| file(STRINGS "${IGNORE_MISSING_FILE}" ignore_missing_files) | |
| set(contents) | |
| foreach(relative_path IN LISTS source_files) | |
| list(FIND ignore_missing_files "${relative_path}" ignore_index) | |
| if (ignore_index EQUAL -1 AND | |
| NOT EXISTS "${DESTINATION_DIR}/${relative_path}") | |
| string(APPEND contents "${relative_path}\n") | |
| endif() | |
| endforeach() | |
| write_if_changed("${MISSING_FILE_LIST}" "${contents}") | |
| if (EXISTS "${DESTINATION_DIR}") | |
| file(GLOB_RECURSE destination_docs | |
| LIST_DIRECTORIES false | |
| RELATIVE "${DESTINATION_DIR}" | |
| "${DESTINATION_DIR}/*.rst" | |
| "${DESTINATION_DIR}/*.md") | |
| list(SORT destination_docs) | |
| else() | |
| set(destination_docs) | |
| endif() | |
| set(contents) | |
| foreach(relative_path IN LISTS destination_docs) | |
| string(APPEND contents "${relative_path}\n") | |
| endforeach() | |
| write_if_changed("${DESTINATION_DOC_LIST}" "${contents}") |