summaryrefslogtreecommitdiffstats
path: root/cmake/docs-ci.cmake
diff options
context:
space:
mode:
Diffstat (limited to 'cmake/docs-ci.cmake')
-rw-r--r--cmake/docs-ci.cmake112
1 files changed, 112 insertions, 0 deletions
diff --git a/cmake/docs-ci.cmake b/cmake/docs-ci.cmake
new file mode 100644
index 0000000..ae7f0c7
--- /dev/null
+++ b/cmake/docs-ci.cmake
@@ -0,0 +1,112 @@
+cmake_minimum_required(VERSION 3.14)
+
+foreach(var IN ITEMS PROJECT_BINARY_DIR PROJECT_SOURCE_DIR)
+ if(NOT DEFINED "${var}")
+ message(FATAL_ERROR "${var} must be defined")
+ endif()
+endforeach()
+set(bin "${PROJECT_BINARY_DIR}")
+set(src "${PROJECT_SOURCE_DIR}")
+
+# ---- Dependencies ----
+
+set(mcss_SOURCE_DIR "${bin}/docs/.ci")
+if(NOT IS_DIRECTORY "${mcss_SOURCE_DIR}")
+ file(MAKE_DIRECTORY "${mcss_SOURCE_DIR}")
+ file(
+ DOWNLOAD
+ https://github.com/friendlyanon/m.css/releases/download/release-1/mcss.zip
+ "${mcss_SOURCE_DIR}/mcss.zip"
+ STATUS status
+ EXPECTED_MD5 00cd2757ebafb9bcba7f5d399b3bec7f
+ )
+ if(NOT status MATCHES "^0;")
+ message(FATAL_ERROR "Download failed with ${status}")
+ endif()
+ execute_process(
+ COMMAND "${CMAKE_COMMAND}" -E tar xf mcss.zip
+ WORKING_DIRECTORY "${mcss_SOURCE_DIR}"
+ RESULT_VARIABLE result
+ )
+ if(NOT result EQUAL "0")
+ message(FATAL_ERROR "Extraction failed with ${result}")
+ endif()
+ file(REMOVE "${mcss_SOURCE_DIR}/mcss.zip")
+endif()
+
+find_program(Python3_EXECUTABLE NAMES python3 python)
+if(NOT Python3_EXECUTABLE)
+ message(FATAL_ERROR "Python executable was not found")
+endif()
+
+# ---- Process project() call in CMakeLists.txt ----
+
+file(READ "${src}/CMakeLists.txt" content)
+
+string(FIND "${content}" "project(" index)
+if(index EQUAL "-1")
+ message(FATAL_ERROR "Could not find \"project(\"")
+endif()
+string(SUBSTRING "${content}" "${index}" -1 content)
+
+string(FIND "${content}" "\n)\n" index)
+if(index EQUAL "-1")
+ message(FATAL_ERROR "Could not find \"\\n)\\n\"")
+endif()
+string(SUBSTRING "${content}" 0 "${index}" content)
+
+file(WRITE "${bin}/docs-ci.project.cmake" "docs_${content}\n)\n")
+
+macro(list_pop_front list out)
+ list(GET "${list}" 0 "${out}")
+ list(REMOVE_AT "${list}" 0)
+endmacro()
+
+function(docs_project name)
+ cmake_parse_arguments(PARSE_ARGV 1 "" "" "VERSION;DESCRIPTION;HOMEPAGE_URL" LANGUAGES)
+ set(PROJECT_NAME "${name}" PARENT_SCOPE)
+ if(DEFINED _VERSION)
+ set(PROJECT_VERSION "${_VERSION}" PARENT_SCOPE)
+ string(REGEX MATCH "^[0-9]+(\\.[0-9]+)*" versions "${_VERSION}")
+ string(REPLACE . ";" versions "${versions}")
+ set(suffixes MAJOR MINOR PATCH TWEAK)
+ while(NOT versions STREQUAL "" AND NOT suffixes STREQUAL "")
+ list_pop_front(versions version)
+ list_pop_front(suffixes suffix)
+ set("PROJECT_VERSION_${suffix}" "${version}" PARENT_SCOPE)
+ endwhile()
+ endif()
+ if(DEFINED _DESCRIPTION)
+ set(PROJECT_DESCRIPTION "${_DESCRIPTION}" PARENT_SCOPE)
+ endif()
+ if(DEFINED _HOMEPAGE_URL)
+ set(PROJECT_HOMEPAGE_URL "${_HOMEPAGE_URL}" PARENT_SCOPE)
+ endif()
+endfunction()
+
+include("${bin}/docs-ci.project.cmake")
+
+# ---- Generate docs ----
+
+if(NOT DEFINED DOXYGEN_OUTPUT_DIRECTORY)
+ set(DOXYGEN_OUTPUT_DIRECTORY "${bin}/docs")
+endif()
+set(out "${DOXYGEN_OUTPUT_DIRECTORY}")
+
+foreach(file IN ITEMS Doxyfile conf.py)
+ configure_file("${src}/docs/${file}.in" "${bin}/docs/${file}" @ONLY)
+endforeach()
+
+set(mcss_script "${mcss_SOURCE_DIR}/documentation/doxygen.py")
+set(config "${bin}/docs/conf.py")
+
+file(REMOVE_RECURSE "${out}/html" "${out}/xml")
+
+execute_process(
+ COMMAND "${Python3_EXECUTABLE}" "${mcss_script}" "${config}"
+ WORKING_DIRECTORY "${bin}/docs"
+ RESULT_VARIABLE result
+)
+if(NOT result EQUAL "0")
+ message(FATAL_ERROR "m.css returned with ${result}")
+endif()