1# Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
2# file Copyright.txt or https://cmake.org/licensing for details.
3
4#[=======================================================================[.rst:
5FindLATEX
6---------
7
8Find LaTeX
9
10This module finds an installed LaTeX and determines the location
11of the compiler.  Additionally the module looks for Latex-related
12software like BibTeX.
13
14.. versionadded:: 3.2
15  Component processing; support for htlatex, pdftops, Biber, xindy, XeLaTeX,
16  LuaLaTeX.
17
18This module sets the following result variables::
19
20  LATEX_FOUND:          whether found Latex and requested components
21  LATEX_<component>_FOUND:  whether found <component>
22  LATEX_COMPILER:       path to the LaTeX compiler
23  PDFLATEX_COMPILER:    path to the PdfLaTeX compiler
24  XELATEX_COMPILER:     path to the XeLaTeX compiler
25  LUALATEX_COMPILER:    path to the LuaLaTeX compiler
26  BIBTEX_COMPILER:      path to the BibTeX compiler
27  BIBER_COMPILER:       path to the Biber compiler
28  MAKEINDEX_COMPILER:   path to the MakeIndex compiler
29  XINDY_COMPILER:       path to the xindy compiler
30  DVIPS_CONVERTER:      path to the DVIPS converter
31  DVIPDF_CONVERTER:     path to the DVIPDF converter
32  PS2PDF_CONVERTER:     path to the PS2PDF converter
33  PDFTOPS_CONVERTER:    path to the pdftops converter
34  LATEX2HTML_CONVERTER: path to the LaTeX2Html converter
35  HTLATEX_COMPILER:     path to the htlatex compiler
36
37Possible components are::
38
39  PDFLATEX
40  XELATEX
41  LUALATEX
42  BIBTEX
43  BIBER
44  MAKEINDEX
45  XINDY
46  DVIPS
47  DVIPDF
48  PS2PDF
49  PDFTOPS
50  LATEX2HTML
51  HTLATEX
52
53Example Usages::
54
55  find_package(LATEX)
56  find_package(LATEX COMPONENTS PDFLATEX)
57  find_package(LATEX COMPONENTS BIBTEX PS2PDF)
58#]=======================================================================]
59
60if (WIN32)
61  # Try to find the MikTex binary path (look for its package manager).
62  find_path(MIKTEX_BINARY_PATH mpm.exe
63    "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MiK\\MiKTeX\\CurrentVersion\\MiKTeX;Install Root]/miktex/bin"
64     "$ENV{LOCALAPPDATA}/Programs/MiKTeX/miktex/bin"
65     "$ENV{LOCALAPPDATA}/Programs/MiKTeX/miktex/bin/x64"
66     "$ENV{APPDATA}/Programs/MiKTeX/miktex/bin"
67     "$ENV{APPDATA}/Programs/MiKTeX/miktex/bin/x64"
68    DOC
69    "Path to the MikTex binary directory."
70  )
71  mark_as_advanced(MIKTEX_BINARY_PATH)
72
73  # Try to find the GhostScript binary path (look for gswin32).
74  get_filename_component(GHOSTSCRIPT_BINARY_PATH_FROM_REGISTERY_8_00
75     "[HKEY_LOCAL_MACHINE\\SOFTWARE\\AFPL Ghostscript\\8.00;GS_DLL]" PATH
76  )
77
78  get_filename_component(GHOSTSCRIPT_BINARY_PATH_FROM_REGISTERY_7_04
79     "[HKEY_LOCAL_MACHINE\\SOFTWARE\\AFPL Ghostscript\\7.04;GS_DLL]" PATH
80  )
81
82  find_path(GHOSTSCRIPT_BINARY_PATH gswin32.exe
83    ${GHOSTSCRIPT_BINARY_PATH_FROM_REGISTERY_8_00}
84    ${GHOSTSCRIPT_BINARY_PATH_FROM_REGISTERY_7_04}
85    DOC "Path to the GhostScript binary directory."
86  )
87  mark_as_advanced(GHOSTSCRIPT_BINARY_PATH)
88
89  find_path(GHOSTSCRIPT_LIBRARY_PATH ps2pdf13.bat
90    "${GHOSTSCRIPT_BINARY_PATH}/../lib"
91    DOC "Path to the GhostScript library directory."
92  )
93  mark_as_advanced(GHOSTSCRIPT_LIBRARY_PATH)
94endif ()
95
96# try to find Latex and the related programs
97find_program(LATEX_COMPILER
98  NAMES latex
99  PATHS ${MIKTEX_BINARY_PATH}
100        /usr/bin
101)
102
103# find pdflatex
104find_program(PDFLATEX_COMPILER
105  NAMES pdflatex
106  PATHS ${MIKTEX_BINARY_PATH}
107        /usr/bin
108)
109if (PDFLATEX_COMPILER)
110  set(LATEX_PDFLATEX_FOUND TRUE)
111else()
112  set(LATEX_PDFLATEX_FOUND FALSE)
113endif()
114
115# find xelatex
116find_program(XELATEX_COMPILER
117  NAMES xelatex
118  PATHS ${MIKTEX_BINARY_PATH}
119        /usr/bin
120)
121if (XELATEX_COMPILER)
122  set(LATEX_XELATEX_FOUND TRUE)
123else()
124  set(LATEX_XELATEX_FOUND FALSE)
125endif()
126
127# find lualatex
128find_program(LUALATEX_COMPILER
129  NAMES lualatex
130  PATHS ${MIKTEX_BINARY_PATH}
131        /usr/bin
132)
133if (LUALATEX_COMPILER)
134  set(LATEX_LUALATEX_FOUND TRUE)
135else()
136  set(LATEX_LUALATEX_FOUND FALSE)
137endif()
138
139# find bibtex
140find_program(BIBTEX_COMPILER
141  NAMES bibtex
142  PATHS ${MIKTEX_BINARY_PATH}
143        /usr/bin
144)
145if (BIBTEX_COMPILER)
146  set(LATEX_BIBTEX_FOUND TRUE)
147else()
148  set(LATEX_BIBTEX_FOUND FALSE)
149endif()
150
151# find biber
152find_program(BIBER_COMPILER
153  NAMES biber
154  PATHS ${MIKTEX_BINARY_PATH}
155        /usr/bin
156)
157if (BIBER_COMPILER)
158  set(LATEX_BIBER_FOUND TRUE)
159else()
160  set(LATEX_BIBER_FOUND FALSE)
161endif()
162
163# find makeindex
164find_program(MAKEINDEX_COMPILER
165  NAMES makeindex
166  PATHS ${MIKTEX_BINARY_PATH}
167        /usr/bin
168)
169if (MAKEINDEX_COMPILER)
170  set(LATEX_MAKEINDEX_FOUND TRUE)
171else()
172  set(LATEX_MAKEINDEX_FOUND FALSE)
173endif()
174
175# find xindy
176find_program(XINDY_COMPILER
177  NAMES xindy
178  PATHS ${MIKTEX_BINARY_PATH}
179        /usr/bin
180)
181if (XINDY_COMPILER)
182  set(LATEX_XINDY_FOUND TRUE)
183else()
184  set(LATEX_XINDY_FOUND FALSE)
185endif()
186
187# find dvips
188find_program(DVIPS_CONVERTER
189  NAMES dvips
190  PATHS ${MIKTEX_BINARY_PATH}
191        /usr/bin
192)
193if (DVIPS_CONVERTER)
194  set(LATEX_DVIPS_FOUND TRUE)
195else()
196  set(LATEX_DVIPS_FOUND FALSE)
197endif()
198
199# find dvipdf
200find_program(DVIPDF_CONVERTER
201  NAMES dvipdfm dvipdft dvipdf
202  PATHS ${MIKTEX_BINARY_PATH}
203        /usr/bin
204)
205if (DVIPDF_CONVERTER)
206  set(LATEX_DVIPDF_FOUND TRUE)
207else()
208  set(LATEX_DVIPDF_FOUND FALSE)
209endif()
210
211# find ps2pdf
212if (WIN32)
213  find_program(PS2PDF_CONVERTER
214    NAMES ps2pdf14.bat ps2pdf14 ps2pdf
215    PATHS ${GHOSTSCRIPT_LIBRARY_PATH}
216          ${MIKTEX_BINARY_PATH}
217  )
218else ()
219  find_program(PS2PDF_CONVERTER
220    NAMES ps2pdf14 ps2pdf
221  )
222endif ()
223if (PS2PDF_CONVERTER)
224  set(LATEX_PS2PDF_FOUND TRUE)
225else()
226  set(LATEX_PS2PDF_FOUND FALSE)
227endif()
228
229# find pdftops
230find_program(PDFTOPS_CONVERTER
231  NAMES pdftops
232  PATHS ${MIKTEX_BINARY_PATH}
233        /usr/bin
234)
235if (PDFTOPS_CONVERTER)
236  set(LATEX_PDFTOPS_FOUND TRUE)
237else()
238  set(LATEX_PDFTOPS_FOUND FALSE)
239endif()
240
241# find latex2html
242find_program(LATEX2HTML_CONVERTER
243  NAMES latex2html
244  PATHS ${MIKTEX_BINARY_PATH}
245        /usr/bin
246)
247if (LATEX2HTML_CONVERTER)
248  set(LATEX_LATEX2HTML_FOUND TRUE)
249else()
250  set(LATEX_LATEX2HTML_FOUND FALSE)
251endif()
252
253# find htlatex
254find_program(HTLATEX_COMPILER
255  NAMES htlatex
256  PATHS ${MIKTEX_BINARY_PATH}
257        /usr/bin
258)
259if (HTLATEX_COMPILER)
260  set(LATEX_HTLATEX_FOUND TRUE)
261else()
262  set(LATEX_HTLATEX_FOUND FALSE)
263endif()
264
265
266mark_as_advanced(
267  LATEX_COMPILER
268  PDFLATEX_COMPILER
269  XELATEX_COMPILER
270  LUALATEX_COMPILER
271  BIBTEX_COMPILER
272  BIBER_COMPILER
273  MAKEINDEX_COMPILER
274  XINDY_COMPILER
275  DVIPS_CONVERTER
276  DVIPDF_CONVERTER
277  PS2PDF_CONVERTER
278  PDFTOPS_CONVERTER
279  LATEX2HTML_CONVERTER
280  HTLATEX_COMPILER
281)
282
283include(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake)
284find_package_handle_standard_args(LATEX
285  REQUIRED_VARS LATEX_COMPILER
286  HANDLE_COMPONENTS
287)
288