aboutsummaryrefslogtreecommitdiff
path: root/cmake
diff options
context:
space:
mode:
author_ov4 <ov4@ov4.org>2026-10-13 14:16:53 +0000
committer_ov4 <ov4@ov4.org>2026-10-13 14:16:53 +0000
commit1c64adaad7ad89386ae9cb44c8e3050672a59d6e (patch)
treefa54be5a52e73e5e67d3a0bfe0f76597d82cea5f /cmake
parent3b4e89d96afe203bb0e8b5b331bb30d1193d0831 (diff)
Build and package all language manuals with offline HTML links
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Diffstat (limited to 'cmake')
-rw-r--r--cmake/GenerateManual.cmake.in14
-rw-r--r--cmake/Manual.cmake38
-rw-r--r--cmake/ManualLinks.lua8
-rw-r--r--cmake/Release.cmake7
4 files changed, 51 insertions, 16 deletions
diff --git a/cmake/GenerateManual.cmake.in b/cmake/GenerateManual.cmake.in
index b6bf853..8874c82 100644
--- a/cmake/GenerateManual.cmake.in
+++ b/cmake/GenerateManual.cmake.in
@@ -6,7 +6,9 @@ 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")
+ get_filename_component(title "${CPSC_MANUAL_SOURCE}" NAME)
+ string(REGEX REPLACE "\\.[17]\\.md$" "" title "${title}")
+ list(APPEND arguments --metadata "title=${title}")
endif()
if(pandoc_LOCAL AND IS_DIRECTORY "@CPSC_DEPS_ROOT@/usr/share/pandoc/data")
list(APPEND arguments "--data-dir=@CPSC_DEPS_ROOT@/usr/share/pandoc/data")
@@ -22,12 +24,14 @@ elseif(pandoc_LOCAL AND UNIX AND NOT APPLE)
set(ENV{LD_LIBRARY_PATH} "${libraries}")
endif()
-file(MAKE_DIRECTORY "@CMAKE_CURRENT_BINARY_DIR@/doc")
+get_filename_component(output_dir "${CPSC_MANUAL_OUTPUT}" DIRECTORY)
+file(MAKE_DIRECTORY "${output_dir}")
+list(APPEND arguments "--lua-filter=@CMAKE_CURRENT_SOURCE_DIR@/cmake/ManualLinks.lua")
execute_process(
- COMMAND "${pandoc}" ${arguments} "@CMAKE_CURRENT_SOURCE_DIR@/doc/cpsc.1.md"
- --output "@cpsc_manual_file@"
+ COMMAND "${pandoc}" ${arguments} "${CPSC_MANUAL_SOURCE}"
+ --output "${CPSC_MANUAL_OUTPUT}"
RESULT_VARIABLE result
)
if(NOT result EQUAL 0)
- message(FATAL_ERROR "Pandoc failed to generate @cpsc_manual_file@ (${result})")
+ message(FATAL_ERROR "Pandoc failed to generate ${CPSC_MANUAL_OUTPUT} (${result})")
endif()
diff --git a/cmake/Manual.cmake b/cmake/Manual.cmake
index 3c20f12..689c91e 100644
--- a/cmake/Manual.cmake
+++ b/cmake/Manual.cmake
@@ -1,24 +1,40 @@
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.1.md"
+file(GLOB cpsc_language_sources CONFIGURE_DEPENDS
+ "${CMAKE_CURRENT_SOURCE_DIR}/doc/language/cpsc-*.7.md")
+set(cpsc_manual_sources "${CMAKE_CURRENT_SOURCE_DIR}/doc/cpsc.1.md"
+ ${cpsc_language_sources})
+set(cpsc_manual_dependencies
"${CMAKE_CURRENT_BINARY_DIR}/GenerateManual.cmake"
+ "${CMAKE_CURRENT_SOURCE_DIR}/cmake/ManualLinks.lua"
"${CPSC_DEPS_MODULE_DIR}/FindDependency.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}")
+set(cpsc_manual_outputs)
+foreach(source IN LISTS cpsc_manual_sources)
+ file(RELATIVE_PATH relative "${CMAKE_CURRENT_SOURCE_DIR}/doc" "${source}")
+ if(WIN32)
+ string(REGEX REPLACE "\\.[17]\\.md$" ".html" relative "${relative}")
+ else()
+ string(REGEX REPLACE "\\.md$" "" relative "${relative}")
+ endif()
+ set(output "${CMAKE_CURRENT_BINARY_DIR}/doc/${relative}")
+ add_custom_command(
+ OUTPUT "${output}"
+ COMMAND "${CMAKE_COMMAND}" "-DCPSC_MANUAL_SOURCE=${source}"
+ "-DCPSC_MANUAL_OUTPUT=${output}"
+ -P "${CMAKE_CURRENT_BINARY_DIR}/GenerateManual.cmake"
+ DEPENDS "${source}" ${cpsc_manual_dependencies}
+ COMMENT "Generating ${relative} (${cpsc_manual_format})"
+ VERBATIM
+ )
+ list(APPEND cpsc_manual_outputs "${output}")
+endforeach()
+add_custom_target(doc DEPENDS ${cpsc_manual_outputs})
diff --git a/cmake/ManualLinks.lua b/cmake/ManualLinks.lua
new file mode 100644
index 0000000..0fddef5
--- /dev/null
+++ b/cmake/ManualLinks.lua
@@ -0,0 +1,8 @@
+-- Markdown sources share links; render local HTML links or man-page names.
+function Link(link)
+ if FORMAT == 'man' then
+ return link.content
+ end
+ link.target = link.target:gsub('%.[17]%.md$', '.html')
+ return link
+end
diff --git a/cmake/Release.cmake b/cmake/Release.cmake
index 49dee98..59a1d79 100644
--- a/cmake/Release.cmake
+++ b/cmake/Release.cmake
@@ -21,6 +21,7 @@ if(CPSC_WINDOWS)
set(cpsc_binary_name cpsc.exe)
set(cpsc_installer install.ps1)
set(cpsc_manual cpsc.html)
+ set(cpsc_language_pattern "${CPSC_BINARY_DIR}/doc/language/cpsc-*.html")
set(cpsc_tar_flags cf)
set(cpsc_archive_format zip)
else()
@@ -28,6 +29,7 @@ else()
set(cpsc_binary_name cpsc)
set(cpsc_installer install.sh)
set(cpsc_manual cpsc.1)
+ set(cpsc_language_pattern "${CPSC_BINARY_DIR}/doc/language/cpsc-*.7")
set(cpsc_tar_flags cJf)
set(cpsc_archive_format gnutar)
endif()
@@ -38,6 +40,11 @@ configure_file("${CPSC_EXECUTABLE}" "${cpsc_package_dir}/${cpsc_binary_name}" CO
file(COPY "${CPSC_SOURCE_DIR}/${cpsc_installer}" "${CPSC_SOURCE_DIR}/LICENSE"
DESTINATION "${cpsc_package_dir}")
file(COPY "${CPSC_BINARY_DIR}/doc/${cpsc_manual}" DESTINATION "${cpsc_package_dir}/doc")
+file(GLOB cpsc_language_manuals "${cpsc_language_pattern}")
+if(NOT cpsc_language_manuals)
+ message(FATAL_ERROR "Language manuals are missing; build the doc target first")
+endif()
+file(COPY ${cpsc_language_manuals} DESTINATION "${cpsc_package_dir}/doc/language")
execute_process(
COMMAND "${CMAKE_COMMAND}" -E tar "${cpsc_tar_flags}" "${cpsc_archive}"
"--format=${cpsc_archive_format}" "${cpsc_package_name}"