diff --git a/CMakeLists.txt b/CMakeLists.txt index 719d475e..16df8b76 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -128,4 +128,5 @@ target_link_libraries(ipset-shared cork-shared bloom-shared) set_target_properties(bloom-shared PROPERTIES OUTPUT_NAME bloom) add_subdirectory(src) +add_subdirectory(doc) diff --git a/doc/CMakeLists.txt b/doc/CMakeLists.txt new file mode 100644 index 00000000..7619de63 --- /dev/null +++ b/doc/CMakeLists.txt @@ -0,0 +1,85 @@ +find_program(XMLTO_EXECUTABLE NAMES xmlto) +find_program(ASCIIDOC_EXECUTABLE NAMES asciidoc asciidoc.py) + +# Opt-in doc build option +if (XMLTO_EXECUTABLE-NOTFOUND OR ASCIIDOC_EXECUTABLE-NOTFOUND) + option(WITH_DOC_MAN "Build manpage doc" OFF) +else () + option(WITH_DOC_MAN "Build manpage doc" ON) +endif () + +if (ASCIIDOC_EXECUTABLE-NOTFOUND) + option(WITH_DOC_HTML "Build html doc" OFF) +else () + option(WITH_DOC_HTML "Build html doc" ON) +endif () + + +# NOTE For brew user, we have to setup this env var. see `brew info asciidoc' +set(XMLTO_ENV) +set(XMLTO_CATALOG_DIR_MACOS /usr/local/etc/xml/catalog) +if (EXISTS ${XMLTO_CATALOG_DIR_MACOS}) + set(XMLTO_ENV XML_CATALOG_FILES=${XMLTO_CATALOG_DIR_MACOS}) + message(STATUS "Detect xmlto catalog dir ${XMLTO_CATALOG_DIR_MACOS}") +endif () + +set(CMAKE_MANPAGE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/man) + +set(DOC_DIR ${CMAKE_SOURCE_DIR}/doc) +set(XMLTO_OPTS -m ${DOC_DIR}/manpage-normal.xsl -m ${DOC_DIR}/manpage-bold-literal.xsl man) +set(ASCIIDOC_XML_OPTS -b docbook -d manpage -f ${DOC_DIR}/asciidoc.conf -aversion=${PROJECT_VERSION}) +set(ASCIIDOC_HTML_OPTS -b html4 -d article -f ${DOC_DIR}/asciidoc.conf -aversion=${PROJECT_VERSION}) + + +set(MAN_NAMES ss-local.1 ss-manager.1 ss-nat.1 ss-redir.1 ss-server.1 ss-tunnel.1 shadowsocks-libev.8) +set(MAN_FILES) +set(HTML_FILES) + +foreach (manfile IN LISTS MAN_NAMES) + string(REGEX REPLACE \\.. .xml xmlfile ${manfile}) + string(REGEX REPLACE \\.. .asciidoc docfile ${manfile}) + string(REGEX REPLACE \\.. .html htmlfile ${manfile}) + + set(docfile ${DOC_DIR}/${docfile}) + + add_custom_command(OUTPUT ${manfile} + COMMAND ${ASCIIDOC_EXECUTABLE} ${ASCIIDOC_XML_OPTS} -o ${xmlfile} ${docfile} + COMMAND ${CMAKE_COMMAND} -E env ${XMLTO_ENV} ${XMLTO_EXECUTABLE} ${XMLTO_OPTS} ${xmlfile} + # After we built the manpage, the xmlfile is nolongger needed + COMMAND ${CMAKE_COMMAND} -E remove ${xmlfile} + DEPENDS ${docfile} + WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/man + COMMENT "Building manpage ${manfile}" + VERBATIM) + list(APPEND MAN_FILES ${manfile}) + + add_custom_command(OUTPUT ${htmlfile} + COMMAND ${ASCIIDOC_EXECUTABLE} ${ASCIIDOC_HTML_OPTS} -o ${htmlfile} ${docfile} + DEPENDS ${docfile} + WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/html + COMMENT "Building htmlfile ${htmlfile}" + VERBATIM) + list(APPEND HTML_FILES ${htmlfile}) +endforeach () + +add_custom_target(doc-man ALL DEPENDS ${MAN_FILES}) +add_custom_target(doc-html ALL DEPENDS ${HTML_FILES}) + + +if (NOT WITH_DOC_MAN) + set_target_properties(doc-man PROPERTIES EXCLUDE_FROM_ALL TRUE) +endif () +if (NOT WITH_DOC_HTML) + set_target_properties(doc-html PROPERTIES EXCLUDE_FROM_ALL TRUE) +endif () + +# This is required for custom command +file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/man) +file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/html) + +install(DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} + DESTINATION man + FILES_MATCHING PATTERN "*.[18]") +install(DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} + DESTINATION html + FILES_MATCHING PATTERN "*.html") \ No newline at end of file diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index c9aae696..b620a1ee 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -97,13 +97,33 @@ find_library(LIBEV_SHARED ev) find_library(LIBUDNS_SHARED udns) find_library(LIBPCRE_SHARED pcre) -list(APPEND DEPS bloom m ${LIBEV} ${LIBUDNS} ${LIBPCRE} ${LIBSODIUM} ${LIBMBEDTLS} ${LIBMBEDCRYPTO}) -list(APPEND DEPS_SHARED bloom-shared m ${LIBEV_SHARED} ${LIBUDNS_SHARED} ${LIBPCRE_SHARED} ${LIBSODIUM_SHARED} -${LIBMBEDTLS_SHARED} ${LIBMBEDCRYPTO_SHARED}) +# Dependencies we need for static and shared +list(APPEND DEPS + m + bloom + ${LIBEV} + ${LIBUDNS} + ${LIBPCRE} + ${LIBSODIUM} + ${LIBMBEDTLS} + ${LIBMBEDCRYPTO} + ) +list(APPEND DEPS_SHARED + m + bloom-shared + ${LIBEV_SHARED} + ${LIBUDNS_SHARED} + ${LIBPCRE_SHARED} + ${LIBSODIUM_SHARED} + ${LIBMBEDTLS_SHARED} + ${LIBMBEDCRYPTO_SHARED} + ) find_package (Threads) -# Add our targets +# ------------------------------------------------------------------ +# Static +# By default we use normal name for static, all shared targets will add a `-shared' suffix add_executable(ss-server ${SS_SERVER_SOURCE}) add_executable(ss-tunnel ${SS_TUNNEL_SOURCE}) add_executable(ss-manager ${SS_MANAGER_SOURCE}) @@ -132,6 +152,9 @@ target_link_libraries(shadowsocks-libev cork ipset ${DEPS}) # ------------------------------------------------------------------ # Shared +# Shared target will have a `-shared' suffix +# All shared dependency also have `-shared' suffix +# For shared binary, we still use the same name as static, without `-shared', but will output to shared directory add_executable(ss-server-shared ${SS_SERVER_SOURCE}) add_executable(ss-tunnel-shared ${SS_TUNNEL_SOURCE}) add_executable(ss-manager-shared ${SS_MANAGER_SOURCE}) @@ -172,7 +195,8 @@ set_target_properties(shadowsocks-libev-shared PROPERTIES OUTPUT_NAME shadowsock target_compile_definitions(shadowsocks-libev-shared PUBLIC -DMODULE_LOCAL) target_link_libraries(shadowsocks-libev-shared cork-shared ipset-shared ${DEPS_SHARED}) - +# ------------------------------------------------------------------ +# Misc install(DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} DESTINATION bin FILES_MATCHING PATTERN "ss-*")