1# File: UseLATEX.cmake 2# CMAKE commands to actually use the LaTeX compiler 3# Version: 1.7.3 4# Author: Kenneth Moreland (kmorel at sandia dot gov) 5# 6# Copyright 2004 Sandia Corporation. 7# Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive 8# license for use of this work by or on behalf of the 9# U.S. Government. Redistribution and use in source and binary forms, with 10# or without modification, are permitted provided that this Notice and any 11# statement of authorship are reproduced on all copies. 12# 13# The following MACROS are defined: 14# 15# ADD_LATEX_DOCUMENT(<tex_file> 16# [BIBFILES <bib_files>] 17# [INPUTS <input_tex_files>] 18# [IMAGE_DIRS] <image_directories> 19# [IMAGES] <image_files> 20# [CONFIGURE] <tex_files> 21# [DEPENDS] <tex_files> 22# [USE_INDEX] [USE_GLOSSARY] 23# [DEFAULT_PDF] [MANGLE_TARGET_NAMES]) 24# Adds targets that compile <tex_file>. The latex output is placed 25# in LATEX_OUTPUT_PATH or CMAKE_CURRENT_BINARY_DIR if the former is 26# not set. The latex program is picky about where files are located, 27# so all input files are copied from the source directory to the 28# output directory. This includes the target tex file, any tex file 29# listed with the INPUTS option, the bibliography files listed with 30# the BIBFILES option, and any .cls, .bst, and .clo files found in 31# the current source directory. Images found in the IMAGE_DIRS 32# directories or listed by IMAGES are also copied to the output 33# directory and coverted to an appropriate format if necessary. Any 34# tex files also listed with the CONFIGURE option are also processed 35# with the CMake CONFIGURE_FILE command (with the @ONLY flag. Any 36# file listed in CONFIGURE but not the target tex file or listed with 37# INPUTS has no effect. DEPENDS can be used to specify generated files 38# that are needed to compile the latex target. 39# 40# The following targets are made: 41# dvi: Makes <name>.dvi 42# pdf: Makes <name>.pdf using pdflatex. 43# safepdf: Makes <name>.pdf using ps2pdf. If using the default 44# program arguments, this will ensure all fonts are 45# embedded and no lossy compression has been performed 46# on images. 47# ps: Makes <name>.ps 48# html: Makes <name>.html 49# auxclean: Deletes <name>.aux. This is sometimes necessary 50# if a LaTeX error occurs and writes a bad aux file. 51# 52# The dvi target is added to the ALL. That is, it will be the target 53# built by default. If the DEFAULT_PDF argument is given, then the 54# pdf target will be the default instead of dvi. 55# 56# If the argument MANGLE_TARGET_NAMES is given, then each of the 57# target names above will be mangled with the <tex_file> name. This 58# is to make the targets unique if ADD_LATEX_DOCUMENT is called for 59# multiple documents. If the argument USE_INDEX is given, then 60# commands to build an index are made. If the argument USE_GLOSSARY 61# is given, then commands to build a glossary are made. 62# 63# History: 64# 65# 1.7.3 Fix some issues with interactions between makeglossaries and bibtex 66# (thanks to Mark de Wever). 67# 68# 1.7.2 Use ps2pdf to convert eps to pdf to get around the problem with 69# ImageMagick dropping the bounding box (thanks to Lukasz Lis). 70# 71# 1.7.1 Fixed some dependency issues. 72# 73# 1.7.0 Added DEPENDS options (thanks to Theodore Papadopoulo). 74# 75# 1.6.1 Ported the makeglossaries command to CMake and embedded the port 76# into UseLATEX.cmake. 77# 78# 1.6.0 Allow the use of the makeglossaries command. Thanks to Oystein 79# S. Haaland for the patch. 80# 81# 1.5.0 Allow any type of file in the INPUTS lists, not just tex file 82# (suggested by Eric Noulard). As a consequence, the ability to 83# specify tex files without the .tex extension is removed. The removed 84# function is of dubious value anyway. 85# 86# When copying input files, skip over any file that exists in the 87# binary directory but does not exist in the source directory with the 88# assumption that these files were added by some other mechanism. I 89# find this useful when creating large documents with multiple 90# chapters that I want to build separately (for speed) as I work on 91# them. I use the same boilerplate as the starting point for all 92# and just copy it with different configurations. This was what the 93# separate ADD_LATEX_DOCUMENT method was supposed to originally be for. 94# Since its external use is pretty much deprecated, I removed that 95# documentation. 96# 97# 1.4.1 Copy .sty files along with the other class and package files. 98# 99# 1.4.0 Added a MANGLE_TARGET_NAMES option that will mangle the target names. 100# 101# Fixed problem with copying bib files that became apparent with 102# CMake 2.4. 103# 104# 1.3.0 Added a LATEX_OUTPUT_PATH variable that allows you or the user to 105# specify where the built latex documents to go. This is especially 106# handy if you want to do in-source builds. 107# 108# Removed the ADD_LATEX_IMAGES macro and absorbed the functionality 109# into ADD_LATEX_DOCUMENT. The old interface was always kind of 110# clunky anyway since you had to specify the image directory in both 111# places. It also made supporting LATEX_OUTPUT_PATH problematic. 112# 113# Added support for jpeg files. 114# 115# 1.2.0 Changed the configuration options yet again. Removed the NO_CONFIGURE 116# Replaced it with a CONFIGURE option that lists input files for which 117# configure should be run. 118# 119# The pdf target no longer depends on the dvi target. This allows you 120# to build latex documents that require pdflatex. Also added an option 121# to make the pdf target the default one. 122# 123# 1.1.1 Added the NO_CONFIGURE option. The @ character can be used when 124# specifying table column separators. If two or more are used, then 125# will incorrectly substitute them. 126# 127# 1.1.0 Added ability include multiple bib files. Added ability to do copy 128# sub-tex files for multipart tex files. 129# 130# 1.0.0 If both ps and pdf type images exist, just copy the one that 131# matches the current render mode. Replaced a bunch of STRING 132# commands with GET_FILENAME_COMPONENT commands that were made to do 133# the desired function. 134# 135# 0.4.0 First version posted to CMake Wiki. 136# 137 138############################################################################# 139# Find the location of myself while originally executing. If you do this 140# inside of a macro, it will recode where the macro was invoked. 141############################################################################# 142SET(LATEX_USE_LATEX_LOCATION ${CMAKE_CURRENT_LIST_FILE} 143 CACHE INTERNAL "Location of UseLATEX.cmake file." FORCE 144 ) 145 146############################################################################# 147# Generic helper macros 148############################################################################# 149 150# Helpful list macros. 151MACRO(LATEX_CAR var) 152 SET(${var} ${ARGV1}) 153ENDMACRO(LATEX_CAR) 154MACRO(LATEX_CDR var junk) 155 SET(${var} ${ARGN}) 156ENDMACRO(LATEX_CDR) 157 158MACRO(LATEX_LIST_CONTAINS var value) 159 SET(${var}) 160 FOREACH (value2 ${ARGN}) 161 IF (${value} STREQUAL ${value2}) 162 SET(${var} TRUE) 163 ENDIF (${value} STREQUAL ${value2}) 164 ENDFOREACH (value2) 165ENDMACRO(LATEX_LIST_CONTAINS) 166 167# Parse macro arguments. 168MACRO(LATEX_PARSE_ARGUMENTS prefix arg_names option_names) 169 SET(DEFAULT_ARGS) 170 FOREACH(arg_name ${arg_names}) 171 SET(${prefix}_${arg_name}) 172 ENDFOREACH(arg_name) 173 FOREACH(option ${option_names}) 174 SET(${prefix}_${option}) 175 ENDFOREACH(option) 176 177 SET(current_arg_name DEFAULT_ARGS) 178 SET(current_arg_list) 179 FOREACH(arg ${ARGN}) 180 LATEX_LIST_CONTAINS(is_arg_name ${arg} ${arg_names}) 181 IF (is_arg_name) 182 SET(${prefix}_${current_arg_name} ${current_arg_list}) 183 SET(current_arg_name ${arg}) 184 SET(current_arg_list) 185 ELSE (is_arg_name) 186 LATEX_LIST_CONTAINS(is_option ${arg} ${option_names}) 187 IF (is_option) 188 SET(${prefix}_${arg} TRUE) 189 ELSE (is_option) 190 SET(current_arg_list ${current_arg_list} ${arg}) 191 ENDIF (is_option) 192 ENDIF (is_arg_name) 193 ENDFOREACH(arg) 194 SET(${prefix}_${current_arg_name} ${current_arg_list}) 195ENDMACRO(LATEX_PARSE_ARGUMENTS) 196 197# Match the contents of a file to a regular expression. 198MACRO(LATEX_FILE_MATCH variable filename regexp default) 199 # The FILE STRINGS command would be a bit better, but it's not supported on 200 # older versions of CMake. 201 FILE(READ ${filename} file_contents) 202 STRING(REGEX MATCHALL "${regexp}" 203 ${variable} ${file_contents} 204 ) 205 IF (NOT ${variable}) 206 SET(${variable} "${default}") 207 ENDIF (NOT ${variable}) 208ENDMACRO(LATEX_FILE_MATCH) 209 210############################################################################# 211# Macros that perform processing during a LaTeX build. 212############################################################################# 213MACRO(LATEX_MAKEGLOSSARIES) 214 MESSAGE("**************************** In makeglossaries") 215 IF (NOT LATEX_TARGET) 216 MESSAGE(SEND_ERROR "Need to define LATEX_TARGET") 217 ENDIF (NOT LATEX_TARGET) 218 219 IF (NOT MAKEINDEX_COMPILER) 220 MESSAGE(SEND_ERROR "Need to define MAKEINDEX_COMPILER") 221 ENDIF (NOT MAKEINDEX_COMPILER) 222 223 SET(aux_file ${LATEX_TARGET}.aux) 224 225 IF (NOT EXISTS ${aux_file}) 226 MESSAGE(SEND_ERROR "${aux_file} does not exist. Run latex on your target file.") 227 ENDIF (NOT EXISTS ${aux_file}) 228 229 LATEX_FILE_MATCH(newglossary_lines ${aux_file} 230 "@newglossary[ \t]*{([^}]*)}{([^}]*)}{([^}]*)}{([^}]*)}" 231 "@newglossary{main}{glg}{gls}{glo}" 232 ) 233 234 LATEX_FILE_MATCH(istfile_line ${aux_file} 235 "@istfilename[ \t]*{([^}]*)}" 236 "@istfilename{${LATEX_TARGET}.ist}" 237 ) 238 STRING(REGEX REPLACE "@istfilename[ \t]*{([^}]*)}" "\\1" 239 istfile ${istfile_line} 240 ) 241 242 FOREACH(newglossary ${newglossary_lines}) 243 STRING(REGEX REPLACE 244 "@newglossary[ \t]*{([^}]*)}{([^}]*)}{([^}]*)}{([^}]*)}" 245 "\\1" glossary_name ${newglossary} 246 ) 247 STRING(REGEX REPLACE 248 "@newglossary[ \t]*{([^}]*)}{([^}]*)}{([^}]*)}{([^}]*)}" 249 "${LATEX_TARGET}.\\2" glossary_log ${newglossary} 250 ) 251 STRING(REGEX REPLACE 252 "@newglossary[ \t]*{([^}]*)}{([^}]*)}{([^}]*)}{([^}]*)}" 253 "${LATEX_TARGET}.\\3" glossary_out ${newglossary} 254 ) 255 STRING(REGEX REPLACE 256 "@newglossary[ \t]*{([^}]*)}{([^}]*)}{([^}]*)}{([^}]*)}" 257 "${LATEX_TARGET}.\\4" glossary_in ${newglossary} 258 ) 259 MESSAGE("${MAKEINDEX_COMPILER} ${MAKEGLOSSARIES_COMPILER_FLAGS} -s ${istfile} -t ${glossary_log} -o ${glossary_out} ${glossary_in}") 260 EXEC_PROGRAM(${MAKEINDEX_COMPILER} ARGS ${MAKEGLOSSARIES_COMPILER_FLAGS} 261 -s ${istfile} -t ${glossary_log} -o ${glossary_out} ${glossary_in} 262 ) 263 ENDFOREACH(newglossary) 264ENDMACRO(LATEX_MAKEGLOSSARIES) 265 266############################################################################# 267# Helper macros for establishing LaTeX build. 268############################################################################# 269 270MACRO(LATEX_NEEDIT VAR NAME) 271 IF (NOT ${VAR}) 272 MESSAGE(SEND_ERROR "I need the ${NAME} command.") 273 ENDIF(NOT ${VAR}) 274ENDMACRO(LATEX_NEEDIT) 275 276MACRO(LATEX_WANTIT VAR NAME) 277 IF (NOT ${VAR}) 278 MESSAGE(STATUS "I could not find the ${NAME} command.") 279 ENDIF(NOT ${VAR}) 280ENDMACRO(LATEX_WANTIT) 281 282MACRO(LATEX_SETUP_VARIABLES) 283 SET(LATEX_OUTPUT_PATH "${LATEX_OUTPUT_PATH}" 284 CACHE PATH "If non empty, specifies the location to place LaTeX output." 285 ) 286 287 FIND_PACKAGE(LATEX) 288 289 MARK_AS_ADVANCED(CLEAR 290 LATEX_COMPILER 291 PDFLATEX_COMPILER 292 BIBTEX_COMPILER 293 MAKEINDEX_COMPILER 294 DVIPS_CONVERTER 295 PS2PDF_CONVERTER 296 LATEX2HTML_CONVERTER 297 ) 298 299 LATEX_NEEDIT(LATEX_COMPILER latex) 300 LATEX_WANTIT(PDFLATEX_COMPILER pdflatex) 301 LATEX_NEEDIT(BIBTEX_COMPILER bibtex) 302 LATEX_NEEDIT(MAKEINDEX_COMPILER makeindex) 303 LATEX_WANTIT(DVIPS_CONVERTER dvips) 304 LATEX_WANTIT(PS2PDF_CONVERTER ps2pdf) 305 LATEX_WANTIT(LATEX2HTML_CONVERTER latex2html) 306 307 SET(LATEX_COMPILER_FLAGS "-interaction=batchmode" 308 CACHE STRING "Flags passed to latex.") 309 SET(PDFLATEX_COMPILER_FLAGS ${LATEX_COMPILER_FLAGS} 310 CACHE STRING "Flags passed to pdflatex.") 311 SET(BIBTEX_COMPILER_FLAGS "" 312 CACHE STRING "Flags passed to bibtex.") 313 SET(MAKEINDEX_COMPILER_FLAGS "" 314 CACHE STRING "Flags passed to makeindex.") 315 SET(MAKEGLOSSARIES_COMPILER_FLAGS "" 316 CACHE STRING "Flags passed to makeglossaries.") 317 SET(DVIPS_CONVERTER_FLAGS "-Ppdf -G0 -t letter" 318 CACHE STRING "Flags passed to dvips.") 319 SET(PS2PDF_CONVERTER_FLAGS "-dMaxSubsetPct=100 -dCompatibilityLevel=1.3 -dSubsetFonts=true -dEmbedAllFonts=true -dAutoFilterColorImages=false -dAutoFilterGrayImages=false -dColorImageFilter=/FlateEncode -dGrayImageFilter=/FlateEncode -dMonoImageFilter=/FlateEncode" 320 CACHE STRING "Flags passed to ps2pdf.") 321 SET(LATEX2HTML_CONVERTER_FLAGS "" 322 CACHE STRING "Flags passed to latex2html.") 323 MARK_AS_ADVANCED( 324 LATEX_COMPILER_FLAGS 325 PDFLATEX_COMPILER_FLAGS 326 BIBTEX_COMPILER_FLAGS 327 MAKEINDEX_COMPILER_FLAGS 328 MAKEGLOSSARIES_COMPILER_FLAGS 329 DVIPS_CONVERTER_FLAGS 330 PS2PDF_CONVERTER_FLAGS 331 LATEX2HTML_CONVERTER_FLAGS 332 ) 333 SEPARATE_ARGUMENTS(LATEX_COMPILER_FLAGS) 334 SEPARATE_ARGUMENTS(PDFLATEX_COMPILER_FLAGS) 335 SEPARATE_ARGUMENTS(BIBTEX_COMPILER_FLAGS) 336 SEPARATE_ARGUMENTS(MAKEINDEX_COMPILER_FLAGS) 337 SEPARATE_ARGUMENTS(MAKEGLOSSARIES_COMPILER_FLAGS) 338 SEPARATE_ARGUMENTS(DVIPS_CONVERTER_FLAGS) 339 SEPARATE_ARGUMENTS(PS2PDF_CONVERTER_FLAGS) 340 SEPARATE_ARGUMENTS(LATEX2HTML_CONVERTER_FLAGS) 341 342 FIND_PROGRAM(IMAGEMAGICK_CONVERT convert 343 DOC "The convert program that comes with ImageMagick (available at http://www.imagemagick.org)." 344 ) 345 346 OPTION(LATEX_SMALL_IMAGES 347 "If on, the raster images will be converted to 1/6 the original size. This is because papers usually require 600 dpi images whereas most monitors only require at most 96 dpi. Thus, smaller images make smaller files for web distributation and can make it faster to read dvi files." 348 OFF) 349 IF (LATEX_SMALL_IMAGES) 350 SET(LATEX_RASTER_SCALE 16) 351 SET(LATEX_OPPOSITE_RASTER_SCALE 100) 352 ELSE (LATEX_SMALL_IMAGES) 353 SET(LATEX_RASTER_SCALE 100) 354 SET(LATEX_OPPOSITE_RASTER_SCALE 16) 355 ENDIF (LATEX_SMALL_IMAGES) 356 357 # Just holds extensions for known image types. They should all be lower case. 358 SET(LATEX_DVI_VECTOR_IMAGE_EXTENSIONS .eps) 359 SET(LATEX_DVI_RASTER_IMAGE_EXTENSIONS) 360 SET(LATEX_DVI_IMAGE_EXTENSIONS 361 ${LATEX_DVI_VECTOR_IMAGE_EXTENSIONS} ${LATEX_DVI_RASTER_IMAGE_EXTENSIONS}) 362 SET(LATEX_PDF_VECTOR_IMAGE_EXTENSIONS .pdf) 363 SET(LATEX_PDF_RASTER_IMAGE_EXTENSIONS .png .jpeg .jpg) 364 SET(LATEX_PDF_IMAGE_EXTENSIONS 365 ${LATEX_PDF_VECTOR_IMAGE_EXTENSIONS} ${LATEX_PDF_RASTER_IMAGE_EXTENSIONS}) 366 SET(LATEX_IMAGE_EXTENSIONS 367 ${LATEX_DVI_IMAGE_EXTENSIONS} ${LATEX_PDF_IMAGE_EXTENSIONS}) 368ENDMACRO(LATEX_SETUP_VARIABLES) 369 370MACRO(LATEX_GET_OUTPUT_PATH var) 371 SET(${var}) 372 IF (LATEX_OUTPUT_PATH) 373 IF ("${LATEX_OUTPUT_PATH}" STREQUAL "${CMAKE_CURRENT_SOURCE_DIR}") 374 MESSAGE(SEND_ERROR "You cannot set LATEX_OUTPUT_PATH to the same directory that contains LaTeX input files.") 375 ELSE ("${LATEX_OUTPUT_PATH}" STREQUAL "${CMAKE_CURRENT_SOURCE_DIR}") 376 SET(${var} "${LATEX_OUTPUT_PATH}") 377 ENDIF ("${LATEX_OUTPUT_PATH}" STREQUAL "${CMAKE_CURRENT_SOURCE_DIR}") 378 ELSE (LATEX_OUTPUT_PATH) 379 IF ("${CMAKE_CURRENT_BINARY_DIR}" STREQUAL "${CMAKE_CURRENT_SOURCE_DIR}") 380 MESSAGE(SEND_ERROR "LaTeX files must be built out of source or you must set LATEX_OUTPUT_PATH.") 381 ELSE ("${CMAKE_CURRENT_BINARY_DIR}" STREQUAL "${CMAKE_CURRENT_SOURCE_DIR}") 382 SET(${var} "${CMAKE_CURRENT_BINARY_DIR}") 383 ENDIF ("${CMAKE_CURRENT_BINARY_DIR}" STREQUAL "${CMAKE_CURRENT_SOURCE_DIR}") 384 ENDIF (LATEX_OUTPUT_PATH) 385ENDMACRO(LATEX_GET_OUTPUT_PATH) 386 387MACRO(LATEX_ADD_CONVERT_COMMAND output_path input_path output_extension 388 input_extension flags) 389 SET (converter ${IMAGEMAGICK_CONVERT}) 390 SET (convert_flags "") 391 # ImageMagick has broken eps to pdf conversion 392 # use ps2pdf instead 393 IF (${input_extension} STREQUAL ".eps" AND ${output_extension} STREQUAL ".pdf") 394 IF (PS2PDF_CONVERTER) 395 SET (converter ${PS2PDF_CONVERTER}) 396 SET (convert_flags "-dEPSCrop ${flags}") 397 ELSE (PS2PDF_CONVERTER) 398 MESSAGE(SEND_ERROR "Using postscript files with pdflatex requires ps2pdf for conversion.") 399 ENDIF (PS2PDF_CONVERTER) 400 ELSE (${input_extension} STREQUAL ".eps" AND ${output_extension} STREQUAL ".pdf") 401 SET (convert_flags ${flags}) 402 ENDIF (${input_extension} STREQUAL ".eps" AND ${output_extension} STREQUAL ".pdf") 403 404 ADD_CUSTOM_COMMAND(OUTPUT ${output_path} 405 COMMAND ${converter} 406 ARGS ${convert_flags} ${input_path} ${output_path} 407 DEPENDS ${input_path} 408 ) 409ENDMACRO(LATEX_ADD_CONVERT_COMMAND) 410 411# Makes custom commands to convert a file to a particular type. 412MACRO(LATEX_CONVERT_IMAGE output_files input_file output_extension convert_flags 413 output_extensions other_files) 414 SET(input_dir ${CMAKE_CURRENT_SOURCE_DIR}) 415 LATEX_GET_OUTPUT_PATH(output_dir) 416 417 GET_FILENAME_COMPONENT(extension "${input_file}" EXT) 418 419 STRING(REGEX REPLACE "\\.[^.]*\$" ${output_extension} output_file 420 "${input_file}") 421 422 LATEX_LIST_CONTAINS(is_type ${extension} ${output_extensions}) 423 IF (is_type) 424 IF (convert_flags) 425 LATEX_ADD_CONVERT_COMMAND(${output_dir}/${output_file} 426 ${input_dir}/${input_file} ${output_extension} ${extension} 427 "${convert_flags}") 428 SET(${output_files} ${${output_files}} ${output_dir}/${output_file}) 429 ELSE (convert_flags) 430 # As a shortcut, we can just copy the file. 431 ADD_CUSTOM_COMMAND(OUTPUT ${output_dir}/${input_file} 432 COMMAND ${CMAKE_COMMAND} 433 ARGS -E copy ${input_dir}/${input_file} ${output_dir}/${input_file} 434 DEPENDS ${input_dir}/${input_file} 435 ) 436 SET(${output_files} ${${output_files}} ${output_dir}/${input_file}) 437 ENDIF (convert_flags) 438 ELSE (is_type) 439 SET(do_convert TRUE) 440 # Check to see if there is another input file of the appropriate type. 441 FOREACH(valid_extension ${output_extensions}) 442 STRING(REGEX REPLACE "\\.[^.]*\$" ${output_extension} try_file 443 "${input_file}") 444 LATEX_LIST_CONTAINS(has_native_file "${try_file}" ${other_files}) 445 IF (has_native_file) 446 SET(do_convert FALSE) 447 ENDIF (has_native_file) 448 ENDFOREACH(valid_extension) 449 450 # If we still need to convert, do it. 451 IF (do_convert) 452 LATEX_ADD_CONVERT_COMMAND(${output_dir}/${output_file} 453 ${input_dir}/${input_file} ${output_extension} ${extension} 454 "${convert_flags}") 455 SET(${output_files} ${${output_files}} ${output_dir}/${output_file}) 456 ENDIF (do_convert) 457 ENDIF (is_type) 458ENDMACRO(LATEX_CONVERT_IMAGE) 459 460# Adds custom commands to process the given files for dvi and pdf builds. 461# Adds the output files to the given variables (does not replace). 462MACRO(LATEX_PROCESS_IMAGES dvi_outputs pdf_outputs) 463 LATEX_GET_OUTPUT_PATH(output_dir) 464 FOREACH(file ${ARGN}) 465 IF (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${file}") 466 GET_FILENAME_COMPONENT(extension "${file}" EXT) 467 SET(convert_flags) 468 469 # Check to see if we need to downsample the image. 470 LATEX_LIST_CONTAINS(is_raster extension 471 ${LATEX_DVI_RASTER_IMAGE_EXTENSIONS} 472 ${LATEX_PDF_RASTER_IMAGE_EXTENSIONS}) 473 IF (LATEX_SMALL_IMAGES) 474 IF (is_raster) 475 SET(convert_flags -resize ${LATEX_RASTER_SCALE}%) 476 ENDIF (is_raster) 477 ENDIF (LATEX_SMALL_IMAGES) 478 479 # Make sure the output directory exists. 480 GET_FILENAME_COMPONENT(path "${output_dir}/${file}" PATH) 481 MAKE_DIRECTORY("${path}") 482 483 # Do conversions for dvi. 484 LATEX_CONVERT_IMAGE(${dvi_outputs} "${file}" .eps "${convert_flags}" 485 "${LATEX_DVI_IMAGE_EXTENSIONS}" "${ARGN}") 486 487 # Do conversions for pdf. 488 IF (is_raster) 489 LATEX_CONVERT_IMAGE(${pdf_outputs} "${file}" .png "${convert_flags}" 490 "${LATEX_PDF_IMAGE_EXTENSIONS}" "${ARGN}") 491 ELSE (is_raster) 492 LATEX_CONVERT_IMAGE(${pdf_outputs} "${file}" .pdf "${convert_flags}" 493 "${LATEX_PDF_IMAGE_EXTENSIONS}" "${ARGN}") 494 ENDIF (is_raster) 495 ELSE (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${file}") 496 MESSAGE("Could not find file \"${CMAKE_CURRENT_SOURCE_DIR}/${file}\"") 497 ENDIF (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${file}") 498 ENDFOREACH(file) 499ENDMACRO(LATEX_PROCESS_IMAGES) 500 501MACRO(ADD_LATEX_IMAGES) 502 MESSAGE("The ADD_LATEX_IMAGES macro is deprecated. Image directories are specified with LATEX_ADD_DOCUMENT.") 503ENDMACRO(ADD_LATEX_IMAGES) 504 505MACRO(LATEX_COPY_GLOBBED_FILES pattern dest) 506 FILE(GLOB file_list ${pattern}) 507 FOREACH(in_file ${file_list}) 508 GET_FILENAME_COMPONENT(out_file ${in_file} NAME) 509 CONFIGURE_FILE(${in_file} ${dest}/${out_file} COPYONLY) 510 ENDFOREACH(in_file) 511ENDMACRO(LATEX_COPY_GLOBBED_FILES) 512 513MACRO(LATEX_COPY_INPUT_FILE file) 514 LATEX_GET_OUTPUT_PATH(output_dir) 515 516 IF (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${file}) 517 GET_FILENAME_COMPONENT(path ${file} PATH) 518 FILE(MAKE_DIRECTORY ${output_dir}/${path}) 519 520 LATEX_LIST_CONTAINS(use_config ${file} ${LATEX_CONFIGURE}) 521 IF (use_config) 522 CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/${file} 523 ${output_dir}/${file} 524 @ONLY 525 ) 526 ADD_CUSTOM_COMMAND(OUTPUT ${output_dir}/${file} 527 COMMAND ${CMAKE_COMMAND} 528 ARGS ${CMAKE_BINARY_DIR} 529 DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${file} 530 ) 531 ELSE (use_config) 532 ADD_CUSTOM_COMMAND(OUTPUT ${output_dir}/${file} 533 COMMAND ${CMAKE_COMMAND} 534 ARGS -E copy ${CMAKE_CURRENT_SOURCE_DIR}/${file} ${output_dir}/${file} 535 DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${file} 536 ) 537 ENDIF (use_config) 538 ELSE (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${file}) 539 IF (EXISTS ${output_dir}/${file}) 540 # Special case: output exists but input does not. Assume that it was 541 # created elsewhere and skip the input file copy. 542 ELSE (EXISTS ${output_dir}/${file}) 543 MESSAGE("Could not find input file ${CMAKE_CURRENT_SOURCE_DIR}/${file}") 544 ENDIF (EXISTS ${output_dir}/${file}) 545 ENDIF (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${file}) 546ENDMACRO(LATEX_COPY_INPUT_FILE) 547 548############################################################################# 549# Commands provided by the UseLATEX.cmake "package" 550############################################################################# 551 552MACRO(LATEX_USAGE command message) 553 MESSAGE(SEND_ERROR 554 "${message}\nUsage: ${command}(<tex_file>\n [BIBFILES <bib_file> <bib_file> ...]\n [INPUTS <tex_file> <tex_file> ...]\n [IMAGE_DIRS <directory1> <directory2> ...]\n [IMAGES <image_file1> <image_file2>\n [CONFIGURE <tex_file> <tex_file> ...]\n [DEPENDS <tex_file> <tex_file> ...]\n [USE_INDEX] [USE_GLOSSARY] [DEFAULT_PDF] [MANGLE_TARGET_NAMES])" 555 ) 556ENDMACRO(LATEX_USAGE command message) 557 558# Parses arguments to ADD_LATEX_DOCUMENT and ADD_LATEX_TARGETS and sets the 559# variables LATEX_TARGET, LATEX_IMAGE_DIR, LATEX_BIBFILES, LATEX_DEPENDS, and 560# LATEX_INPUTS. 561MACRO(PARSE_ADD_LATEX_ARGUMENTS command) 562 LATEX_PARSE_ARGUMENTS( 563 LATEX 564 "BIBFILES;INPUTS;IMAGE_DIRS;IMAGES;CONFIGURE;DEPENDS" 565 "USE_INDEX;USE_GLOSSARY;USE_GLOSSARIES;DEFAULT_PDF;MANGLE_TARGET_NAMES" 566 ${ARGN} 567 ) 568 569 # The first argument is the target latex file. 570 IF (LATEX_DEFAULT_ARGS) 571 LATEX_CAR(LATEX_MAIN_INPUT ${LATEX_DEFAULT_ARGS}) 572 LATEX_CDR(LATEX_DEFAULT_ARGS ${LATEX_DEFAULT_ARGS}) 573 GET_FILENAME_COMPONENT(LATEX_TARGET ${LATEX_MAIN_INPUT} NAME_WE) 574 ELSE (LATEX_DEFAULT_ARGS) 575 LATEX_USAGE(${command} "No tex file target given to ${command}.") 576 ENDIF (LATEX_DEFAULT_ARGS) 577 578 IF (LATEX_DEFAULT_ARGS) 579 LATEX_USAGE(${command} "Invalid or depricated arguments: ${LATEX_DEFAULT_ARGS}") 580 ENDIF (LATEX_DEFAULT_ARGS) 581 582 # Backward compatibility between 1.6.0 and 1.6.1. 583 IF (LATEX_USE_GLOSSARIES) 584 SET(LATEX_USE_GLOSSARY TRUE) 585 ENDIF (LATEX_USE_GLOSSARIES) 586ENDMACRO(PARSE_ADD_LATEX_ARGUMENTS) 587 588MACRO(ADD_LATEX_TARGETS) 589 LATEX_GET_OUTPUT_PATH(output_dir) 590 PARSE_ADD_LATEX_ARGUMENTS(ADD_LATEX_TARGETS ${ARGV}) 591 592 # Set up target names. 593 IF (LATEX_MANGLE_TARGET_NAMES) 594 SET(dvi_target ${LATEX_TARGET}_dvi) 595 SET(pdf_target ${LATEX_TARGET}_pdf) 596 SET(ps_target ${LATEX_TARGET}_ps) 597 SET(safepdf_target ${LATEX_TARGET}_safepdf) 598 SET(html_target ${LATEX_TARGET}_html) 599 SET(auxclean_target ${LATEX_TARGET}_auxclean) 600 ELSE (LATEX_MANGLE_TARGET_NAMES) 601 SET(dvi_target dvi) 602 SET(pdf_target pdf) 603 SET(ps_target ps) 604 SET(safepdf_target safepdf) 605 SET(html_target html) 606 SET(auxclean_target auxclean) 607 ENDIF (LATEX_MANGLE_TARGET_NAMES) 608 609 # For each directory in LATEX_IMAGE_DIRS, glob all the image files and 610 # place them in LATEX_IMAGES. 611 FOREACH(dir ${LATEX_IMAGE_DIRS}) 612 FOREACH(extension ${LATEX_IMAGE_EXTENSIONS}) 613 FILE(GLOB files ${CMAKE_CURRENT_SOURCE_DIR}/${dir}/*${extension}) 614 FOREACH(file ${files}) 615 GET_FILENAME_COMPONENT(filename ${file} NAME) 616 SET(LATEX_IMAGES ${LATEX_IMAGES} ${dir}/${filename}) 617 ENDFOREACH(file) 618 ENDFOREACH(extension) 619 ENDFOREACH(dir) 620 621 SET(dvi_images) 622 SET(pdf_images) 623 LATEX_PROCESS_IMAGES(dvi_images pdf_images ${LATEX_IMAGES}) 624 625 SET(make_dvi_command 626 ${CMAKE_COMMAND} -E chdir ${output_dir} 627 ${LATEX_COMPILER} ${LATEX_COMPILER_FLAGS} ${LATEX_MAIN_INPUT}) 628 SET(make_pdf_command 629 ${CMAKE_COMMAND} -E chdir ${output_dir} 630 ${PDFLATEX_COMPILER} ${PDFLATEX_COMPILER_FLAGS} ${LATEX_MAIN_INPUT}) 631 632 SET(make_dvi_depends ${LATEX_DEPENDS} ${dvi_images}) 633 SET(make_pdf_depends ${LATEX_DEPENDS} ${pdf_images}) 634 FOREACH(input ${LATEX_MAIN_INPUT} ${LATEX_INPUTS}) 635 SET(make_dvi_depends ${make_dvi_depends} ${output_dir}/${input}) 636 SET(make_pdf_depends ${make_pdf_depends} ${output_dir}/${input}) 637 ENDFOREACH(input) 638 639 IF (LATEX_USE_GLOSSARY) 640 FOREACH(dummy 0 1) # Repeat these commands twice. 641 SET(make_dvi_command ${make_dvi_command} 642 COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir} 643 ${CMAKE_COMMAND} 644 -D LATEX_BUILD_COMMAND=makeglossaries 645 -D LATEX_TARGET=${LATEX_TARGET} 646 -D MAKEINDEX_COMPILER=${MAKEINDEX_COMPILER} 647 -D MAKEGLOSSARIES_COMPILER_FLAGS=${MAKEGLOSSARIES_COMPILER_FLAGS} 648 -P ${LATEX_USE_LATEX_LOCATION} 649 COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir} 650 ${LATEX_COMPILER} ${LATEX_COMPILER_FLAGS} ${LATEX_MAIN_INPUT} 651 ) 652 SET(make_pdf_command ${make_pdf_command} 653 COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir} 654 ${CMAKE_COMMAND} 655 -D LATEX_BUILD_COMMAND=makeglossaries 656 -D LATEX_TARGET=${LATEX_TARGET} 657 -D MAKEINDEX_COMPILER=${MAKEINDEX_COMPILER} 658 -D MAKEGLOSSARIES_COMPILER_FLAGS=${MAKEGLOSSARIES_COMPILER_FLAGS} 659 -P ${LATEX_USE_LATEX_LOCATION} 660 COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir} 661 ${PDFLATEX_COMPILER} ${PDFLATEX_COMPILER_FLAGS} ${LATEX_MAIN_INPUT} 662 ) 663 ENDFOREACH(dummy) 664 ENDIF (LATEX_USE_GLOSSARY) 665 666 IF (LATEX_BIBFILES) 667 SET(make_dvi_command ${make_dvi_command} 668 COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir} 669 ${BIBTEX_COMPILER} ${BIBTEX_COMPILER_FLAGS} ${LATEX_TARGET}) 670 SET(make_pdf_command ${make_pdf_command} 671 COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir} 672 ${BIBTEX_COMPILER} ${BIBTEX_COMPILER_FLAGS} ${LATEX_TARGET}) 673 FOREACH (bibfile ${LATEX_BIBFILES}) 674 SET(make_dvi_depends ${make_dvi_depends} ${output_dir}/${bibfile}) 675 SET(make_pdf_depends ${make_pdf_depends} ${output_dir}/${bibfile}) 676 ENDFOREACH (bibfile ${LATEX_BIBFILES}) 677 ENDIF (LATEX_BIBFILES) 678 679 IF (LATEX_USE_INDEX) 680 SET(make_dvi_command ${make_dvi_command} 681 COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir} 682 ${LATEX_COMPILER} ${LATEX_COMPILER_FLAGS} ${LATEX_MAIN_INPUT} 683 COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir} 684 ${MAKEINDEX_COMPILER} ${MAKEINDEX_COMPILER_FLAGS} ${LATEX_TARGET}.idx) 685 SET(make_pdf_command ${make_pdf_command} 686 COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir} 687 ${PDFLATEX_COMPILER} ${PDFLATEX_COMPILER_FLAGS} ${LATEX_MAIN_INPUT} 688 COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir} 689 ${MAKEINDEX_COMPILER} ${MAKEINDEX_COMPILER_FLAGS} ${LATEX_TARGET}.idx) 690 ENDIF (LATEX_USE_INDEX) 691 692 SET(make_dvi_command ${make_dvi_command} 693 COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir} 694 ${LATEX_COMPILER} ${LATEX_COMPILER_FLAGS} ${LATEX_MAIN_INPUT} 695 COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir} 696 ${LATEX_COMPILER} ${LATEX_COMPILER_FLAGS} ${LATEX_MAIN_INPUT}) 697 SET(make_pdf_command ${make_pdf_command} 698 COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir} 699 ${PDFLATEX_COMPILER} ${PDFLATEX_COMPILER_FLAGS} ${LATEX_MAIN_INPUT} 700 COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir} 701 ${PDFLATEX_COMPILER} ${PDFLATEX_COMPILER_FLAGS} ${LATEX_MAIN_INPUT}) 702 703 # Add commands and targets for building dvi outputs. 704 ADD_CUSTOM_COMMAND(OUTPUT ${output_dir}/${LATEX_TARGET}.dvi 705 COMMAND ${make_dvi_command} 706 DEPENDS ${make_dvi_depends} 707 ) 708 IF (LATEX_DEFAULT_PDF) 709 ADD_CUSTOM_TARGET(${dvi_target} 710 DEPENDS ${output_dir}/${LATEX_TARGET}.dvi) 711 ELSE (LATEX_DEFAULT_PDF) 712 ADD_CUSTOM_TARGET(${dvi_target} 713 DEPENDS ${output_dir}/${LATEX_TARGET}.dvi) 714 ENDIF (LATEX_DEFAULT_PDF) 715 716 # Add commands and targets for building pdf outputs (with pdflatex). 717 IF (PDFLATEX_COMPILER) 718 ADD_CUSTOM_COMMAND(OUTPUT ${output_dir}/${LATEX_TARGET}.pdf 719 COMMAND ${make_pdf_command} 720 DEPENDS ${make_pdf_depends} 721 ) 722 IF (LATEX_DEFAULT_PDF) 723 ADD_CUSTOM_TARGET(${pdf_target} 724 DEPENDS ${output_dir}/${LATEX_TARGET}.pdf) 725 ELSE (LATEX_DEFAULT_PDF) 726 ADD_CUSTOM_TARGET(${pdf_target} 727 DEPENDS ${output_dir}/${LATEX_TARGET}.pdf) 728 ENDIF (LATEX_DEFAULT_PDF) 729 ENDIF (PDFLATEX_COMPILER) 730 731 IF (DVIPS_CONVERTER) 732 ADD_CUSTOM_COMMAND(OUTPUT ${output_dir}/${LATEX_TARGET}.ps 733 COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir} 734 ${DVIPS_CONVERTER} ${DVIPS_CONVERTER_FLAGS} -o ${LATEX_TARGET}.ps ${LATEX_TARGET}.dvi 735 DEPENDS ${output_dir}/${LATEX_TARGET}.dvi) 736 ADD_CUSTOM_TARGET(${ps_target} 737 DEPENDS ${output_dir}/${LATEX_TARGET}.ps) 738 IF (PS2PDF_CONVERTER) 739 # Since both the pdf and safepdf targets have the same output, we 740 # cannot properly do the dependencies for both. When selecting safepdf, 741 # simply force a recompile every time. 742 ADD_CUSTOM_TARGET(${safepdf_target} 743 ${CMAKE_COMMAND} -E chdir ${output_dir} 744 ${PS2PDF_CONVERTER} ${PS2PDF_CONVERTER_FLAGS} ${LATEX_TARGET}.ps ${LATEX_TARGET}.pdf 745 ) 746 ADD_DEPENDENCIES(${safepdf_target} ${ps_target}) 747 ENDIF (PS2PDF_CONVERTER) 748 ENDIF (DVIPS_CONVERTER) 749 750 IF (LATEX2HTML_CONVERTER) 751 ADD_CUSTOM_TARGET(${html_target} 752 ${CMAKE_COMMAND} -E chdir ${output_dir} 753 ${LATEX2HTML_CONVERTER} ${LATEX2HTML_CONVERTER_FLAGS} ${LATEX_MAIN_INPUT} 754 ) 755 ADD_DEPENDENCIES(${html_target} ${LATEX_MAIN_INPUT} ${LATEX_INPUTS}) 756 ENDIF (LATEX2HTML_CONVERTER) 757 758 ADD_CUSTOM_TARGET(${auxclean_target} 759 ${CMAKE_COMMAND} -E remove ${output_dir}/${LATEX_TARGET}.aux ${output_dir}/${LATEX_TARGET}.idx ${output_dir}/${LATEX_TARGET}.ind 760 ) 761ENDMACRO(ADD_LATEX_TARGETS) 762 763MACRO(ADD_LATEX_DOCUMENT) 764 LATEX_GET_OUTPUT_PATH(output_dir) 765 IF (output_dir) 766 PARSE_ADD_LATEX_ARGUMENTS(ADD_LATEX_DOCUMENT ${ARGV}) 767 768 LATEX_COPY_INPUT_FILE(${LATEX_MAIN_INPUT}) 769 770 FOREACH (bib_file ${LATEX_BIBFILES}) 771 CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/${bib_file} 772 ${output_dir}/${bib_file} 773 COPYONLY) 774 ADD_CUSTOM_COMMAND(OUTPUT ${output_dir}/${bib_file} 775 COMMAND ${CMAKE_COMMAND} 776 ARGS -E copy ${CMAKE_CURRENT_SOURCE_DIR}/${bib_file} ${output_dir}/${bib_file} 777 DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${bib_file} 778 ) 779 ENDFOREACH (bib_file) 780 781 FOREACH (input ${LATEX_INPUTS}) 782 LATEX_COPY_INPUT_FILE(${input}) 783 ENDFOREACH(input) 784 785 LATEX_COPY_GLOBBED_FILES(${CMAKE_CURRENT_SOURCE_DIR}/*.cls ${output_dir}) 786 LATEX_COPY_GLOBBED_FILES(${CMAKE_CURRENT_SOURCE_DIR}/*.bst ${output_dir}) 787 LATEX_COPY_GLOBBED_FILES(${CMAKE_CURRENT_SOURCE_DIR}/*.clo ${output_dir}) 788 LATEX_COPY_GLOBBED_FILES(${CMAKE_CURRENT_SOURCE_DIR}/*.sty ${output_dir}) 789 790 ADD_LATEX_TARGETS(${ARGV}) 791 ENDIF (output_dir) 792ENDMACRO(ADD_LATEX_DOCUMENT) 793 794############################################################################# 795# Actually do stuff 796############################################################################# 797 798IF (LATEX_BUILD_COMMAND) 799 SET(command_handled) 800 801 IF ("${LATEX_BUILD_COMMAND}" STREQUAL makeglossaries) 802 LATEX_MAKEGLOSSARIES() 803 SET(command_handled TRUE) 804 ENDIF ("${LATEX_BUILD_COMMAND}" STREQUAL makeglossaries) 805 806 IF (NOT command_handled) 807 MESSAGE(SEND_ERROR "Unknown command: ${LATEX_BUILD_COMMAND}") 808 ENDIF (NOT command_handled) 809 810ELSE (LATEX_BUILD_COMMAND) 811 # Must be part of the actual configure (included from CMakeLists.txt). 812 LATEX_SETUP_VARIABLES() 813ENDIF (LATEX_BUILD_COMMAND) 814