fltk/documentation/CMakeLists.txt
Aaron Ucko 6b8409fc6c
Use CMake's built-in timestamp formatting (#1242)
* Use CMake's built-in timestamp formatting.

It notably honors SOURCE_DATE_EPOCH if set, making for reproducible
output.  For even better reproducibility, use UTC.  (Unlike the date
command's output, the result is already always in English.)  Extend
this approach to the book, introducing appropriately formatted
PDF_DATE and TODAY variables for its PDF metadata and title page
respectively and making make_pdf configurable.

Under the traditional build system, don't attempt to handle
SOURCE_DATE_EPOCH because date's portable interface is too limited,
just supply PDF_DATE and TODAY values corresponding to the current
date (and time zone) and use the C (English) locale for month names
and abbreviations.

* Fix missing parts and a syntax error in documentation/Makefile

- documentation/Makefile:
  - add make_pdf to target 'clean'
  - add make_pdf to dependencies of 'refman.pdf'
  - add missing quotes to `date` command

- documentation/.gitignore: add make_pdf

---------

Co-authored-by: Albrecht Schlosser <albrechts.fltk@online.de>
2025-04-03 01:49:59 +02:00

250 lines
6.7 KiB
CMake

#
# CMakeLists.txt to build docs for the FLTK project using CMake (www.cmake.org)
#
# Copyright 1998-2024 by Bill Spitzak and others.
#
# This library is free software. Distribution and use rights are outlined in
# the file "COPYING" which should have been included with this file. If this
# file is missing or damaged, see the license at:
#
# https://www.fltk.org/COPYING.php
#
# Please see the following page on how to report bugs and issues:
#
# https://www.fltk.org/bugs.php
#
set(DOCS)
set(GENERATE_DOCS FALSE)
set(YEAR "")
set(CURRENT_DATE "")
if(FLTK_BUILD_HTML_DOCS OR FLTK_BUILD_PDF_DOCS)
set(GENERATE_DOCS TRUE)
endif()
if(FLTK_INCLUDE_DRIVER_DOCS)
set(DRIVER_DOCS "DriverDev")
else()
set(DRIVER_DOCS "")
endif()
#------------------------------------------------
# generate files used for both HTML and PDF docs
#------------------------------------------------
if(GENERATE_DOCS)
# create required variables
string(TIMESTAMP YEAR "%Y" UTC)
# note: current locale is used for abbreviated month
string(TIMESTAMP CURRENT_DATE "%b %d, %Y" UTC)
string(TIMESTAMP PDF_DATE "D:%Y%m%d%H%M%SZ" UTC)
string(TIMESTAMP TODAY "%B %d, %Y" UTC)
string(REPLACE " 0" " " TODAY "${TODAY}")
# Find "short" doxygen version if it was built from Git
# Note: this is still needed in CMake 3.15 but later CMake versions
# (notably 3.25) remove the Git revision in 'DOXYGEN_VERSION'.
# Todo: Find the "first good" CMake version and remove this redundant
# code once we require this as our minimal version and replace the
# variable DOXYGEN_VERSION_SHORT with DOXYGEN_VERSION below.
if(DOXYGEN_FOUND)
# strip trailing git revision if doxygen was built from source
string(REGEX REPLACE " .*$" "" DOXYGEN_VERSION_SHORT ${DOXYGEN_VERSION})
endif(DOXYGEN_FOUND)
# configure copyright.dox (includes current year)
configure_file(
${CMAKE_CURRENT_SOURCE_DIR}/copyright.dox.in
${CMAKE_CURRENT_BINARY_DIR}/copyright.dox
@ONLY
)
# configure generated.dox (includes date and versions)
configure_file(
${CMAKE_CURRENT_SOURCE_DIR}/generated.dox.in
${CMAKE_CURRENT_BINARY_DIR}/generated.dox
@ONLY
)
if(0) # debug
fl_debug_var(YEAR)
fl_debug_var(CURRENT_DATE)
fl_debug_var(PDF_DATE)
fl_debug_var(TODAY)
fl_debug_var(FLTK_GIT_REVISION)
fl_debug_var(DOXYGEN_FOUND)
fl_debug_var(DOXYGEN_EXECUTABLE)
fl_debug_var(DOXYGEN_VERSION)
fl_debug_var(DOXYGEN_VERSION_SHORT)
endif()
endif(GENERATE_DOCS)
#--------------------------
# build html documentation
#--------------------------
if(FLTK_BUILD_HTML_DOCS)
list(APPEND DOCS html)
# generate Doxygen file "Doxyfile"
set(GENERATE_HTML YES)
set(GENERATE_LATEX NO)
set(LATEX_HEADER "")
set(DOXYFILE "Doxyfile")
set(LOGFILE "${CMAKE_CURRENT_BINARY_DIR}/${DOXYFILE}_error.log")
# configure Doxygen input file for HTML docs (Doxyfile.in)
configure_file(
${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile.in
${CMAKE_CURRENT_BINARY_DIR}/${DOXYFILE}.in
@ONLY
)
# convert Doxyfile to used doxygen version
add_custom_command(
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${DOXYFILE}
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/convert_doxyfile
${DOXYGEN_EXECUTABLE}
${DOXYFILE}.in
${DOXYFILE}
${LOGFILE}
BYPRODUCTS ${LOGFILE}
COMMENT "Converting ${DOXYFILE} to doxygen version ${DOXYGEN_VERSION_SHORT}" VERBATIM
)
# generate HTML documentation
add_custom_target(html
COMMAND ${DOXYGEN_EXECUTABLE} ${DOXYFILE}
DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${DOXYFILE}
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
COMMENT "Generating HTML documentation" VERBATIM
)
endif(FLTK_BUILD_HTML_DOCS)
#--------------------------
# build pdf documentation
#--------------------------
if(FLTK_BUILD_PDF_DOCS)
list(APPEND DOCS pdf)
# generate Doxygen input file "Doxybook"
set(GENERATE_HTML NO)
set(GENERATE_LATEX YES)
set(LATEX_HEADER "${CMAKE_CURRENT_BINARY_DIR}/fltk-book.tex")
set(DOXYFILE "Doxybook")
set(LOGFILE "${CMAKE_CURRENT_BINARY_DIR}/${DOXYFILE}_error.log")
# configure Doxygen input file for PDF docs (Doxybook.in)
configure_file(
${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile.in
${CMAKE_CURRENT_BINARY_DIR}/${DOXYFILE}.in
@ONLY
)
# convert Doxybook to current doxygen version
# set DOXY_VERSION for compatibility with configure/make,
# to be replaced in fltk-title.tex.in
# FIXME: this can be simplified when configure/make is no longer supported
set(DOXY_VERSION "${DOXYGEN_VERSION_SHORT}") #
add_custom_command(
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${DOXYFILE}
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/convert_doxyfile
${DOXYGEN_EXECUTABLE}
${DOXYFILE}.in
${DOXYFILE}
${LOGFILE}
BYPRODUCTS ${LOGFILE}
COMMENT "Converting ${DOXYFILE} to doxygen version ${DOXYGEN_VERSION_SHORT}" VERBATIM
)
# generate LaTeX title fltk-title.tex and make_pdf script
configure_file(
${CMAKE_CURRENT_SOURCE_DIR}/src/fltk-title.tex.in
${CMAKE_CURRENT_BINARY_DIR}/fltk-title.tex
@ONLY
)
configure_file(
${CMAKE_CURRENT_SOURCE_DIR}/make_pdf.in
${CMAKE_CURRENT_BINARY_DIR}/make_pdf
@ONLY
)
# generate fltk.pdf
add_custom_command(
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/fltk.pdf
COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/make_header
${DOXYGEN_EXECUTABLE}
${CMAKE_CURRENT_BINARY_DIR}/fltk-title.tex
${CMAKE_CURRENT_BINARY_DIR}/fltk-book.tex
COMMAND ${DOXYGEN_EXECUTABLE} ${DOXYFILE}
COMMAND ${CMAKE_CURRENT_BINARY_DIR}/make_pdf
COMMAND cp -f latex/refman.pdf fltk.pdf
DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${DOXYFILE}
${CMAKE_CURRENT_BINARY_DIR}/fltk-title.tex
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
COMMENT "Generating PDF documentation" VERBATIM
)
# add target 'pdf'
add_custom_target(pdf
DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/fltk.pdf
)
endif(FLTK_BUILD_PDF_DOCS)
#----------------------------------
# add target 'docs' for all docs
#----------------------------------
if(DOCS)
add_custom_target(docs
DEPENDS ${DOCS}
)
endif(DOCS)
#----------------------------------
# install html + pdf documentation
#----------------------------------
if(FLTK_INSTALL_HTML_DOCS AND FLTK_BUILD_HTML_DOCS)
install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/html
DESTINATION ${FLTK_DATADIR}/doc/fltk
)
endif(FLTK_INSTALL_HTML_DOCS AND FLTK_BUILD_HTML_DOCS)
if(FLTK_INSTALL_PDF_DOCS AND FLTK_BUILD_PDF_DOCS)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/fltk.pdf
DESTINATION ${FLTK_DATADIR}/doc/fltk/
)
endif(FLTK_INSTALL_PDF_DOCS AND FLTK_BUILD_PDF_DOCS)