wireshark/cmake/modules/FindAsciidoctor.cmake

300 lines
9.8 KiB
CMake

#
# - Find Asciidoctor
# Sets:
# ASCIIDOCTOR_EXECUTABLE
#
INCLUDE(FindChocolatey)
FIND_PROGRAM(ASCIIDOCTOR_EXECUTABLE
NAMES
asciidoctorj
asciidoctor.bat
asciidoctor
asciidoctor.ruby2.1
# XXX Add Asciidoctor.js releases (asciidoctor-linux,
# asciidoctor-macos, asciidoctor-win) if that ever becomes an option.
PATHS
/bin
/usr/bin
/usr/local/bin
${CHOCOLATEY_BIN_PATH}
DOC "Path to Asciidoctor or AsciidoctorJ"
)
if(ASCIIDOCTOR_EXECUTABLE)
# As of 2.2.0 the AsciidctorJ wrapper script sets -Xmn128m -Xms256m -Xmx256m.
# This isn't enough for the User's Guide.
set(_asciidoctorj_opts "-Xmn256m -Xms512m -Xmx2048m $ENV{ASCIIDOCTORJ_OPTS}")
execute_process( COMMAND ${ASCIIDOCTOR_EXECUTABLE} --version OUTPUT_VARIABLE _ad_full_version )
separate_arguments(_ad_full_version)
list(GET _ad_full_version 1 ASCIIDOCTOR_VERSION)
function(set_asciidoctor_target_properties _target)
set_target_properties(${_target} PROPERTIES
FOLDER "Documentation"
EXCLUDE_FROM_DEFAULT_BUILD True
)
endfunction(set_asciidoctor_target_properties)
set (_asciidoctor_common_args
# Doesn't work with AsciidoctorJ?
# --failure-level=WARN
# --trace
--quiet
--attribute build_dir=${CMAKE_CURRENT_BINARY_DIR}
--require ${CMAKE_SOURCE_DIR}/docbook/asciidoctor-macros/ws_utils.rb
--require ${CMAKE_SOURCE_DIR}/docbook/asciidoctor-macros/commaize-block.rb
--require ${CMAKE_SOURCE_DIR}/docbook/asciidoctor-macros/cveidlink-inline-macro.rb
--require ${CMAKE_SOURCE_DIR}/docbook/asciidoctor-macros/manarg-block.rb
--require ${CMAKE_SOURCE_DIR}/docbook/asciidoctor-macros/wsbuglink-inline-macro.rb
--require ${CMAKE_SOURCE_DIR}/docbook/asciidoctor-macros/wssalink-inline-macro.rb
)
set(_asciidoctor_common_command
${CMAKE_COMMAND} -E env TZ=UTC
${ASCIIDOCTOR_EXECUTABLE}
${_asciidoctor_common_args}
)
set(_asciidoctor_docbook_common_command
${CMAKE_COMMAND} -E env TZ=UTC ASCIIDOCTORJ_OPTS=${_asciidoctorj_opts}
${ASCIIDOCTOR_EXECUTABLE}
${_asciidoctor_common_args}
)
MACRO( ASCIIDOCTOR2DOCBOOK _asciidocsource )
GET_FILENAME_COMPONENT( _source_base_name ${_asciidocsource} NAME_WE )
set( _output_xml ${_source_base_name}.xml )
add_custom_command(
OUTPUT
${_output_xml}
COMMAND ${_asciidoctor_docbook_common_command}
--backend docbook
--out-file ${_output_xml}
${CMAKE_CURRENT_SOURCE_DIR}/${_asciidocsource}
DEPENDS
${CMAKE_CURRENT_SOURCE_DIR}/${_asciidocsource}
${ARGN}
)
if(CMAKE_GENERATOR MATCHES "Visual Studio")
add_custom_command(
OUTPUT
${_output_xml}-stamp
COMMAND ${CMAKE_COMMAND} -E touch ${_output_xml}-stamp
DEPENDS ${_output_xml}
)
add_custom_target(generate_${_output_xml} DEPENDS ${_output_xml}-stamp)
else()
add_custom_target(generate_${_output_xml} DEPENDS ${_output_xml})
endif()
set_asciidoctor_target_properties(generate_${_output_xml})
unset(_output_xml)
ENDMACRO()
# Single page only, for the release notes and man pages.
MACRO( ASCIIDOCTOR2HTML _asciidocsource )
GET_FILENAME_COMPONENT( _source_base_name ${_asciidocsource} NAME_WE )
set( _output_html ${_source_base_name}.html )
ADD_CUSTOM_COMMAND(
OUTPUT
${_output_html}
COMMAND ${_asciidoctor_common_command}
--backend html
--out-file ${_output_html}
${CMAKE_CURRENT_SOURCE_DIR}/${_asciidocsource}
DEPENDS
${CMAKE_CURRENT_SOURCE_DIR}/${_asciidocsource}
${ARGN}
)
add_custom_target(generate_${_output_html} DEPENDS ${_output_html})
set_asciidoctor_target_properties(generate_${_output_html})
unset(_output_html)
ENDMACRO()
MACRO( ASCIIDOCTOR2TXT _asciidocsource )
GET_FILENAME_COMPONENT( _source_base_name ${_asciidocsource} NAME_WE )
set( _output_html ${_source_base_name}.html )
set( _output_txt ${_source_base_name}.txt )
ADD_CUSTOM_COMMAND(
OUTPUT
${_output_txt}
COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_SOURCE_DIR}/tools/html2text.py
${_output_html}
> ${_output_txt}
DEPENDS
${CMAKE_CURRENT_SOURCE_DIR}/${_asciidocsource}
${_output_html}
${ARGN}
)
unset(_output_html)
unset(_output_txt)
ENDMACRO()
# Generate one or more ROFF man pages
MACRO(ASCIIDOCTOR2ROFFMAN _man_section)
set(_input_adoc)
set(_output_man)
foreach(_src_file ${ARGN})
list(APPEND _input_adoc ${_src_file})
GET_FILENAME_COMPONENT(_source_base_name ${_src_file} NAME_WE )
list(APPEND _output_man ${_source_base_name}.${_man_section} )
endforeach()
ADD_CUSTOM_COMMAND(
OUTPUT
${_output_man}
COMMAND ${_asciidoctor_common_command}
--backend manpage
--destination-dir ${CMAKE_CURRENT_BINARY_DIR}
${_input_adoc}
DEPENDS
${_input_adoc}
)
unset(_src_file)
unset(_input_adoc)
unset(_output_man)
ENDMACRO()
# Generate one or more HTML man pages
MACRO(ASCIIDOCTOR2HTMLMAN)
set(_input_adoc)
set(_output_man)
foreach(_src_file ${ARGN})
list(APPEND _input_adoc ${_src_file})
GET_FILENAME_COMPONENT(_source_base_name ${_src_file} NAME_WE )
list(APPEND _output_man ${_source_base_name}.html )
endforeach()
ADD_CUSTOM_COMMAND(
OUTPUT
${_output_man}
COMMAND ${_asciidoctor_common_command}
--backend html
--destination-dir ${CMAKE_CURRENT_BINARY_DIR}
${_input_adoc}
DEPENDS
${_input_adoc}
)
unset(_src_file)
unset(_input_adoc)
unset(_output_man)
ENDMACRO()
# news: release-notes.txt
# ${CMAKE_COMMAND} -E copy_if_different release-notes.txt ../NEWS
FIND_PROGRAM(ASCIIDOCTOR_PDF_EXECUTABLE
NAMES
asciidoctorj
asciidoctor-pdf
PATHS
/bin
/usr/bin
/usr/local/bin
${CHOCOLATEY_BIN_PATH}
DOC "Path to Asciidoctor PDF or AsciidoctorJ"
)
if(ASCIIDOCTOR_PDF_EXECUTABLE)
set(_asciidoctor_pdf_common_command
${CMAKE_COMMAND} -E env TZ=UTC "ASCIIDOCTORJ_OPTS=${_asciidoctorj_opts}"
${ASCIIDOCTOR_PDF_EXECUTABLE}
--require asciidoctor-pdf
--backend pdf
${_asciidoctor_common_args}
)
MACRO( ASCIIDOCTOR2PDF _title _asciidocsource )
GET_FILENAME_COMPONENT( _source_base_name ${_asciidocsource} NAME_WE )
set(_generate_pdf "generate_${_source_base_name}_pdf")
set(_output_pdf "${_title}.pdf")
ADD_CUSTOM_COMMAND(
OUTPUT
${_output_pdf}
COMMAND ${_asciidoctor_pdf_common_command}
--out-file "${_output_pdf}"
${CMAKE_CURRENT_SOURCE_DIR}/${_asciidocsource}
DEPENDS
${CMAKE_CURRENT_SOURCE_DIR}/${_asciidocsource}
${ARGN}
VERBATIM
)
add_custom_target(${_generate_pdf} DEPENDS ${_output_pdf})
set_asciidoctor_target_properties(${_generate_pdf})
unset(_generate_pdf)
unset(_output_pdf)
ENDMACRO()
else(ASCIIDOCTOR_PDF_EXECUTABLE)
MACRO( ASCIIDOCTOR2PDF _asciidocsource )
ENDMACRO()
endif(ASCIIDOCTOR_PDF_EXECUTABLE)
FIND_PROGRAM(ASCIIDOCTOR_EPUB_EXECUTABLE
NAMES
asciidoctorj
asciidoctor-epub3
PATHS
/bin
/usr/bin
/usr/local/bin
${CHOCOLATEY_BIN_PATH}
DOC "Path to Asciidoctor EPUB3 or AsciidoctorJ"
)
if(ASCIIDOCTOR_EPUB_EXECUTABLE)
set(_asciidoctor_epub_common_command
${CMAKE_COMMAND} -E env TZ=UTC "ASCIIDOCTORJ_OPTS=${_asciidoctorj_opts}"
${ASCIIDOCTOR_EPUB_EXECUTABLE}
--backend epub3
${_asciidoctor_common_args}
)
MACRO(ASCIIDOCTOR2EPUB _title _asciidocsource)
GET_FILENAME_COMPONENT(_source_base_name ${_asciidocsource} NAME_WE)
set(_generate_epub "generate_${_source_base_name}_epub")
set(_output_epub "${_title}.epub")
ADD_CUSTOM_COMMAND(
OUTPUT
${_output_epub}
COMMAND ${_asciidoctor_epub_common_command}
--out-file "${_output_epub}"
${CMAKE_CURRENT_SOURCE_DIR}/${_asciidocsource}
DEPENDS
${CMAKE_CURRENT_SOURCE_DIR}/${_asciidocsource}
${ARGN}
VERBATIM
)
add_custom_target(${_generate_epub} DEPENDS ${_output_epub})
set_asciidoctor_target_properties(${_generate_epub})
unset(_generate_epub)
unset(_output_epub)
ENDMACRO()
else(ASCIIDOCTOR_EPUB_EXECUTABLE)
MACRO(ASCIIDOCTOR2EPUB _asciidocsource)
ENDMACRO()
endif(ASCIIDOCTOR_EPUB_EXECUTABLE)
endif(ASCIIDOCTOR_EXECUTABLE)
include( FindPackageHandleStandardArgs )
find_package_handle_standard_args( Asciidoctor
REQUIRED_VARS ASCIIDOCTOR_EXECUTABLE
VERSION_VAR ASCIIDOCTOR_VERSION
)
mark_as_advanced( ASCIIDOCTOR_EXECUTABLE )