Skip to content
CMakeLists.txt 9.61 KiB
Newer Older
Sergei Mikhailov's avatar
Sergei Mikhailov committed
#▶1 Header
cmake_minimum_required(VERSION 2.8.7)

set(CMAKE_DISABLE_SOURCE_CHANGES ON)
set(CMAKE_DISABLE_IN_SOURCE_BUILD ON)

project(diplom NONE)
#▶1 includes
set(CMAKE_SCRIPTS_DIR "${CMAKE_CURRENT_LIST_DIR}/cmake")
include("${CMAKE_SCRIPTS_DIR}/RequireProgram.cmake")
#▶1 requirements
require_program(INKSCAPE_COMMAND inkscape)
require_program(DIA_COMMAND dia)
require_program(DOT_COMMAND dot)
require_program(MAKEINDEX_COMMAND makeindex)
require_program(PDFCROP_COMMAND pdfcrop)
find_program(GS_COMMAND NAMES gs gswin32c)
if(GS_COMMAND MATCHES "-NOTFOUND$")
    message(STATUS "Failed to find gs")
else()
    message(STATUS "Found gs: ${GS_COMMAND}")
endif()
find_package(LATEX
             COMPONENTS XELATEX PDFLATEX BIBTEX
             REQUIRED)
find_package(Perl REQUIRED)
#▶1 Options
#▶2 Definitions
set(PREFER_XELATEX on CACHE BOOL "Prefer XeLaTeX over PDFLaTeX")
#▶2 Processing
# CMake-2.8.7 actually has no XELATEX component, so it will not define 
# XELATEX_COMPILER. Neither it will error out on unknown component above.
if(PREFER_XELATEX)
    if(NOT DEFINED XELATEX_COMPILER)
        require_program(XELATEX_COMPILER xelatex)
    endif()
    set(USED_LATEX_COMPILER
        "${XELATEX_COMPILER}" -synctex=1 -interaction=nonstopmode -shell-escape)
else()
    set(USED_LATEX_COMPILER "${PDFLATEX_COMPILER}")
    require_program(ICONV_COMMAND iconv)
endif()
#▶1 Variables
set(TEX_TREE "${CMAKE_SOURCE_DIR}/tex")

set(MIRROR_TREE "${CMAKE_BINARY_DIR}/mirror")
set(TEX_MIRROR_TREE "${MIRROR_TREE}/tex")
set(INC_TREE "${TEX_MIRROR_TREE}/inc")
set(INC_IMG_TREE "${INC_TREE}/img")
set(INC_DIA_TREE "${INC_TREE}/dia")
set(INC_SVG_TREE "${INC_TREE}/svg")
set(INC_DOT_TREE "${INC_TREE}/dot")
set(INC_SRC_TREE "${INC_TREE}/src")
set(MAIN_TEX rpz)
set(NOM_NLO "${MAIN_TEX}.nlo")
set(NOM_IST nomencl.ist)
set(NOM_NLS "${MAIN_TEX}.nls")

set(TARGET_PDF_BASE rpz.pdf)
set(TARGET_PDF "${CMAKE_BINARY_DIR}/${TARGET_PDF_BASE}")
set(GSCONV_SCRIPT "${CMAKE_SCRIPTS_DIR}/GSConv.cmake")
set(COPY_CONVERTED_SCRIPT "${CMAKE_SCRIPTS_DIR}/CopyConverted.cmake")
#▶1 Prepare build directory
file(MAKE_DIRECTORY "${MIRROR_TREE}")
file(MAKE_DIRECTORY "${TEX_MIRROR_TREE}")
file(MAKE_DIRECTORY "${INC_TREE}")
file(MAKE_DIRECTORY "${INC_IMG_TREE}")
file(MAKE_DIRECTORY "${INC_DIA_TREE}")
file(MAKE_DIRECTORY "${INC_SVG_TREE}")
file(MAKE_DIRECTORY "${INC_DOT_TREE}")
file(MAKE_DIRECTORY "${INC_SRC_TREE}")
#▶1 Find sources
function(glob_in_dir varname dir)
    file(RELATIVE_PATH dir_rel "${CMAKE_CURRENT_LIST_DIR}" "${dir}")
    set(sources_abs)
    foreach(glob ${ARGN})
        file(GLOB sources "${dir_rel}/${glob}")
        list(APPEND sources_abs "${sources}")
    endforeach()
    set(${varname} ${sources_abs} PARENT_SCOPE)
