aboutsummaryrefslogtreecommitdiff
path: root/cmake
diff options
context:
space:
mode:
author_ov4 <ov4@ov4.org>2026-10-13 11:10:08 +0000
committer_ov4 <ov4@ov4.org>2026-10-13 11:10:08 +0000
commit3320220943fee04e6fff98c14aadf148472e6556 (patch)
treec4d40991fcf904af48378927dd284d1cc036f46c /cmake
parent85bd5c6663dc8c663f86828d1b1a5273ee0a82fe (diff)
build: use local Pandoc packages for manual generation
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Diffstat (limited to 'cmake')
-rw-r--r--cmake/ExtractPackages.cmake1
-rw-r--r--cmake/GenerateManual.cmake.in40
-rw-r--r--cmake/LocalDependencies.cmake6
-rw-r--r--cmake/Manual.cmake23
4 files changed, 70 insertions, 0 deletions
diff --git a/cmake/ExtractPackages.cmake b/cmake/ExtractPackages.cmake
index 7b525d7..71a9dea 100644
--- a/cmake/ExtractPackages.cmake
+++ b/cmake/ExtractPackages.cmake
@@ -16,6 +16,7 @@ function(cpsc_extract_packages)
"${CPSC_DEPS_DIR}/packages/*.deb"
"${CPSC_DEPS_DIR}/packages/*.pkg.tar.*"
"${CPSC_DEPS_DIR}/packages/*.bottle*.tar.gz"
+ "${CPSC_DEPS_DIR}/packages/pandoc-*-windows-x86_64.zip"
)
list(FILTER packages EXCLUDE REGEX "\\.sig$")
# Homebrew exposes both a cache symlink and its downloads/ target.
diff --git a/cmake/GenerateManual.cmake.in b/cmake/GenerateManual.cmake.in
new file mode 100644
index 0000000..dd1db2e
--- /dev/null
+++ b/cmake/GenerateManual.cmake.in
@@ -0,0 +1,40 @@
+# Pandoc is optional until the doc/install/release target actually needs it.
+set(local_bins "@CPSC_LOCAL_BIN_DIRS@")
+find_program(pandoc NAMES pandoc PATHS ${local_bins} NO_DEFAULT_PATH)
+if(pandoc)
+ set(local_pandoc TRUE)
+else()
+ find_program(pandoc NAMES pandoc)
+endif()
+if(NOT pandoc)
+ message(FATAL_ERROR "Generating the manual requires Pandoc; download it to deps/packages or install it in PATH")
+endif()
+message(STATUS "Using Pandoc: ${pandoc}")
+
+set(arguments --standalone --from=markdown --to=@cpsc_manual_format@)
+if("@cpsc_manual_format@" STREQUAL "html5")
+ list(APPEND arguments --metadata "title=cpsc manual")
+endif()
+if(local_pandoc AND IS_DIRECTORY "@CPSC_DEPS_ROOT@/usr/share/pandoc/data")
+ list(APPEND arguments "--data-dir=@CPSC_DEPS_ROOT@/usr/share/pandoc/data")
+endif()
+
+if(local_pandoc AND WIN32)
+ set(ENV{PATH} "${local_bins};$ENV{PATH}")
+elseif(local_pandoc AND UNIX AND NOT APPLE)
+ string(REPLACE ";" ":" libraries "@CPSC_LOCAL_LIBRARY_DIRS@")
+ if(NOT "$ENV{LD_LIBRARY_PATH}" STREQUAL "")
+ string(APPEND libraries ":$ENV{LD_LIBRARY_PATH}")
+ endif()
+ set(ENV{LD_LIBRARY_PATH} "${libraries}")
+endif()
+
+file(MAKE_DIRECTORY "@CMAKE_CURRENT_BINARY_DIR@/doc")
+execute_process(
+ COMMAND "${pandoc}" ${arguments} "@CMAKE_CURRENT_SOURCE_DIR@/doc/cpsc.md"
+ --output "@cpsc_manual_file@"
+ RESULT_VARIABLE result
+)
+if(NOT result EQUAL 0)
+ message(FATAL_ERROR "Pandoc failed to generate @cpsc_manual_file@ (${result})")
+endif()
diff --git a/cmake/LocalDependencies.cmake b/cmake/LocalDependencies.cmake
index 8160f86..8b80ee3 100644
--- a/cmake/LocalDependencies.cmake
+++ b/cmake/LocalDependencies.cmake
@@ -27,6 +27,12 @@ foreach(prefix IN LISTS cpsc_local_prefixes)
list(APPEND CPSC_LOCAL_INCLUDE_DIRS "${prefix}/include/libxml2")
list(APPEND CPSC_LOCAL_BIN_DIRS "${prefix}/bin")
endforeach()
+file(GLOB pandoc_directories LIST_DIRECTORIES TRUE "${CPSC_DEPS_ROOT}/pandoc-*")
+foreach(directory IN LISTS pandoc_directories)
+ if(IS_DIRECTORY "${directory}")
+ list(APPEND CPSC_LOCAL_BIN_DIRS "${directory}")
+ endif()
+endforeach()
if(CMAKE_LIBRARY_ARCHITECTURE)
list(INSERT CPSC_LOCAL_LIBRARY_DIRS 0
"${CPSC_DEPS_ROOT}/usr/lib/${CMAKE_LIBRARY_ARCHITECTURE}"
diff --git a/cmake/Manual.cmake b/cmake/Manual.cmake
new file mode 100644
index 0000000..0ba4ccb
--- /dev/null
+++ b/cmake/Manual.cmake
@@ -0,0 +1,23 @@
+if(WIN32)
+ set(cpsc_manual_file "${CMAKE_CURRENT_BINARY_DIR}/doc/cpsc.html")
+ set(cpsc_manual_format html5)
+else()
+ set(cpsc_manual_file "${CMAKE_CURRENT_BINARY_DIR}/doc/cpsc.1")
+ set(cpsc_manual_format man)
+endif()
+
+configure_file("${CMAKE_CURRENT_LIST_DIR}/GenerateManual.cmake.in"
+ "${CMAKE_CURRENT_BINARY_DIR}/GenerateManual.cmake" @ONLY)
+set(cpsc_manual_dependencies "${CMAKE_CURRENT_SOURCE_DIR}/doc/cpsc.md"
+ "${CMAKE_CURRENT_BINARY_DIR}/GenerateManual.cmake")
+if(EXISTS "${CPSC_DEPS_DIR}/packages.sha256")
+ list(APPEND cpsc_manual_dependencies "${CPSC_DEPS_DIR}/packages.sha256")
+endif()
+add_custom_command(
+ OUTPUT "${cpsc_manual_file}"
+ COMMAND "${CMAKE_COMMAND}" -P "${CMAKE_CURRENT_BINARY_DIR}/GenerateManual.cmake"
+ DEPENDS ${cpsc_manual_dependencies}
+ COMMENT "Generating cpsc manual (${cpsc_manual_format})"
+ VERBATIM
+)
+add_custom_target(doc DEPENDS "${cpsc_manual_file}")