1# File: UseLATEX.cmake 2# CMAKE commands to actually use the LaTeX compiler 3# Version massxpert-1.7.0.1, derived from version 1.7.0 by 4# Kenneth Moreland (kmorel at sandia dot gov) 5# (modified by Filippo Rusconi to remove unnecessary compulsory requirements 6# like imagemagick or dvips, for example) 7 8# Copyright 2004 Sandia Corporation, 2009 Filippo Rusconi <massxpert-maintainer@massxpert.org> 9# 10# The original version by Kenneth Moreland had this notice: 11# --- Begin Original Notice --- 12# Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive 13# license for use of this work by or on behalf of the 14# U.S. Government. Redistribution and use in source and binary forms, with 15# or without modification, are permitted provided that this Notice and any 16# statement of authorship are reproduced on all copies. 17# --- End Original Notice --- 18# 19# This applies to this version: 20# Redistribution and use in source and binary forms, with or without 21# modification, are permitted provided that this Notice and any 22# statement of authorship are reproduced on all copies. 23 24 25# The following MACROS are defined: 26# 27# ADD_LATEX_DOCUMENT(<tex_file> 28# [BIBFILES <bib_files>] 29# [INPUTS <input_tex_files>] 30# [IMAGE_DIRS] <image_directories> 31# [IMAGES] <image_files> 32# [CONFIGURE] <tex_files> 33# [DEPENDS] <tex_files> 34# [USE_INDEX] [USE_GLOSSARY] 35# [DEFAULT_PDF] [MANGLE_TARGET_NAMES]) 36# Adds targets that compile <tex_file>. The latex output is placed 37# in LATEX_OUTPUT_PATH or CMAKE_CURRENT_BINARY_DIR if the former is 38# not set. The latex program is picky about where files are located, 39# so all input files are copied from the source directory to the 40# output directory. This includes the target tex file, any tex file 41# listed with the INPUTS option, the bibliography files listed with 42# the BIBFILES option, and any .cls, .bst, and .clo files found in 43# the current source directory. Images found in the IMAGE_DIRS 44# directories or listed by IMAGES are also copied to the output 45# directory and coverted to an appropriate format if necessary. Any 46# tex files also listed with the CONFIGURE option are also processed 47# with the CMake CONFIGURE_FILE command (with the @ONLY flag. Any 48# file listed in CONFIGURE but not the target tex file or listed with 49# INPUTS has no effect. DEPENDS can be used to specify generated files 50# that are needed to compile the latex target. 51# 52# The following targets are made: 53# dvi: Makes <name>.dvi 54# pdf: Makes <name>.pdf using pdflatex. 55# safepdf: Makes <name>.pdf using ps2pdf. If using the default 56# program arguments, this will ensure all fonts are 57# embedded and no lossy compression has been performed 58# on images. 59# ps: Makes <name>.ps 60# html: Makes <name>.html 61# auxclean: Deletes <name>.aux. This is sometimes necessary 62# if a LaTeX error occurs and writes a bad aux file. 63# 64# If the argument MANGLE_TARGET_NAMES is given, then each of the 65# target names above will be mangled with the <tex_file> name. This 66# is to make the targets unique if ADD_LATEX_DOCUMENT is called for 67# multiple documents. If the argument USE_INDEX is given, then 68# commands to build an index are made. If the argument USE_GLOSSARY 69# is given, then commands to build a glossary are made. 70# 71# History: 72# 73# 1.7.0 Added DEPENDS options (thanks to Theodore Papadopoulp). 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=nonstopmode" 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 #IF (NOT IMAGEMAGICK_CONVERT) 346 #MESSAGE(SEND_ERROR "Could not find convert program. Please download ImageMagick from http://www.imagemagick.org and install.") 347#MESSAGE(STATUS "I could not find the the Imagemagick convert program. Hope you are not needing it.") 348 #ENDIF (NOT IMAGEMAGICK_CONVERT) 349 350 OPTION(LATEX_SMALL_IMAGES 351 "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." 352 OFF) 353 IF (LATEX_SMALL_IMAGES) 354 SET(LATEX_RASTER_SCALE 16) 355 SET(LATEX_OPPOSITE_RASTER_SCALE 100) 356 ELSE (LATEX_SMALL_IMAGES) 357 SET(LATEX_RASTER_SCALE 100) 358 SET(LATEX_OPPOSITE_RASTER_SCALE 16) 359 ENDIF (LATEX_SMALL_IMAGES) 360 361 # Just holds extensions for known image types. They should all be lower case. 362 #SET(LATEX_DVI_VECTOR_IMAGE_EXTENSIONS .eps) 363 #SET(LATEX_DVI_RASTER_IMAGE_EXTENSIONS) 364 #SET(LATEX_DVI_IMAGE_EXTENSIONS 365 #${LATEX_DVI_VECTOR_IMAGE_EXTENSIONS} ${LATEX_DVI_RASTER_IMAGE_EXTENSIONS}) 366 SET(LATEX_PDF_VECTOR_IMAGE_EXTENSIONS .pdf) 367 SET(LATEX_PDF_RASTER_IMAGE_EXTENSIONS .png .jpeg .jpg) 368 SET(LATEX_PDF_IMAGE_EXTENSIONS 369 ${LATEX_PDF_VECTOR_IMAGE_EXTENSIONS} ${LATEX_PDF_RASTER_IMAGE_EXTENSIONS}) 370 SET(LATEX_IMAGE_EXTENSIONS 371 ${LATEX_DVI_IMAGE_EXTENSIONS} ${LATEX_PDF_IMAGE_EXTENSIONS}) 372ENDMACRO(LATEX_SETUP_VARIABLES) 373 374MACRO(LATEX_GET_OUTPUT_PATH var) 375 SET(${var}) 376 IF (LATEX_OUTPUT_PATH) 377 IF ("${LATEX_OUTPUT_PATH}" STREQUAL "${CMAKE_CURRENT_SOURCE_DIR}") 378 MESSAGE(SEND_ERROR "You cannot set LATEX_OUTPUT_PATH to the same directory that contains LaTeX input files.") 379 ELSE ("${LATEX_OUTPUT_PATH}" STREQUAL "${CMAKE_CURRENT_SOURCE_DIR}") 380 SET(${var} "${LATEX_OUTPUT_PATH}") 381 ENDIF ("${LATEX_OUTPUT_PATH}" STREQUAL "${CMAKE_CURRENT_SOURCE_DIR}") 382 ELSE (LATEX_OUTPUT_PATH) 383 IF ("${CMAKE_CURRENT_BINARY_DIR}" STREQUAL "${CMAKE_CURRENT_SOURCE_DIR}") 384 MESSAGE(SEND_ERROR "LaTeX files must be built out of source or you must set LATEX_OUTPUT_PATH.") 385 ELSE ("${CMAKE_CURRENT_BINARY_DIR}" STREQUAL "${CMAKE_CURRENT_SOURCE_DIR}") 386 SET(${var} "${CMAKE_CURRENT_BINARY_DIR}") 387 ENDIF ("${CMAKE_CURRENT_BINARY_DIR}" STREQUAL "${CMAKE_CURRENT_SOURCE_DIR}") 388 ENDIF (LATEX_OUTPUT_PATH) 389ENDMACRO(LATEX_GET_OUTPUT_PATH) 390 391# Makes custom commands to convert a file to a particular type. 392MACRO(LATEX_CONVERT_IMAGE output_files input_file output_extension convert_flags 393 output_extensions other_files) 394 SET(input_dir ${CMAKE_CURRENT_SOURCE_DIR}) 395 LATEX_GET_OUTPUT_PATH(output_dir) 396 397 GET_FILENAME_COMPONENT(extension "${input_file}" EXT) 398 399 STRING(REGEX REPLACE "\\.[^.]*\$" ${output_extension} output_file 400 "${input_file}") 401 402 LATEX_LIST_CONTAINS(is_type ${extension} ${output_extensions}) 403 IF (is_type) 404 IF (convert_flags) 405 ADD_CUSTOM_COMMAND(OUTPUT ${output_dir}/${output_file} 406 COMMAND ${IMAGEMAGICK_CONVERT} 407 ARGS ${input_dir}/${input_file} ${convert_flags} 408 ${output_dir}/${output_file} 409 DEPENDS ${input_dir}/${input_file} 410 ) 411 SET(${output_files} ${${output_files}} ${output_dir}/${output_file}) 412 ELSE (convert_flags) 413 # As a shortcut, we can just copy the file. 414 ADD_CUSTOM_COMMAND(OUTPUT ${output_dir}/${input_file} 415 COMMAND ${CMAKE_COMMAND} 416 ARGS -E copy ${input_dir}/${input_file} ${output_dir}/${input_file} 417 DEPENDS ${input_dir}/${input_file} 418 ) 419 SET(${output_files} ${${output_files}} ${output_dir}/${input_file}) 420 ENDIF (convert_flags) 421 ELSE (is_type) 422 SET(do_convert TRUE) 423 # Check to see if there is another input file of the appropriate type. 424 FOREACH(valid_extension ${output_extensions}) 425 STRING(REGEX REPLACE "\\.[^.]*\$" ${output_extension} try_file 426 "${input_file}") 427 LATEX_LIST_CONTAINS(has_native_file "${try_file}" ${other_files}) 428 IF (has_native_file) 429 SET(do_convert FALSE) 430 ENDIF (has_native_file) 431 ENDFOREACH(valid_extension) 432 433 # If we still need to convert, do it. 434 IF (do_convert) 435 ADD_CUSTOM_COMMAND(OUTPUT ${output_dir}/${output_file} 436 COMMAND ${IMAGEMAGICK_CONVERT} 437 ARGS ${input_dir}/${input_file} ${convert_flags} 438 ${output_dir}/${output_file} 439 DEPENDS ${input_dir}/${input_file} 440 ) 441 SET(${output_files} ${${output_files}} ${output_dir}/${output_file}) 442 ENDIF (do_convert) 443 ENDIF (is_type) 444ENDMACRO(LATEX_CONVERT_IMAGE) 445 446# Adds custom commands to process the given files for dvi and pdf builds. 447# Adds the output files to the given variables (does not replace). 448MACRO(LATEX_PROCESS_IMAGES dvi_outputs pdf_outputs) 449 LATEX_GET_OUTPUT_PATH(output_dir) 450 FOREACH(file ${ARGN}) 451 IF (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${file}") 452 GET_FILENAME_COMPONENT(extension "${file}" EXT) 453 SET(convert_flags) 454 455 # Check to see if we need to downsample the image. 456 LATEX_LIST_CONTAINS(is_raster extension 457 ${LATEX_DVI_RASTER_IMAGE_EXTENSIONS} 458 ${LATEX_PDF_RASTER_IMAGE_EXTENSIONS}) 459 IF (LATEX_SMALL_IMAGES) 460 IF (is_raster) 461 SET(convert_flags -resize ${LATEX_RASTER_SCALE}%) 462 ENDIF (is_raster) 463 ENDIF (LATEX_SMALL_IMAGES) 464 465 # Make sure the output directory exists. 466 GET_FILENAME_COMPONENT(path "${output_dir}/${file}" PATH) 467 MAKE_DIRECTORY("${path}") 468 469 # Do conversions for dvi. 470 LATEX_CONVERT_IMAGE(${dvi_outputs} "${file}" .eps "${convert_flags}" 471 "${LATEX_DVI_IMAGE_EXTENSIONS}" "${ARGN}") 472 473 # Do conversions for pdf. 474 IF (is_raster) 475 LATEX_CONVERT_IMAGE(${pdf_outputs} "${file}" .png "${convert_flags}" 476 "${LATEX_PDF_IMAGE_EXTENSIONS}" "${ARGN}") 477 ELSE (is_raster) 478 LATEX_CONVERT_IMAGE(${pdf_outputs} "${file}" .pdf "${convert_flags}" 479 "${LATEX_PDF_IMAGE_EXTENSIONS}" "${ARGN}") 480 ENDIF (is_raster) 481 ELSE (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${file}") 482 MESSAGE("Could not find file \"${CMAKE_CURRENT_SOURCE_DIR}/${file}\"") 483 ENDIF (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${file}") 484 ENDFOREACH(file) 485ENDMACRO(LATEX_PROCESS_IMAGES) 486 487MACRO(ADD_LATEX_IMAGES) 488 MESSAGE("The ADD_LATEX_IMAGES macro is deprecated. Image directories are specified with LATEX_ADD_DOCUMENT.") 489ENDMACRO(ADD_LATEX_IMAGES) 490 491MACRO(LATEX_COPY_GLOBBED_FILES pattern dest) 492 FILE(GLOB file_list ${pattern}) 493 FOREACH(in_file ${file_list}) 494 GET_FILENAME_COMPONENT(out_file ${in_file} NAME) 495 CONFIGURE_FILE(${in_file} ${dest}/${out_file} COPYONLY) 496 ENDFOREACH(in_file) 497ENDMACRO(LATEX_COPY_GLOBBED_FILES) 498 499MACRO(LATEX_COPY_INPUT_FILE file) 500 LATEX_GET_OUTPUT_PATH(output_dir) 501 502 IF (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${file}) 503 GET_FILENAME_COMPONENT(path ${file} PATH) 504 FILE(MAKE_DIRECTORY ${output_dir}/${path}) 505 506 LATEX_LIST_CONTAINS(use_config ${file} ${LATEX_CONFIGURE}) 507 IF (use_config) 508 CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/${file} 509 ${output_dir}/${file} 510 @ONLY 511 ) 512 ADD_CUSTOM_COMMAND(OUTPUT ${output_dir}/${file} 513 COMMAND ${CMAKE_COMMAND} 514 ARGS ${CMAKE_BINARY_DIR} 515 DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${file} 516 ) 517 ELSE (use_config) 518 ADD_CUSTOM_COMMAND(OUTPUT ${output_dir}/${file} 519 COMMAND ${CMAKE_COMMAND} 520 ARGS -E copy ${CMAKE_CURRENT_SOURCE_DIR}/${file} ${output_dir}/${file} 521 DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${file} 522 ) 523 ENDIF (use_config) 524 ELSE (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${file}) 525 IF (EXISTS ${output_dir}/${file}) 526 # Special case: output exists but input does not. Assume that it was 527 # created elsewhere and skip the input file copy. 528 ELSE (EXISTS ${output_dir}/${file}) 529 MESSAGE("Could not find input file ${CMAKE_CURRENT_SOURCE_DIR}/${file}") 530 ENDIF (EXISTS ${output_dir}/${file}) 531 ENDIF (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${file}) 532ENDMACRO(LATEX_COPY_INPUT_FILE) 533 534############################################################################# 535# Commands provided by the UseLATEX.cmake "package" 536############################################################################# 537 538MACRO(LATEX_USAGE command message) 539 MESSAGE(SEND_ERROR 540 "${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])" 541 ) 542ENDMACRO(LATEX_USAGE command message) 543 544# Parses arguments to ADD_LATEX_DOCUMENT and ADD_LATEX_TARGETS and sets the 545# variables LATEX_TARGET, LATEX_IMAGE_DIR, LATEX_BIBFILES, LATEX_DEPENDS, and 546# LATEX_INPUTS. 547MACRO(PARSE_ADD_LATEX_ARGUMENTS command) 548 LATEX_PARSE_ARGUMENTS( 549 LATEX 550 "BIBFILES;INPUTS;IMAGE_DIRS;IMAGES;CONFIGURE;DEPENDS" 551 "USE_INDEX;USE_GLOSSARY;USE_GLOSSARIES;DEFAULT_PDF;MANGLE_TARGET_NAMES" 552 ${ARGN} 553 ) 554 555 # The first argument is the target latex file. 556 IF (LATEX_DEFAULT_ARGS) 557 LATEX_CAR(LATEX_MAIN_INPUT ${LATEX_DEFAULT_ARGS}) 558 LATEX_CDR(LATEX_DEFAULT_ARGS ${LATEX_DEFAULT_ARGS}) 559 GET_FILENAME_COMPONENT(LATEX_TARGET ${LATEX_MAIN_INPUT} NAME_WE) 560 ELSE (LATEX_DEFAULT_ARGS) 561 LATEX_USAGE(${command} "No tex file target given to ${command}.") 562 ENDIF (LATEX_DEFAULT_ARGS) 563 564 IF (LATEX_DEFAULT_ARGS) 565 LATEX_USAGE(${command} "Invalid or depricated arguments: ${LATEX_DEFAULT_ARGS}") 566 ENDIF (LATEX_DEFAULT_ARGS) 567 568 # Backward compatibility between 1.6.0 and 1.6.1. 569 IF (LATEX_USE_GLOSSARIES) 570 SET(LATEX_USE_GLOSSARY TRUE) 571 ENDIF (LATEX_USE_GLOSSARIES) 572ENDMACRO(PARSE_ADD_LATEX_ARGUMENTS) 573 574MACRO(ADD_LATEX_TARGETS) 575 LATEX_GET_OUTPUT_PATH(output_dir) 576 PARSE_ADD_LATEX_ARGUMENTS(ADD_LATEX_TARGETS ${ARGV}) 577 578 # Set up target names. 579 IF (LATEX_MANGLE_TARGET_NAMES) 580 SET(dvi_target ${LATEX_TARGET}_dvi) 581 SET(pdf_target ${LATEX_TARGET}_pdf) 582 SET(ps_target ${LATEX_TARGET}_ps) 583 SET(safepdf_target ${LATEX_TARGET}_safepdf) 584 SET(html_target ${LATEX_TARGET}_html) 585 SET(auxclean_target ${LATEX_TARGET}_auxclean) 586 ELSE (LATEX_MANGLE_TARGET_NAMES) 587 SET(dvi_target dvi) 588 SET(pdf_target pdf) 589 SET(ps_target ps) 590 SET(safepdf_target safepdf) 591 SET(html_target html) 592 SET(auxclean_target auxclean) 593 ENDIF (LATEX_MANGLE_TARGET_NAMES) 594 595 # For each directory in LATEX_IMAGE_DIRS, glob all the image files and 596 # place them in LATEX_IMAGES. 597 FOREACH(dir ${LATEX_IMAGE_DIRS}) 598 FOREACH(extension ${LATEX_IMAGE_EXTENSIONS}) 599 FILE(GLOB files ${CMAKE_CURRENT_SOURCE_DIR}/${dir}/*${extension}) 600 FOREACH(file ${files}) 601 GET_FILENAME_COMPONENT(filename ${file} NAME) 602 SET(LATEX_IMAGES ${LATEX_IMAGES} ${dir}/${filename}) 603 ENDFOREACH(file) 604 ENDFOREACH(extension) 605 ENDFOREACH(dir) 606 607 SET(dvi_images) 608 SET(pdf_images) 609 LATEX_PROCESS_IMAGES(dvi_images pdf_images ${LATEX_IMAGES}) 610 611 SET(make_dvi_command 612 ${CMAKE_COMMAND} -E chdir ${output_dir} 613 ${LATEX_COMPILER} ${LATEX_COMPILER_FLAGS} ${LATEX_MAIN_INPUT}) 614 SET(make_pdf_command 615 ${CMAKE_COMMAND} -E chdir ${output_dir} 616 ${PDFLATEX_COMPILER} ${PDFLATEX_COMPILER_FLAGS} ${LATEX_MAIN_INPUT}) 617 618 SET(make_dvi_depends ${LATEX_DEPENDS} ${dvi_images}) 619 SET(make_pdf_depends ${LATEX_DEPENDS} ${pdf_images}) 620 FOREACH(input ${LATEX_MAIN_INPUT} ${LATEX_INPUTS}) 621 SET(make_dvi_depends ${make_dvi_depends} ${output_dir}/${input}) 622 SET(make_pdf_depends ${make_pdf_depends} ${output_dir}/${input}) 623 ENDFOREACH(input) 624 625 IF (LATEX_BIBFILES) 626 SET(make_dvi_command ${make_dvi_command} 627 COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir} 628 ${BIBTEX_COMPILER} ${BIBTEX_COMPILER_FLAGS} ${LATEX_TARGET}) 629 SET(make_pdf_command ${make_pdf_command} 630 COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir} 631 ${BIBTEX_COMPILER} ${BIBTEX_COMPILER_FLAGS} ${LATEX_TARGET}) 632 FOREACH (bibfile ${LATEX_BIBFILES}) 633 SET(make_dvi_depends ${make_dvi_depends} ${output_dir}/${bibfile}) 634 SET(make_pdf_depends ${make_pdf_depends} ${output_dir}/${bibfile}) 635 ENDFOREACH (bibfile ${LATEX_BIBFILES}) 636 ENDIF (LATEX_BIBFILES) 637 638 IF (LATEX_USE_INDEX) 639 SET(make_dvi_command ${make_dvi_command} 640 COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir} 641 ${LATEX_COMPILER} ${LATEX_COMPILER_FLAGS} ${LATEX_MAIN_INPUT} 642 COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir} 643 ${MAKEINDEX_COMPILER} ${MAKEINDEX_COMPILER_FLAGS} ${LATEX_TARGET}.idx) 644 SET(make_pdf_command ${make_pdf_command} 645 COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir} 646 ${PDFLATEX_COMPILER} ${PDFLATEX_COMPILER_FLAGS} ${LATEX_MAIN_INPUT} 647 COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir} 648 ${MAKEINDEX_COMPILER} ${MAKEINDEX_COMPILER_FLAGS} ${LATEX_TARGET}.idx) 649 ENDIF (LATEX_USE_INDEX) 650 651 IF (LATEX_USE_GLOSSARY) 652 SET(make_dvi_command ${make_dvi_command} 653 COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir} 654 ${LATEX_COMPILER} ${LATEX_COMPILER_FLAGS} ${LATEX_MAIN_INPUT} 655 COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir} 656 ${CMAKE_COMMAND} 657 -D LATEX_BUILD_COMMAND=makeglossaries 658 -D LATEX_TARGET=${LATEX_TARGET} 659 -D MAKEINDEX_COMPILER=${MAKEINDEX_COMPILER} 660 -D MAKEGLOSSARIES_COMPILER_FLAGS=${MAKEGLOSSARIES_COMPILER_FLAGS} 661 -P ${LATEX_USE_LATEX_LOCATION} 662 ) 663 SET(make_pdf_command ${make_pdf_command} 664 COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir} 665 ${PDFLATEX_COMPILER} ${PDFLATEX_COMPILER_FLAGS} ${LATEX_MAIN_INPUT} 666 COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir} 667 ${CMAKE_COMMAND} 668 -D LATEX_BUILD_COMMAND=makeglossaries 669 -D LATEX_TARGET=${LATEX_TARGET} 670 -D MAKEINDEX_COMPILER=${MAKEINDEX_COMPILER} 671 -D MAKEGLOSSARIES_COMPILER_FLAGS=${MAKEGLOSSARIES_COMPILER_FLAGS} 672 -P ${LATEX_USE_LATEX_LOCATION} 673 ) 674 ENDIF (LATEX_USE_GLOSSARY) 675 676 SET(make_dvi_command ${make_dvi_command} 677 COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir} 678 ${LATEX_COMPILER} ${LATEX_COMPILER_FLAGS} ${LATEX_MAIN_INPUT} 679 COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir} 680 ${LATEX_COMPILER} ${LATEX_COMPILER_FLAGS} ${LATEX_MAIN_INPUT}) 681 SET(make_pdf_command ${make_pdf_command} 682 COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir} 683 ${PDFLATEX_COMPILER} ${PDFLATEX_COMPILER_FLAGS} ${LATEX_MAIN_INPUT} 684 COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir} 685 ${PDFLATEX_COMPILER} ${PDFLATEX_COMPILER_FLAGS} ${LATEX_MAIN_INPUT}) 686 687 IF (LATEX_DEFAULT_PDF) 688 ADD_CUSTOM_TARGET(${dvi_target} ${make_dvi_command} 689 DEPENDS ${make_dvi_depends}) 690 ELSE (LATEX_DEFAULT_PDF) 691 ADD_CUSTOM_TARGET(${dvi_target} ALL ${make_dvi_command} 692 DEPENDS ${make_dvi_depends}) 693 ENDIF (LATEX_DEFAULT_PDF) 694 695 IF (PDFLATEX_COMPILER) 696 IF (LATEX_DEFAULT_PDF) 697 ADD_CUSTOM_TARGET(${pdf_target} ALL ${make_pdf_command} 698 DEPENDS ${make_pdf_depends}) 699 ELSE (LATEX_DEFAULT_PDF) 700 ADD_CUSTOM_TARGET(${pdf_target} ${make_pdf_command} 701 DEPENDS ${make_pdf_depends}) 702 ENDIF (LATEX_DEFAULT_PDF) 703 ENDIF (PDFLATEX_COMPILER) 704 705 IF (DVIPS_CONVERTER) 706 ADD_CUSTOM_TARGET(${ps_target} 707 ${CMAKE_COMMAND} -E chdir ${output_dir} 708 ${DVIPS_CONVERTER} ${DVIPS_CONVERTER_FLAGS} -o ${LATEX_TARGET}.ps ${LATEX_TARGET}.dvi 709 ) 710 ADD_DEPENDENCIES(${ps_target} ${dvi_target}) 711 IF (PS2PDF_CONVERTER) 712 ADD_CUSTOM_TARGET(${safepdf_target} 713 ${CMAKE_COMMAND} -E chdir ${output_dir} 714 ${PS2PDF_CONVERTER} ${PS2PDF_CONVERTER_FLAGS} ${LATEX_TARGET}.ps ${LATEX_TARGET}.pdf 715 ) 716 ADD_DEPENDENCIES(${safepdf_target} ${ps_target}) 717 ENDIF (PS2PDF_CONVERTER) 718 ENDIF (DVIPS_CONVERTER) 719 720 IF (LATEX2HTML_CONVERTER) 721 ADD_CUSTOM_TARGET(${html_target} 722 ${CMAKE_COMMAND} -E chdir ${output_dir} 723 ${LATEX2HTML_CONVERTER} ${LATEX2HTML_CONVERTER_FLAGS} ${LATEX_MAIN_INPUT} 724 ) 725 ADD_DEPENDENCIES(${html_target} ${LATEX_MAIN_INPUT} ${LATEX_INPUTS}) 726 ENDIF (LATEX2HTML_CONVERTER) 727 728 ADD_CUSTOM_TARGET(${auxclean_target} 729 ${CMAKE_COMMAND} -E remove ${output_dir}/${LATEX_TARGET}.aux ${output_dir}/${LATEX_TARGET}.idx ${output_dir}/${LATEX_TARGET}.ind 730 ) 731ENDMACRO(ADD_LATEX_TARGETS) 732 733MACRO(ADD_LATEX_DOCUMENT) 734 LATEX_GET_OUTPUT_PATH(output_dir) 735 IF (output_dir) 736 PARSE_ADD_LATEX_ARGUMENTS(ADD_LATEX_DOCUMENT ${ARGV}) 737 738 LATEX_COPY_INPUT_FILE(${LATEX_MAIN_INPUT}) 739 740 FOREACH (bib_file ${LATEX_BIBFILES}) 741 CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/${bib_file} 742 ${output_dir}/${bib_file} 743 COPYONLY) 744 ADD_CUSTOM_COMMAND(OUTPUT ${output_dir}/${bib_file} 745 COMMAND ${CMAKE_COMMAND} 746 ARGS -E copy ${CMAKE_CURRENT_SOURCE_DIR}/${bib_file} ${output_dir}/${bib_file} 747 DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${bib_file} 748 ) 749 ENDFOREACH (bib_file) 750 751 FOREACH (input ${LATEX_INPUTS}) 752 LATEX_COPY_INPUT_FILE(${input}) 753 ENDFOREACH(input) 754 755 LATEX_COPY_GLOBBED_FILES(${CMAKE_CURRENT_SOURCE_DIR}/*.cls ${output_dir}) 756 LATEX_COPY_GLOBBED_FILES(${CMAKE_CURRENT_SOURCE_DIR}/*.bst ${output_dir}) 757 LATEX_COPY_GLOBBED_FILES(${CMAKE_CURRENT_SOURCE_DIR}/*.clo ${output_dir}) 758 LATEX_COPY_GLOBBED_FILES(${CMAKE_CURRENT_SOURCE_DIR}/*.sty ${output_dir}) 759 760 ADD_LATEX_TARGETS(${ARGV}) 761 ENDIF (output_dir) 762ENDMACRO(ADD_LATEX_DOCUMENT) 763 764############################################################################# 765# Actually do stuff 766############################################################################# 767 768IF (LATEX_BUILD_COMMAND) 769 SET(command_handled) 770 771 IF ("${LATEX_BUILD_COMMAND}" STREQUAL makeglossaries) 772 LATEX_MAKEGLOSSARIES() 773 SET(command_handled TRUE) 774 ENDIF ("${LATEX_BUILD_COMMAND}" STREQUAL makeglossaries) 775 776 IF (NOT command_handled) 777 MESSAGE(SEND_ERROR "Unknown command: ${LATEX_BUILD_COMMAND}") 778 ENDIF (NOT command_handled) 779 780ELSE (LATEX_BUILD_COMMAND) 781 # Must be part of the actual configure (included from CMakeLists.txt). 782 LATEX_SETUP_VARIABLES() 783ENDIF (LATEX_BUILD_COMMAND) 784