endfunction()
glob_in_dir(tex_sources "${TEX_TREE}" *.tex *.sty *.clo *.bst *.cls *.bib)
glob_in_dir(listing_sources "${CMAKE_SOURCE_DIR}/src" *)
glob_in_dir(img_sources "${CMAKE_SOURCE_DIR}/graphics/img" *)
glob_in_dir(svg_sources "${CMAKE_SOURCE_DIR}/graphics/svg" *.svg)
glob_in_dir(dia_sources "${CMAKE_SOURCE_DIR}/graphics/dia" *.dia)
glob_in_dir(dot_sources "${CMAKE_SOURCE_DIR}/graphics/dot" *.dot)
#▶1 Generate sources
#▶2 Tex sources
set(tex_mirror_sources)
foreach(tex_src ${tex_sources})
    file(RELATIVE_PATH tex_src_rel "${TEX_TREE}" "${tex_src}")
    set(tex_dst "${TEX_MIRROR_TREE}/${tex_src_rel}")
    add_custom_command(
        OUTPUT "${tex_dst}"
        VERBATIM
        COMMAND "${CMAKE_COMMAND}" -E copy "${tex_src}" "${tex_dst}"
        DEPENDS "${tex_src}"
    )
    list(APPEND tex_mirror_sources "${tex_dst}")
endforeach()
#▶2 Img sources
set(img_mirror_sources)
foreach(img_src ${img_sources})
    get_filename_component(img_name "${img_src}" NAME)
    set(img_dst "${INC_IMG_TREE}/${img_name}")
    add_custom_command(
        OUTPUT "${img_dst}"
        VERBATIM
        COMMAND "${CMAKE_COMMAND}" -E copy "${img_src}" "${img_dst}"
        DEPENDS "${img_src}"
    )
    list(APPEND img_mirror_sources "${img_dst}")
endforeach()
#▶2 SVG
set(svg_pdfs)
foreach(svg_src ${svg_sources})
    get_filename_component(svg_base "${svg_src}" NAME_WE)
    set(svg_dst "${INC_SVG_TREE}/${svg_base}.pdf")
    set(svg_dst_tmp_rel "${svg_base}-tmp.pdf")
    file(RELATIVE_PATH svg_dst_rel "${INC_SVG_TREE}" "${svg_dst}")
    file(RELATIVE_PATH svg_src_rel "${INC_SVG_TREE}" "${svg_src}")
    add_custom_command(
        OUTPUT "${svg_dst}"
        WORKING_DIRECTORY "${INC_SVG_TREE}"
        VERBATIM
        COMMAND
            "${INKSCAPE_COMMAND}" -A "${svg_dst_tmp_rel}" "${svg_src_rel}"
        COMMAND
            "${PDFCROP_COMMAND}" "${svg_dst_tmp_rel}" "${svg_dst_rel}"
        COMMAND
            "${CMAKE_COMMAND}" -E remove "${svg_dst_tmp_rel}"
        DEPENDS "${svg_src}"
    )
    list(APPEND svg_pdfs "${svg_dst}")
endforeach()
#▶2 dia
set(dia_pdfs)
foreach(dia_src ${dia_sources})
    get_filename_component(dia_base "${dia_src}" NAME_WE)
    set(dia_dst "${INC_DIA_TREE}/${dia_base}.pdf")
    set(dia_dst_svg_tmp_rel "${dia_base}-tmp.svg")
    set(dia_dst_pdf_tmp_rel "${dia_base}-tmp.pdf")
    file(RELATIVE_PATH dia_dst_rel "${INC_DIA_TREE}" "${dia_dst}")
    file(RELATIVE_PATH dia_src_rel "${INC_DIA_TREE}" "${dia_src}")
    add_custom_command(
        OUTPUT "${dia_dst}"
        WORKING_DIRECTORY "${INC_DIA_TREE}"
        VERBATIM
        COMMAND
            "${DIA_COMMAND}" -e "${dia_dst_svg_tmp_rel}" -t svg "${dia_src_rel}"
        COMMAND
            "${INKSCAPE_COMMAND}" -A "${dia_dst_pdf_tmp_rel}"
                                  "${dia_dst_svg_tmp_rel}"
        COMMAND
            "${PDFCROP_COMMAND}" "${dia_dst_pdf_tmp_rel}" "${dia_dst_rel}"
        COMMAND
            "${CMAKE_COMMAND}" -E remove "${dia_dst_svg_tmp_rel}"
        COMMAND
            "${CMAKE_COMMAND}" -E remove "${dia_dst_pdf_tmp_rel}"
        DEPENDS "${dia_src}"
    )
    list(APPEND dia_pdfs "${dia_dst}")
