Salome HOME
0ff9081dbe3572436d40ac34073d89af7ef0bc61
[tools/configuration.git] / cmake / UseSphinx.cmake
1 ###########################################################################
2 # Copyright (C) 2007-2020  CEA/DEN, EDF R&D, OPEN CASCADE
3 #
4 # This library is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU Lesser General Public
6 # License as published by the Free Software Foundation; either
7 # version 2.1 of the License, or (at your option) any later version.
8 #
9 # This library is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12 # Lesser General Public License for more details.
13 #
14 # You should have received a copy of the GNU Lesser General Public
15 # License along with this library; if not, write to the Free Software
16 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
17 #
18 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
19 #
20
21 include(SalomeMacros)
22
23 IF(NOT Sphinx_FOUND)
24    MESSAGE(FATAL_ERROR "Developer error -> UseSphinx file should be included after detection of the sphinx!")
25 ENDIF()
26
27 FUNCTION(SPHINX_CHECK_EXTENSIONS)
28   CMAKE_PARSE_ARGUMENTS(CHECK_EXTENSIONS "REQUIRED" "" "" ${ARGN})
29   FOREACH(_ext ${CHECK_EXTENSIONS_UNPARSED_ARGUMENTS})
30     EXECUTE_PROCESS(COMMAND ${PYTHON_EXECUTABLE} -c "import ${_ext}; print('ok')" OUTPUT_VARIABLE _has_ext ERROR_QUIET)
31     IF(_has_ext)
32       MESSAGE(STATUS "Required Sphinx extension '${_ext}' has been found!")
33     ELSE()
34       IF(CHECK_EXTENSIONS_REQUIRED)
35         MESSAGE(FATAL_ERROR "Required Sphinx extension '${_ext}' is not found!")
36       ELSE()
37         MESSAGE(WARNING "Required Sphinx extension '${_ext}' is not found!")
38       ENDIF()
39     ENDIF()
40   ENDFOREACH()
41 ENDFUNCTION()
42
43 function(JOIN OUTPUT GLUE)
44     set(_TMP_RESULT "")
45     set(_GLUE "") # effective glue is empty at the beginning
46     foreach(arg ${ARGN})
47         set(_TMP_RESULT "${_TMP_RESULT}${_GLUE}${arg}")
48         set(_GLUE "${GLUE}")
49     endforeach()
50     set(${OUTPUT} "${_TMP_RESULT}" PARENT_SCOPE)
51 endfunction()
52
53 #----------------------------------------------------------------------------
54 # ADD_MULTI_LANG_DOCUMENTATION is a macro which adds sphinx multi-language 
55 # documentation.
56 #
57 # USAGE: ADD_MULTI_LANG_DOCUMENTATION(TARGET <target_name> MODULE <module_name>
58 #                                     LANGUAGES <languages_list>)
59 #
60 # ARGUMENTS:
61 # TARGET_NAME : IN : target name for the documentation
62 # MODULE : IN : SALOME module name
63 # LANGUAGES : IN : list of the languages
64 # ADDITIONAL_ENVIRONMENT: IN : list of additional enviromnent variable used 
65 # for generation of the documentation
66 #----------------------------------------------------------------------------
67 MACRO(ADD_MULTI_LANG_DOCUMENTATION)
68   # Common options
69   SET(PAPEROPT_a4 "-D latex_paper_size=a4")
70
71   # Parse input argument
72   PARSE_ARGUMENTS(MULTI_LANG "TARGET_NAME;MODULE;LANGUAGES;ADDITIONAL_ENVIRONMENT" "" ${ARGN})
73
74   # Content of the executable file to generate documentation
75   SET(CMDS)
76
77   JOIN(SPHINX_EXE " " ${SPHINX_EXECUTABLE})
78   STRING(REPLACE "$$" "$" SPHINX_EXE ${SPHINX_EXE})
79
80   IF(MULTI_LANG_LANGUAGES)
81     # 1. Options for generation POT files
82     SET(POT_SPHINXOPTS "-c ${CMAKE_CURRENT_BINARY_DIR} -b gettext ${CMAKE_CURRENT_SOURCE_DIR}/input potfiles")
83     SET(CMDS "${CMDS} ${SPHINX_EXE} ${POT_SPHINXOPTS}\n")
84
85     # 2. Update PO files options
86     SET(LANGS "")
87     FOREACH(lang ${MULTI_LANG_LANGUAGES})
88       SET(LANGS "${LANGS} -l ${lang}")
89     ENDFOREACH()
90     SET(PO_SPHINXOPTS "${PO_SPHINXOPTS} update -p potfiles ${LANGS}")
91     SET(CMDS "${CMDS} ${SPHINX_INTL_EXECUTABLE} ${PO_SPHINXOPTS}\n")
92
93     # 3. Build MO files
94     SET(CMDS "${CMDS} ${SPHINX_INTL_EXECUTABLE} build\n")
95   ENDIF()
96
97   # 4. Options for EN documentation
98   SET(SPHINXOPTS "-c ${CMAKE_CURRENT_BINARY_DIR} -d doctrees -b html ${PAPEROPT_a4} ${CMAKE_CURRENT_SOURCE_DIR}/input ${MULTI_LANG_MODULE}")
99   SET(CMDS "${CMDS} ${SPHINX_EXE} ${SPHINXOPTS}\n")
100
101   # 5. Options for other documentation
102   FOREACH(lang ${MULTI_LANG_LANGUAGES})
103     SET(${lang}_SPHINXOPTS "-c ${CMAKE_CURRENT_BINARY_DIR} -d doctrees -b html ${PAPEROPT_a4} -D language=${lang} ${CMAKE_CURRENT_SOURCE_DIR}/input ${MULTI_LANG_MODULE}_${lang}")
104     SET(CMDS "${CMDS} ${SPHINX_EXE} ${${lang}_SPHINXOPTS}\n")
105   ENDFOREACH()
106
107   # 6. Create command file
108   SET(_script_wo "build_doc")
109   IF(WIN32)
110     SET(_ext "bat")
111   ELSE()
112     SET(_ext "sh")
113   ENDIF()
114   SET(_script "${_script_wo}.${_ext}")
115
116   SALOME_GENERATE_ENVIRONMENT_SCRIPT(_not_used_output ${_script_wo} "" "" CONTEXT "${MULTI_LANG_TARGET_NAME}" CONTEXT_NAME "DO_GENERATION" ADDITIONAL_VARIABLES ${MULTI_LANG_ADDITIONAL_ENVIRONMENT})
117
118   FILE(APPEND ${_script} "${CMDS}")
119
120   # 7. Create custom target
121   ADD_CUSTOM_TARGET(${MULTI_LANG_TARGET_NAME}
122                     # 1. Copy existing po files
123                     COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_CURRENT_SOURCE_DIR}/locale ${CMAKE_CURRENT_BINARY_DIR}/locale
124                     # 2.  Generate documentation
125                     COMMAND ${_call_cmd} ${_script}
126                     WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
127                    )
128
129   # 8. Update PO files
130   FOREACH(lang ${MULTI_LANG_LANGUAGES})
131     FILE(GLOB _pfiles ${CMAKE_CURRENT_BINARY_DIR}/locale/${lang}/LC_MESSAGES/*.po)
132     ADD_CUSTOM_COMMAND(TARGET ${MULTI_LANG_TARGET_NAME} POST_BUILD
133       COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_SOURCE_DIR}/locale/${lang}/LC_MESSAGES)
134     FOREACH(pofile ${_pfiles})
135       GET_FILENAME_COMPONENT(fn_wo_path ${pofile} NAME)
136       ADD_CUSTOM_COMMAND(TARGET ${MULTI_LANG_TARGET_NAME} POST_BUILD
137                          COMMAND ${CMAKE_COMMAND} -E
138                          copy_if_different ${pofile} ${CMAKE_CURRENT_SOURCE_DIR}/locale/${lang}/LC_MESSAGES/${fn_wo_path})
139     ENDFOREACH()
140   ENDFOREACH()
141
142   # 9. Make clean files/folders
143   SET(make_clean_files ${MULTI_LANG_MODULE} doctrees potfiles locale)
144   FOREACH(lang ${MULTI_LANG_LANGUAGES})
145     SET(make_clean_files ${make_clean_files} ${MULTI_LANG_MODULE}_${lang})
146   ENDFOREACH()
147   SET_DIRECTORY_PROPERTIES(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "${make_clean_files}")
148
149 ENDMACRO(ADD_MULTI_LANG_DOCUMENTATION)