diff --git a/cmake/modules/InstallationHelper.cmake b/cmake/modules/InstallationHelper.cmake --- a/cmake/modules/InstallationHelper.cmake +++ b/cmake/modules/InstallationHelper.cmake @@ -164,35 +164,43 @@ install_target(${_shared_name} ${FORWARD_EXCLUDE_FROM_ALL}) endfunction() -function(install_manpage TARGET) - set(MAN_DESTINATION "${CMAKE_INSTALL_MANDIR}/man1") +function(install_manpages TARGET) - set(MAN_PAGE "${CMAKE_BINARY_DIR}/doc/man/${TARGET}.1") - add_custom_command( - OUTPUT "${MAN_PAGE}" - COMMENT "Generating man page for ${TARGET}" - COMMAND - "${CMAKE_SOURCE_DIR}/doc/man/gen-manpages.sh" - "$" - "$" - "${MAN_PAGE}" - DEPENDS - bitcoind - "${TARGET}" + define_property(TARGET + PROPERTY MAN_PAGES + BRIEF_DOCS "The man pages associated with the target" + FULL_DOCS "A list of the man pages associated with a target" ) - add_custom_target(gen-manpage-${TARGET} - DEPENDS "${MAN_PAGE}" + + set_property( + TARGET ${TARGET} + APPEND PROPERTY MAN_PAGES ${ARGN} ) + define_property(GLOBAL + PROPERTY TARGETS_TO_GENERATE_MAN_PAGES + BRIEF_DOCS "Targets with generated man pages" + FULL_DOCS "A list of the targets that require their man pages to be generated" + ) + + # If no man page is given for this target, assume it should be generated + if(NOT ARGN) + set_property( + GLOBAL + APPEND PROPERTY TARGETS_TO_GENERATE_MAN_PAGES ${TARGET} + ) + endif() + + set(MAN_DESTINATION "${CMAKE_INSTALL_MANDIR}/man1") + install( - FILES "${MAN_PAGE}" + FILES "$" DESTINATION "${MAN_DESTINATION}" COMPONENT manpage-${TARGET} EXCLUDE_FROM_ALL ) _add_install_target(manpage-${TARGET} - DEPENDS gen-manpage-${TARGET} EXCLUDE_FROM_ALL ) _add_install_target(manpages diff --git a/doc/CMakeLists.txt b/doc/CMakeLists.txt --- a/doc/CMakeLists.txt +++ b/doc/CMakeLists.txt @@ -2,4 +2,5 @@ configure_file(Doxyfile.cmake.in Doxyfile ESCAPE_QUOTES) +add_subdirectory(man) add_subdirectory(rpc) diff --git a/doc/man/CMakeLists.txt b/doc/man/CMakeLists.txt new file mode 100644 --- /dev/null +++ b/doc/man/CMakeLists.txt @@ -0,0 +1,52 @@ +function(generate_manpages) + get_property(TARGETS + GLOBAL + PROPERTY TARGETS_TO_GENERATE_MAN_PAGES + ) + + foreach(TARGET ${TARGETS}) + if(NOT TARGET ${TARGET}) + continue() + endif() + + set(MAN_PAGE "${CMAKE_BINARY_DIR}/doc/man/${TARGET}.1") + + add_custom_command( + OUTPUT "${MAN_PAGE}" + COMMENT "Generating man page for ${TARGET}" + COMMAND + "${CMAKE_SOURCE_DIR}/doc/man/gen-manpages.sh" + "$" + "$" + "${MAN_PAGE}" + DEPENDS + bitcoind + "${TARGET}" + ) + add_custom_target(gen-manpage-${TARGET} + DEPENDS "${MAN_PAGE}" + ) + + set_property( + TARGET ${TARGET} + APPEND PROPERTY MAN_PAGES "${MAN_PAGE}" + ) + + if(TARGET install-manpage-${TARGET}) + add_dependencies(install-manpage-${TARGET} gen-manpage-${TARGET}) + endif() + endforeach() +endfunction() + +function(_generate_manpages_hook VAR ACCESS) + # When CMAKE_CURRENT_LIST_DIR is set to empty, we add the man pages + # generation targets. This ensures all targets are created when this + # function runs independently of the list files inclusion order. + if("${VAR}" STREQUAL "CMAKE_CURRENT_LIST_DIR" AND + "${CMAKE_CURRENT_LIST_DIR}" STREQUAL "" AND + "${ACCESS}" STREQUAL "MODIFIED_ACCESS") + generate_manpages() + endif() +endfunction() + +variable_watch(CMAKE_CURRENT_LIST_DIR _generate_manpages_hook) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -597,7 +597,7 @@ add_to_security_check(bitcoin-wallet) install_target(bitcoin-wallet) - install_manpage(bitcoin-wallet) + install_manpages(bitcoin-wallet) else() target_sources(server PRIVATE dummywallet.cpp) endif() @@ -630,7 +630,7 @@ add_to_security_check(bitcoin-cli) install_target(bitcoin-cli) - install_manpage(bitcoin-cli) + install_manpages(bitcoin-cli) endif() # bitcoin-tx @@ -646,7 +646,7 @@ add_to_security_check(bitcoin-tx) install_target(bitcoin-tx) - install_manpage(bitcoin-tx) + install_manpages(bitcoin-tx) endif() # bitcoind @@ -659,7 +659,7 @@ add_to_security_check(bitcoind) install_target(bitcoind) -install_manpage(bitcoind) +install_manpages(bitcoind) # Bitcoin-qt if(BUILD_BITCOIN_QT) diff --git a/src/qt/CMakeLists.txt b/src/qt/CMakeLists.txt --- a/src/qt/CMakeLists.txt +++ b/src/qt/CMakeLists.txt @@ -341,7 +341,7 @@ include(InstallationHelper) install_target(bitcoin-qt) -install_manpage(bitcoin-qt) +install_manpages(bitcoin-qt) if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin") set(BITCOINQT_BUNDLE_ICON "res/icons/bitcoin.icns")