endforeach()
#▶2 dot
set(dot_pdfs)
foreach(dot_src ${dot_sources})
    get_filename_component(dot_base "${dot_src}" NAME_WE)
    set(dot_dst "${INC_DOT_TREE}/${dot_base}.pdf")
    set(dot_dst_svg_tmp_rel "${dot_base}-tmp.svg")
    set(dot_dst_pdf_tmp_rel "${dot_base}-tmp.pdf")
    file(RELATIVE_PATH dot_dst_rel "${INC_DIA_TREE}" "${dot_dst}")
    file(RELATIVE_PATH dot_src_rel "${INC_DIA_TREE}" "${dot_src}")
    add_custom_command(
        OUTPUT "${dot_dst}"
        WORKING_DIRECTORY "${INC_DIA_TREE}"
        VERBATIM
        COMMAND
            "${DOT_COMMAND}" -Tsvg "-o${dot_dst_svg_tmp_rel}" "${dot_src_rel}"
        COMMAND
            "${INKSCAPE_COMMAND}" -A "${dot_dst_pdf_tmp_rel}"
                                  "${dot_dst_svg_tmp_rel}"
        COMMAND
            "${PDFCROP_COMMAND}" "${dot_dst_pdf_tmp_rel}" "${dot_dst_rel}"
        COMMAND
            "${CMAKE_COMMAND}" -E remove "${dot_dst_svg_tmp_rel}"
        COMMAND
            "${CMAKE_COMMAND}" -E remove "${dot_dst_pdf_tmp_rel}"
        DEPENDS "${dot_src}"
    )
    list(APPEND dot_pdfs "${dot_dst}")
endforeach()
#▶2 Listing sources
set(mirror_listing_sources)
foreach(listing_src ${listing_sources})
    get_filename_component(listing_name "${listing_src}" NAME)
    set(listing_dst "${INC_SRC_TREE}/${listing_name}")
    if(PREFER_XELATEX)
        add_custom_command(
            OUTPUT "${listing_dst}"
            VERBATIM
            COMMAND "${CMAKE_COMMAND}" -E copy "${listing_src}" "${listing_dst}"
            DEPENDS "${listing_src}"
        )
    else()
        add_custom_command(
            OUTPUT "${listing_dst}"
            VERBATIM
            COMMAND
                "${CMAKE_COMMAND}"
                    "-DSRC=${listing_src}"
                    "-DDST=${listing_dst}"
                    "-DICONV_COMMAND=${ICONV_COMMAND}"
                    -DSRC_ENCODING=utf-8
                    -DDST_ENCODING=koi8-r
                    -P "${COPY_CONVERTED_SCRIPT}"
            DEPENDS "${listing_src}" "${COPY_CONVERTED_SCRIPT}"
        )
    endif()
    list(APPEND mirror_listing_sources "${listing_dst}")
endforeach()
#▶1 Main target
# TODO(?) use texdepend
add_custom_target(
    latex-stage1
    WORKING_DIRECTORY "${TEX_MIRROR_TREE}"
    VERBATIM
    COMMAND ${USED_LATEX_COMPILER} "${MAIN_TEX}"
    DEPENDS
        ${svg_pdfs} ${dia_pdfs} ${dot_pdfs}
        ${tex_mirror_sources} ${mirror_listing_sources}
        ${img_mirror_sources}
)
add_custom_target(
    bibtex
    WORKING_DIRECTORY "${TEX_MIRROR_TREE}"
    VERBATIM
    COMMAND ${BIBTEX_COMPILER} "${MAIN_TEX}"
    DEPENDS latex-stage1
)
add_custom_target(
    makeindex
    WORKING_DIRECTORY "${TEX_MIRROR_TREE}"
    VERBATIM
    COMMAND ${MAKEINDEX_COMMAND} "${NOM_NLO}" -s "${NOM_IST}" -o "${NOM_NLS}"
    DEPENDS latex-stage1
)
add_custom_target(
    latex-stage2
    WORKING_DIRECTORY "${TEX_MIRROR_TREE}"
    VERBATIM
    COMMAND ${USED_LATEX_COMPILER} "${MAIN_TEX}"
    DEPENDS bibtex makeindex
)
add_custom_target(
    latex-stage3
    WORKING_DIRECTORY "${TEX_MIRROR_TREE}"
    VERBATIM
    COMMAND ${USED_LATEX_COMPILER} "${MAIN_TEX}"
    DEPENDS latex-stage2
)
add_custom_target(
    pdf
    ALL
    VERBATIM
    WORKING_DIRECTORY "${TEX_MIRROR_TREE}"
    COMMAND "${CMAKE_COMMAND}" -E copy "${TARGET_PDF_BASE}" "${TARGET_PDF}"
    DEPENDS latex-stage3
)
add_custom_target(
    printpdfs
    VERBATIM
    COMMAND
        "${CMAKE_COMMAND}"
            "-DGS_COMMAND=${GS_COMMAND}"
            "-DPDF=${TARGET_PDF_BASE}"
            "-DTMPDIR=gs-tmp"
            -P "${GSCONV_SCRIPT}"
    WORKING_DIRECTORY "${CMAKE_BINARY_DIR}"
    DEPENDS pdf "${GSCONV_SCRIPT}"
)
# vim: foldmarker=▶,▲ cms=#%s