# Building docs script # Requirements: # sudo apt-get install doxygen texlive ruby-dev # sudo gem install jekyll execjs therubyracer if(NOT BUILD_docs OR NOT DOXYGEN_FOUND) return() endif() ################################################################################################# # Gather docs from /examples/**/readme.md function(gather_readmes_as_prebuild_cmd target gathered_dir root) set(full_gathered_dir ${root}/${gathered_dir}) file(GLOB_RECURSE readmes ${root}/examples/readme.md ${root}/examples/README.md) foreach(file ${readmes}) # Only use file if it is to be included in docs. file(STRINGS ${file} file_lines REGEX "include_in_docs: true") if(file_lines) # Since everything is called readme.md, rename it by its dirname. file(RELATIVE_PATH file ${root} ${file}) get_filename_component(folder ${file} PATH) set(new_filename ${full_gathered_dir}/${folder}.md) # folder value might be like /readme.md. That's why make directory. get_filename_component(new_folder ${new_filename} PATH) add_custom_command(TARGET ${target} PRE_BUILD COMMAND ${CMAKE_COMMAND} -E make_directory ${new_folder} COMMAND ln -sf ${root}/${file} ${new_filename} COMMENT "Creating symlink ${new_filename} -> ${root}/${file}" WORKING_DIRECTORY ${root} VERBATIM) endif() endforeach() endfunction() ################################################################################################ # Gather docs from examples/*.ipynb and add YAML front-matter. function(gather_notebooks_as_prebuild_cmd target gathered_dir root) set(full_gathered_dir ${root}/${gathered_dir}) if(NOT PYTHON_EXECUTABLE) message(STATUS "Python interpeter is not found. Can't include *.ipynb files in docs. Skipping...") return() endif() file(GLOB_RECURSE notebooks ${root}/examples/*.ipynb) foreach(file ${notebooks}) file(RELATIVE_PATH file ${root} ${file}) set(new_filename ${full_gathered_dir}/${file}) get_filename_component(new_folder ${new_filename} PATH) add_custom_command(TARGET ${target} PRE_BUILD COMMAND ${CMAKE_COMMAND} -E make_directory ${new_folder} COMMAND ${PYTHON_EXECUTABLE} scripts/copy_notebook.py ${file} ${new_filename} COMMENT "Copying notebook ${file} to ${new_filename}" WORKING_DIRECTORY ${root} VERBATIM) endforeach() set(${outputs_var} ${outputs} PARENT_SCOPE) endfunction() ################################################################################################ ########################## [ Non macro part ] ################################################## # Gathering is done at each 'make doc' file(REMOVE_RECURSE ${PROJECT_SOURCE_DIR}/docs/gathered) # Doxygen config file path set(DOXYGEN_config_file ${PROJECT_SOURCE_DIR}/.Doxyfile CACHE FILEPATH "Doxygen config file") # Adding docs target add_custom_target(docs COMMAND ${DOXYGEN_EXECUTABLE} ${DOXYGEN_config_file} WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} COMMENT "Launching doxygen..." VERBATIM) # Gathering examples into docs subfolder gather_notebooks_as_prebuild_cmd(docs docs/gathered ${PROJECT_SOURCE_DIR}) gather_readmes_as_prebuild_cmd(docs docs/gathered ${PROJECT_SOURCE_DIR}) # Auto detect output directory file(STRINGS ${DOXYGEN_config_file} config_line REGEX "OUTPUT_DIRECTORY[ \t]+=[^=].*") if(config_line) string(REGEX MATCH "OUTPUT_DIRECTORY[ \t]+=([^=].*)" __ver_check "${config_line}") string(STRIP ${CMAKE_MATCH_1} output_dir) message(STATUS "Detected Doxygen OUTPUT_DIRECTORY: ${output_dir}") else() set(output_dir ./doxygen/) message(STATUS "Can't find OUTPUT_DIRECTORY in doxygen config file. Try to use default: ${output_dir}") endif() if(NOT IS_ABSOLUTE ${output_dir}) set(output_dir ${PROJECT_SOURCE_DIR}/${output_dir}) get_filename_component(output_dir ${output_dir} ABSOLUTE) endif() # creates symlink in docs subfolder to code documentation built by doxygen add_custom_command(TARGET docs POST_BUILD VERBATIM COMMAND ln -sfn "${output_dir}/html" doxygen WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}/docs COMMENT "Creating symlink ${PROJECT_SOURCE_DIR}/docs/doxygen -> ${output_dir}/html") # for quick launch of jekyll add_custom_target(jekyll COMMAND jekyll serve -w -s . -d _site --port=4000 WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}/docs COMMENT "Launching jekyll..." VERBATIM)