## CMakeLists.txt
##
## Copyright (C) 2006-2022 Christian Schenk
## 
## This file is free software; the copyright holder gives
## unlimited permission to copy and/or distribute it, with or
## without modifications, as long as this notice is preserved.

###############################################################################
## CMake controls

cmake_minimum_required(VERSION 3.12.0 FATAL_ERROR)

set_property(GLOBAL PROPERTY USE_FOLDERS ON)

set(CMAKE_COLOR_MAKEFILE FALSE)
#set(CMAKE_VERBOSE_MAKEFILE TRUE)

set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/modules")

set(CMAKE_LINK_DEPENDS_NO_SHARED 1)

if(APPLE)
    set(CMAKE_OSX_DEPLOYMENT_TARGET
        "10.12"
        CACHE STRING
        "The earliest version of MacOS X that MiKTeX will run on."
    )
    #set(CMAKE_EXE_LINKER_FLAGS "-Wl,-no_weak_imports")
endif()

###############################################################################
## CMake policies

# CMP0071: Let AUTOMOC and AUTOUIC process GENERATED files.
list(APPEND cmake_policies_new
    CMP0071
)

foreach(p ${cmake_policies_new})
    if(POLICY ${p})
        cmake_policy(SET ${p} NEW)
    endif()
endforeach()

###############################################################################
## the name of the game

set(MIKTEX_PRODUCT_NAME "MiKTeX")
string(TOLOWER ${MIKTEX_PRODUCT_NAME} MIKTEX_PRODUCT_TAG)

include(miktex-version.cmake)
include(miktex-local-version.cmake OPTIONAL)

if(MIKTEX_PATCH_VERSION EQUAL 0)
    set(miktex_project_version ${MIKTEX_MAJOR_VERSION}.${MIKTEX_MINOR_VERSION})
else()
    set(miktex_project_version ${MIKTEX_MAJOR_VERSION}.${MIKTEX_MINOR_VERSION}.${MIKTEX_PATCH_VERSION})
endif()

project(${MIKTEX_PRODUCT_TAG}
    VERSION ${miktex_project_version}
)

###############################################################################
## global C/C++ options

set(CMAKE_C_STANDARD 99)
set(CMAKE_C_STANDARD_REQUIRED TRUE)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED TRUE)

###############################################################################
## system type

if(WIN32 AND NOT UNIX)
    set(MIKTEX_NATIVE_WINDOWS TRUE)
else()
    set(MIKTEX_UNIX_ALIKE TRUE)
endif()

if(CMAKE_SYSTEM_NAME MATCHES "BSD/OS")
    set(system_name "openbsd")
elseif(CMAKE_SYSTEM_NAME MATCHES "HP-UX")
    set(system_name "hpux")
elseif(CMAKE_SYSTEM_NAME MATCHES "GNU/kFreeBSD")
    set(MIKTEX_FREEBSD TRUE)
    set(system_name "freebsd")
elseif(CMAKE_SYSTEM_NAME MATCHES "FreeBSD")
    set(MIKTEX_FREEBSD TRUE)
    set(system_name "freebsd")
elseif(CMAKE_SYSTEM_NAME MATCHES "SCO_SV")
    set(system_name "scosv")
elseif(CMAKE_SYSTEM_NAME MATCHES "UNIX_SV")
    set(system_name "unixsv")
elseif(CMAKE_SYSTEM_NAME MATCHES "CYGWIN_NT-.+")
    set(system_name "cygwin")
elseif(CMAKE_SYSTEM_NAME MATCHES "Linux")
    set(MIKTEX_LINUX TRUE)
    set(system_name "linux")
else()
    string(TOLOWER "${CMAKE_SYSTEM_NAME}" system_name)
endif()

if(MIKTEX_NATIVE_WINDOWS)
    if(CMAKE_CL_64)
        set(system_cpu "x64")
        set(MIKTEX_MANIFEST_PROCESSOR_ARCHITECTURE "amd64")
    else()
        set(system_cpu "x86")
        set(MIKTEX_MANIFEST_PROCESSOR_ARCHITECTURE "x86")
    endif()
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "i.86")
    set(system_cpu "x86")
else()
    string(TOLOWER "${CMAKE_SYSTEM_PROCESSOR}" system_cpu)
endif()

#set(MIKTEX_TARGET_SYSTEM_TAG "${system_cpu}-${system_name}")
set(MIKTEX_TARGET_SYSTEM_TAG "${system_name}-${system_cpu}")

if(MIKTEX_NATIVE_WINDOWS)
  set(MIKTEX_MIN_TARGET_SYSTEM_VERSION "6.1.7601")
endif()

set(MIKTEX_SHORTEST_TARGET_SYSTEM_TAG_WIN "win")
set(MIKTEX_SHORTEST_TARGET_SYSTEM_TAG_UNX "unx")

if(MIKTEX_NATIVE_WINDOWS)
    set(MIKTEX_SHORTEST_TARGET_SYSTEM_TAG ${MIKTEX_SHORTEST_TARGET_SYSTEM_TAG_WIN})
else()
    set(MIKTEX_SHORTEST_TARGET_SYSTEM_TAG ${MIKTEX_SHORTEST_TARGET_SYSTEM_TAG_UNX})
endif()

###############################################################################
## macOS: bundle vs Homebrew detection

string(SUBSTRING ${CMAKE_INSTALL_PREFIX} 0 17 homebrew_cellar)
if(homebrew_cellar STREQUAL "/usr/local/Cellar")
    set(MIKTEX_HOMEBREW TRUE)
endif()

if(APPLE AND NOT MIKTEX_HOMEBREW)
    set(MIKTEX_MACOS_BUNDLE TRUE)
endif()

###############################################################################
## handle install prefix standards

if(CMAKE_INSTALL_PREFIX STREQUAL "/usr")
    set(MIKTEX_SELF_CONTAINED_DEFAULT FALSE)
elseif(CMAKE_INSTALL_PREFIX STREQUAL "/usr/local")
    set(MIKTEX_SELF_CONTAINED_DEFAULT FALSE)
elseif(MIKTEX_HOMEBREW)
    set(MIKTEX_SELF_CONTAINED_DEFAULT FALSE)
elseif(MIKTEX_UNIX_ALIKE AND NOT MIKTEX_MACOS_BUNDLE)
    set(MIKTEX_SELF_CONTAINED_DEFAULT TRUE)
endif()

###############################################################################
## user options

option(
    MIKTEX_SELF_CONTAINED
    "Build and install a self-contained MiKTeX distribution."
    ${MIKTEX_SELF_CONTAINED_DEFAULT}
)

option(
    MIKTEX_CORE_AUTO_ADMIN
    "Turn on adminstrator mode for shared installations and elevated programs."
    FALSE
)

option(
    MIKTEX_MPM_AUTO_ADMIN
    "Install packages for all users."
    FALSE
)

option(
    MIKTEX_MPM_AUTO_INSTALL
    "Install missing packages automatically (on-the-fly)."
    ${MIKTEX_UNIX_ALIKE}
)

option(
    USE_SYSTEM_APR
    "Use the system Apache Portable Runtime (APR) library."
    ${MIKTEX_UNIX_ALIKE}
)

option(
    USE_SYSTEM_APRUTIL
    "Use the system Apache Portable Runtime (APR-util) library."
    ${MIKTEX_UNIX_ALIKE}
)

# we always depend on the system Boost development files
set(
    USE_SYSTEM_BOOST
    TRUE
)

option(
    USE_SYSTEM_BZIP2
    "Use the system bzip2 compression library."
    ${MIKTEX_UNIX_ALIKE}
)

if(MIKTEX_MACOS_BUNDLE)
    set(use_system_cairo_default FALSE)
elseif(MIKTEX_UNIX_ALIKE)
    set(use_system_cairo_default TRUE)
endif()

option(
    USE_SYSTEM_CAIRO
    "Use the system Cairo 2D graphics library."
    ${use_system_cairo_default}
)

option(
    USE_SYSTEM_CURL
    "Use the system libcurl URL transfer library."
    ${MIKTEX_UNIX_ALIKE}
)

option(
    USE_SYSTEM_EXPAT
    "Use the system Expat XML parser library."
    ${MIKTEX_UNIX_ALIKE}
)

if(MIKTEX_MACOS_BUNDLE)
    set(use_system_fontconfig_default FALSE)
elseif(MIKTEX_UNIX_ALIKE)
    set(use_system_fontconfig_default TRUE)
endif()

option(
    USE_SYSTEM_FMT
    "Use the system fmt library."
    FALSE
)

option(
    USE_SYSTEM_FONTCONFIG
    "Use the system Fontconfig library."
    ${use_system_fontconfig_default}
)

option(
    USE_SYSTEM_FREETYPE2
    "Use the system FreeType2 font engine library."
    ${MIKTEX_UNIX_ALIKE}
)

option(
    USE_SYSTEM_FRIBIDI
    "Use the system GNU FriBiDi library."
    ${MIKTEX_UNIX_ALIKE}
)

if(MIKTEX_MACOS_BUNDLE)
    set(use_system_gd_default FALSE)
elseif(MIKTEX_UNIX_ALIKE)
    set(use_system_gd_default TRUE)
endif()

option(
    USE_SYSTEM_GD
    "Use the system GD graphics library."
    ${use_system_gd_default}
)

option(
    USE_SYSTEM_GMP
    "Use the system GNU Multiple Precision Arithmetic library."
    ${MIKTEX_UNIX_ALIKE}
)

option(
    USE_SYSTEM_GRAPHITE2
    "Use the system Graphite2 library."
    ${MIKTEX_UNIX_ALIKE}
)

if(MIKTEX_HOMEBREW OR MIKTEX_MACOS_BUNDLE)
    set(use_system_harfbuzz_default FALSE)
elseif(MIKTEX_UNIX_ALIKE)
    set(use_system_harfbuzz_default TRUE)
endif()

option(
    USE_SYSTEM_HARFBUZZ
    "Use the system Harfbuzz text shaping library."
    ${use_system_harfbuzz_default}
)

if(MIKTEX_HOMEBREW OR MIKTEX_MACOS_BUNDLE)
    set(use_system_harfbuzz_icu_default FALSE)
elseif(MIKTEX_UNIX_ALIKE)
set(use_system_harfbuzz_icu_default TRUE)
endif()

option(
    USE_SYSTEM_HARFBUZZ_ICU
    "Use the system Harfbuzz (ICU) text shaping library."
    ${use_system_harfbuzz_icu_default}
)

option(
    USE_SYSTEM_HUNSPELL
    "Use the system Hunspell spell checker library."
    ${MIKTEX_UNIX_ALIKE}
)

# we always depend on the system ICU development files
set(
    USE_SYSTEM_ICU
    TRUE
)

option(
    USE_SYSTEM_JPEG
    "Use the system JPEG library."
    ${MIKTEX_UNIX_ALIKE}
)

option(
    USE_SYSTEM_LOG4CXX
    "Use the system Log4cxx logging framework library."
    ${MIKTEX_UNIX_ALIKE}
)

option(
    USE_SYSTEM_LZMA
    "Use the system LZMA compression library."
    ${MIKTEX_UNIX_ALIKE}
)

option(
    USE_SYSTEM_MPFR
    "Use the system GNU Multiple Precision Floating-Point Reliably (MPFR) library."
    ${MIKTEX_UNIX_ALIKE}
)

if(MIKTEX_HOMEBREW OR MIKTEX_MACOS_BUNDLE)
    set(use_system_mspack_default FALSE)
elseif(MIKTEX_UNIX_ALIKE)
    set(use_system_mspack_default TRUE)
endif()

option(
    USE_SYSTEM_MSPACK
    "Use the system mspack compression library."
    ${use_system_mspack_default}
)

option(
    USE_SYSTEM_OPENSSL_CRYPTO
    "Use the system OpenSSL/LibreSSL crypto library."
    ${MIKTEX_UNIX_ALIKE}
)

option(
    USE_SYSTEM_PIXMAN
    "Use the system Pixman pixel manipulation library."
    ${MIKTEX_UNIX_ALIKE}
)

option(
    USE_SYSTEM_PNG
    "Use the system PNG library."
    ${MIKTEX_UNIX_ALIKE}
)

option(
    USE_SYSTEM_POPPLER
    "Use the system Poppler PDF Rendering library."
    FALSE
)

option(
    USE_SYSTEM_POPPLER_QT
    "Use the system Poppler PDF Rendring (Qt Wrapper) library."
    FALSE
)

option(
    USE_SYSTEM_POPT
    "Use the system popt (command-line options parser) library."
    ${MIKTEX_UNIX_ALIKE}
)

option(
    USE_SYSTEM_URIPARSER
    "Use the system uriparser (URI parser) library."
    ${MIKTEX_UNIX_ALIKE}
)

option(
    USE_SYSTEM_ZLIB
    "Use the system zlib compression library."
    ${MIKTEX_UNIX_ALIKE}
)

option(
    USE_SYSTEM_ZZIP
    "Use the system Zzip compression library."
    ${MIKTEX_UNIX_ALIKE}
)

option(
    WITH_ASYMPTOTE
    "Build asymptote."
    ${MIKTEX_NATIVE_WINDOWS}
)

option(
    WITH_BOOTSTRAPPING
    "Install files necessary for initializing a bare MiKTeX installation."
    ${MIKTEX_UNIX_ALIKE}
)

option(
    WITH_CODE_SIGNING
    "Sign MiKTeX executables."
    FALSE
)

option(
    WITH_PACKAGE_DB_SIGNING
    "MiKTeX package database files must be signed."
    TRUE
)

option(
    WITH_LIBRESSL_CRYPTO
    "Use the LibreSSL crypto library supplied with MiKTeX."
    ${WIN32}
)

option(
    WITH_TRAPMF
    "Build trapmf."
    FALSE
)

option(
    WITH_TRIPTEX
    "Build triptex."
    FALSE
)

option(
    WITH_UI_QT
    "Build Qt components."
    TRUE
)

option(
    WITH_STANDALONE_SETUP
    "Build standalone setup programs."
    ${MIKTEX_NATIVE_WINDOWS}
)

option(
    WITH_UI_MFC
    "Build MFC components."
    ${MSVC}
)

option(
    WITH_COM
    "Build COM components."
    ${MSVC}
)

option(
    WITH_MPC
    "Build mpc (MiKTeX Package Composer)."
    TRUE
)

option(
    WITH_SYNCTEX
    "Enable SyncTeX extensions."
    TRUE
)

option(
    WITH_LEGACY_WINDOWS_SUPPORT
    "Wether to support Windows 7/8."
    TRUE
)

option(
    INSTALL_MIKTEX_HEADERS
    "Install the MiKTeX header files."
    FALSE
)

option(
    INSTALL_STATIC_LIBRARIES
    "Install static libraries."
    FALSE
)

option(
    WITH_CONTEXT_SUPPORT
    "Enable ConTeXt support."
    FALSE
)

option(
    WITH_TPMS
    "Build package manifest files."
    ${WIN32}
)

option(
    WITH_CONFIG_FILES
    "Build configuration files."
    ${WIN32}
)

option(
    WITH_MIKTEX_DOC
    "Build miktex-doc package."
    ${WIN32}
)

option(
    WITH_MIKTEX_API_DOC
    "Build API documentation."
    ${WIN32}
)

option(
    WITH_SCRIPTS
    "Build script files."
    ${WIN32}
)

option(
    WITH_MAN_PAGES
    "Build man pages."
    ${MIKTEX_UNIX_ALIKE}
)

option(
    WITH_RUNGS
    "Create rungs, a symbolic link to the miktex-rungs executable."
    TRUE
)

option(
    WITH_KPSEWHICH
    "Create kpsewhich, a symbolic link to the miktex-kpsewhich executable."
    TRUE
)

option(
    WITH_MKTEXLSR
    "Create mktexlsr, a symbolic link to One MiKTeX Utility."
    TRUE
)

option(
    WITH_TEXHASH
    "Create texhash, a symbolic link to One MiKTeX Utility."
    TRUE
)

option(
    WITH_TEXLINKS
    "Create texlinks, a symbolic link to One MiKTeX Utility."
    TRUE
)

option(
    WITH_TEXDOC
    "Create texdoc, a symbolic link to MiKTeX Help Utility."
    TRUE
)

option(
    WITH_UPDMAP
    "Create updmap, a symbolic link to One MiKTeX Utility."
    TRUE
)

if(WITH_ASYMPTOTE AND MIKTEX_NATIVE_WINDOWS)
    set(USE_SYSTEM_OPENGL TRUE)
endif()

set(QT_SERIES "5" CACHE STRING "The Qt series to be used.")
  
###############################################################################
## fixed values

set(MIKTEX_HQ_BASE_URL_NO_SLASH "https://miktex.org")
set(MIKTEX_HQ_BASE_URL "${MIKTEX_HQ_BASE_URL_NO_SLASH}/")

set(MIKTEX_DOC_BASE_URL_NO_SLASH "https://docs.miktex.org")
set(MIKTEX_DOC_BASE_URL "${MIKTEX_DOC_BASE_URL_NO_SLASH}/")

set(MIKTEX_PREFIX "miktex-")
set(MIKTEX_ADMIN_SUFFIX "_admin")
set(MIKTEX_STANDALONE_SUFFIX "_standalone")

## autotools compatibility names
set(PACKAGE_NAME ${MIKTEX_PRODUCT_NAME})
set(top_srcdir "${CMAKE_SOURCE_DIR}")

if(MIKTEX_NATIVE_WINDOWS)
    set(MIKTEX_DEV_NULL "nul")
else()
    set(MIKTEX_DEV_NULL "/dev/null")
endif()

if(MIKTEX_MACOS_BUNDLE)
    set(MIKTEX_CODESIGN_IDENTITY "Developer ID")
endif()

###############################################################################
## version information

string(TIMESTAMP MIKTEX_DATETIME_STR UTC)

if(MIKTEX_MONTH_VERSION EQUAL 1)
    set(MIKTEX_MONTH_NAME_VERSION "January")
elseif(MIKTEX_MONTH_VERSION EQUAL 2)
    set(MIKTEX_MONTH_NAME_VERSION "February")
elseif(MIKTEX_MONTH_VERSION EQUAL 3)
    set(MIKTEX_MONTH_NAME_VERSION "March")
elseif(MIKTEX_MONTH_VERSION EQUAL 4)
    set(MIKTEX_MONTH_NAME_VERSION "April")
elseif(MIKTEX_MONTH_VERSION EQUAL 5)
    set(MIKTEX_MONTH_NAME_VERSION "May")
elseif(MIKTEX_MONTH_VERSION EQUAL 6)
    set(MIKTEX_MONTH_NAME_VERSION "June")
elseif(MIKTEX_MONTH_VERSION EQUAL 7)
    set(MIKTEX_MONTH_NAME_VERSION "July")
elseif(MIKTEX_MONTH_VERSION EQUAL 8)
    set(MIKTEX_MONTH_NAME_VERSION "August")
elseif(MIKTEX_MONTH_VERSION EQUAL 9)
    set(MIKTEX_MONTH_NAME_VERSION "September")
elseif(MIKTEX_MONTH_VERSION EQUAL 10)
    set(MIKTEX_MONTH_NAME_VERSION "October")
elseif(MIKTEX_MONTH_VERSION EQUAL 11)
    set(MIKTEX_MONTH_NAME_VERSION "November")
elseif(MIKTEX_MONTH_VERSION EQUAL 12)
    set(MIKTEX_MONTH_NAME_VERSION "December")
endif()  

if(MIKTEX_LINUX)
    set(MIKTEX_LINUX_DIST
        "ubuntu"
        CACHE STRING
        "The Linux distribution (ubuntu, debian, fedora, ...)."
    )
    set(MIKTEX_LINUX_DIST_VERSION
        "16.04"
        CACHE STRING
        "The Linux distribution version (16.04, 9, 28, ...)."
    )
    set(MIKTEX_LINUX_DIST_CODE_NAME
        "xenial"
        CACHE STRING
        "The Linux distribution code name (xenial, stretch, ...)."
    )
endif()

## the release state; one of:
##   0 (stable)
##   1 (next)
##   4 (debug)
set(MIKTEX_RELEASE_STATE
    0
    CACHE STRING
    "The MiKTeX release state."
)

## sanity check
if(MIKTEX_RELEASE_STATE EQUAL 0)
elseif(MIKTEX_RELEASE_STATE EQUAL 1)
elseif(MIKTEX_RELEASE_STATE EQUAL 4)
else()
    message("${MIKTEX_RELEASE_STATE} is an unknown release state.")
    message("Falling back to release state 4 (debug).")
    set(MIKTEX_RELEASE_STATE
        4
        CACHE STRING
        "MiKTeX release state; one of 0 (stable), 1 (next), 4 (debug)."
        FORCE
    )
endif()

find_package(Git)

add_custom_target(gen-git-info
    COMMAND ${CMAKE_COMMAND}
        -D GIT_FOUND=${Git_FOUND}
        -D GIT_EXECUTABLE=${GIT_EXECUTABLE}
        -D SOURCE_DIR=${CMAKE_SOURCE_DIR}
        -D GITINFO_H_IN=${CMAKE_SOURCE_DIR}/include/miktex/GitInfo.h.in
        -D GITINFO_H=${CMAKE_BINARY_DIR}/include/miktex/GitInfo.h
        -P ${CMAKE_CURRENT_SOURCE_DIR}/gen-git-info.cmake
)

set(MIKTEX_MAJOR_MINOR_STR
    "${MIKTEX_MAJOR_VERSION}.${MIKTEX_MINOR_VERSION}"
)

set(MIKTEX_MAJOR_MINOR_PATCH_STR
    "${MIKTEX_MAJOR_VERSION}.${MIKTEX_MINOR_VERSION}.${MIKTEX_PATCH_VERSION}"
)

set(MIKTEX_PACKAGES_MAJOR_MINOR_STR
    "${MIKTEX_PACKAGES_MAJOR_VERSION}.${MIKTEX_PACKAGES_MINOR_VERSION}"
)

if(MIKTEX_NATIVE_WINDOWS)
    set(MIKTEX_COM_MAJOR_MINOR_STR
        "${MIKTEX_COM_MAJOR_VERSION}.${MIKTEX_COM_MINOR_VERSION}"
    )
    set(MIKTEX_COM_MAJOR_MINOR_ID_STR
        "${MIKTEX_COM_MAJOR_VERSION}_${MIKTEX_COM_MINOR_VERSION}"
    )
    math(
        EXPR
        MIKTEX_COM_MAJOR_MINOR_INT
        "(100 * ${MIKTEX_COM_MAJOR_VERSION}) + ${MIKTEX_COM_MINOR_VERSION}"
    )
endif()

math(
    EXPR
    MIKTEX_MAJOR_MINOR_INT
    "(100 * ${MIKTEX_MAJOR_VERSION}) + ${MIKTEX_MINOR_VERSION}"
)

math(
    EXPR
    MIKTEX_MAJOR_MINOR_PATCH_INT
    "(10000 * ${MIKTEX_MAJOR_VERSION}) + (100 * ${MIKTEX_MINOR_VERSION}) + ${MIKTEX_PATCH_VERSION}"
)

if(MIKTEX_RELEASE_STATE EQUAL 0)
    if(MIKTEX_PATCH_VERSION EQUAL 0)
        set(default_miktex_display_version_str "${MIKTEX_MAJOR_MINOR_STR}")
        set(default_miktex_version_str "${MIKTEX_MAJOR_MINOR_STR}")
    else()
        set(default_miktex_display_version_str "${MIKTEX_MAJOR_MINOR_PATCH_STR}")
        set(default_miktex_version_str "${MIKTEX_MAJOR_MINOR_PATCH_STR}")
    endif()
elseif(MIKTEX_RELEASE_STATE EQUAL 1)
    if(MIKTEX_PATCH_VERSION EQUAL 0)
        set(default_miktex_display_version_str "${MIKTEX_MAJOR_MINOR_STR} NEXT")
        set(default_miktex_version_str "${MIKTEX_MAJOR_MINOR_STR}-next")
    else()
        set(default_miktex_display_version_str "${MIKTEX_MAJOR_MINOR_PATCH_STR} NEXT")
        set(default_miktex_version_str "${MIKTEX_MAJOR_MINOR_PATCH_STR}-next")
    endif()
elseif(MIKTEX_RELEASE_STATE EQUAL 4)
    if(MIKTEX_PATCH_VERSION EQUAL 0)
        set(default_miktex_display_version_str "${MIKTEX_MAJOR_MINOR_STR} debug")
        set(default_miktex_version_str "${MIKTEX_MAJOR_MINOR_STR}-debug")
    else()
        set(default_miktex_display_version_str "${MIKTEX_MAJOR_MINOR_PATCH_STR} debug")
        set(default_miktex_version_str "${MIKTEX_MAJOR_MINOR_PATCH_STR}-debug")
    endif()
endif()

set(MIKTEX_DISPLAY_VERSION_STR
    "${default_miktex_display_version_str}"
    CACHE STRING
    "The MiKTeX version presented to the user."
    FORCE
)

set(MIKTEX_VERSION_STR
    "${default_miktex_version_str}"
    CACHE STRING
    "The MiKTeX version."
    FORCE
)

if(MIKTEX_RELEASE_STATE EQUAL 1)
    set(MIKTEX_DEFAULT_PACKAGE_STREAM "next")
else()
    set(MIKTEX_DEFAULT_PACKAGE_STREAM "stable")
endif()

set(MIKTEX_LEGACY_MAJOR_MINOR_STR "${MIKTEX_LEGACY_MAJOR_VERSION}.${MIKTEX_LEGACY_MINOR_VERSION}")

###############################################################################
## Localization

set(MIKTEX_INTERNAL_LOCALE "en")

#LIST(APPEND MIKTEX_TRANSLATION_LOCALES "af")
#LIST(APPEND MIKTEX_TRANSLATION_LOCALES "ar")
#LIST(APPEND MIKTEX_TRANSLATION_LOCALES "ca")
#LIST(APPEND MIKTEX_TRANSLATION_LOCALES "cs")
LIST(APPEND MIKTEX_TRANSLATION_LOCALES "de")
#LIST(APPEND MIKTEX_TRANSLATION_LOCALES "es")
#LIST(APPEND MIKTEX_TRANSLATION_LOCALES "fa")
#LIST(APPEND MIKTEX_TRANSLATION_LOCALES "fo")
#LIST(APPEND MIKTEX_TRANSLATION_LOCALES "fr")
#LIST(APPEND MIKTEX_TRANSLATION_LOCALES "it")
#LIST(APPEND MIKTEX_TRANSLATION_LOCALES "ja")
#LIST(APPEND MIKTEX_TRANSLATION_LOCALES "ko")
#LIST(APPEND MIKTEX_TRANSLATION_LOCALES "nl")
#LIST(APPEND MIKTEX_TRANSLATION_LOCALES "nn")
#LIST(APPEND MIKTEX_TRANSLATION_LOCALES "pl")
#LIST(APPEND MIKTEX_TRANSLATION_LOCALES "pt")
#LIST(APPEND MIKTEX_TRANSLATION_LOCALES "ru")
#LIST(APPEND MIKTEX_TRANSLATION_LOCALES "sk")
#LIST(APPEND MIKTEX_TRANSLATION_LOCALES "sl")
#LIST(APPEND MIKTEX_TRANSLATION_LOCALES "sr")
#LIST(APPEND MIKTEX_TRANSLATION_LOCALES "tr")
#LIST(APPEND MIKTEX_TRANSLATION_LOCALES "uk")
#LIST(APPEND MIKTEX_TRANSLATION_LOCALES "vi")
LIST(APPEND MIKTEX_TRANSLATION_LOCALES "zh_CN")
#LIST(APPEND MIKTEX_TRANSLATION_LOCALES "zh_TW")

set(MIKTEX_TRANSLATION_THRESHOLD 50)

set(MIKTEX_TRANSLATION_PROGRESS__af 0)
set(MIKTEX_TRANSLATION_PROGRESS__ar 0)
set(MIKTEX_TRANSLATION_PROGRESS__ca 0)
set(MIKTEX_TRANSLATION_PROGRESS__cs 0)
set(MIKTEX_TRANSLATION_PROGRESS__de 51)
set(MIKTEX_TRANSLATION_PROGRESS__es 0)
set(MIKTEX_TRANSLATION_PROGRESS__fa 0)
set(MIKTEX_TRANSLATION_PROGRESS__fo 0)
set(MIKTEX_TRANSLATION_PROGRESS__fr 0)
set(MIKTEX_TRANSLATION_PROGRESS__it 0)
set(MIKTEX_TRANSLATION_PROGRESS__ja 0)
set(MIKTEX_TRANSLATION_PROGRESS__ko 0)
set(MIKTEX_TRANSLATION_PROGRESS__nl 0)
set(MIKTEX_TRANSLATION_PROGRESS__nn 0)
set(MIKTEX_TRANSLATION_PROGRESS__pl 0)
set(MIKTEX_TRANSLATION_PROGRESS__pt 0)
set(MIKTEX_TRANSLATION_PROGRESS__ru 0)
set(MIKTEX_TRANSLATION_PROGRESS__sk 0)
set(MIKTEX_TRANSLATION_PROGRESS__sl 0)
set(MIKTEX_TRANSLATION_PROGRESS__sr 0)
set(MIKTEX_TRANSLATION_PROGRESS__tr 0)
set(MIKTEX_TRANSLATION_PROGRESS__uk 0)
set(MIKTEX_TRANSLATION_PROGRESS__vi 0)
set(MIKTEX_TRANSLATION_PROGRESS__zh_CN 51)
set(MIKTEX_TRANSLATION_PROGRESS__zh_TW 0)

foreach(l ${MIKTEX_TRANSLATION_LOCALES})
    if(MIKTEX_TRANSLATION_PROGRESS__${l} GREATER_EQUAL MIKTEX_TRANSLATION_THRESHOLD)
        list(APPEND MIKTEX_TRANSLATION_DONE_LOCALES ${l})
    endif()
endforeach()

###############################################################################
## Endianess

include(TestBigEndian)
test_big_endian(MIKTEX_WORDS_BIGENDIAN)

###############################################################################
## CMake modules

include(Admin/COM/guids.cmake)

include(FindPackageHandleStandardArgs)
include(GNUInstallDirs)

include(AddLinkFlags)
include(CheckCCompilerFlag)
include(CheckCXXCompilerFlag)
include(CheckFunctionExists)
include(CheckIncludeFileCXX)
include(CheckIncludeFiles)
include(CheckStructHasMember)
include(CheckSymbolExists)
include(CheckTypeSize)
include(CheckVariableExists)
include(ConfigNames)
include(CreateDllWrapper)
include(CreateWebApp)
include(DefaultCharTypeIsUnsigned)
include(DelayLoad)
include(ExecutableNames)
include(InstallPaths)
include(GenerateExportHeader)
include(LibraryNames)
include(RuntimePaths)
include(SetSharedLibraryVersion)
include(SourcePaths)
include(UseStaticCRT)
include(IgnoreWarnings)

###############################################################################
## build sandbox

set(MIKTEX_SANDBOX_SOURCE_DIR "${CMAKE_SOURCE_DIR}/sandbox")
set(MIKTEX_SANDBOX_BINARY_DIR "${CMAKE_BINARY_DIR}/sandbox")
set(MIKTEX_SANDBOX_USER_CONFIG_DIR "${MIKTEX_SANDBOX_BINARY_DIR}" CACHE PATH "MiKTeX user config root.")
set(MIKTEX_SANDBOX_USER_DATA_DIR "${MIKTEX_SANDBOX_BINARY_DIR}" CACHE PATH "MiKTeX user data root.")
set(MIKTEX_SANDBOX_USER_INSTALL_DIR "${MIKTEX_SANDBOX_BINARY_DIR}" CACHE PATH "MiKTeX user install root.")
set(MIKTEX_SANDBOX_USER_ROOTS "" CACHE PATH  "MiKTeX user roots")

configure_file(
    sandbox/miktex/config/miktexstartup.ini.in
    ${MIKTEX_SANDBOX_BINARY_DIR}/miktex/config/miktexstartup.ini
)

configure_file(
    sandbox/miktex/config/miktex.ini.in
    ${MIKTEX_SANDBOX_BINARY_DIR}/miktex/config/miktex.ini
)

configure_file(
    Admin/ConfigFiles/win/log4cxx.win.xml
    ${MIKTEX_SANDBOX_BINARY_DIR}/miktex/config/win/log4cxx.win.xml
    COPYONLY
)

configure_file(
    Admin/ConfigFiles/unx/log4cxx.unx.xml
    ${MIKTEX_SANDBOX_BINARY_DIR}/miktex/config/unx/log4cxx.unx.xml
    COPYONLY
)

set(MIKTEX_AUTO_MAINTENANCE_LOCK "A6D646EE9FBF44D6A3E6C1A3A72FF7E3.lock")

# disable maintenance tasks while building
file(WRITE
    ${MIKTEX_SANDBOX_BINARY_DIR}/${MIKTEX_REL_MIKTEX_LOCK_DIR}/${MIKTEX_AUTO_MAINTENANCE_LOCK}
    "-1\npermanently-locked\n"
)

set(outdir "${MIKTEX_SANDBOX_BINARY_DIR}/${MIKTEX_REL_MIKTEX_BIN_DIR}")

set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${outdir}")
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG "${outdir}")
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE "${outdir}")
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELWITHDEBINFO "${outdir}")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${outdir}")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG "${outdir}")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE "${outdir}")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELWITHDEBINFO "${outdir}")
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${outdir}")
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG "${outdir}")
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE "${outdir}")
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELWITHDEBINFO "${outdir}")

###############################################################################
## bootstrapping packages

if(WITH_BOOTSTRAPPING)
    list(APPEND MIKTEX_BOOTSTRAPPING_PACKAGES
        miktex-config-${MIKTEX_LEGACY_MAJOR_MINOR_STR}
        miktex-dvips
        miktex-fontconfig
        miktex-misc
        tetex
    )
endif()

###############################################################################
## RPATH handling

if (NOT CMAKE_INSTALL_RPATH)
  if(APPLE)
    set(CMAKE_MACOSX_RPATH TRUE)
    set(CMAKE_INSTALL_RPATH "@loader_path/../${CMAKE_INSTALL_LIBDIR}")
  else()
    set(CMAKE_INSTALL_RPATH "$ORIGIN/../${CMAKE_INSTALL_LIBDIR}")
  endif()
endif()

###############################################################################
## find/check stuff

if(MIKTEX_NATIVE_WINDOWS)
    if(WITH_LEGACY_WINDOWS_SUPPORT)
        add_definitions(
            -DMIKTEX_SUPPORT_LEGACY_WINDOWS
        )
        add_definitions(
            -DWINVER=0x0600
            -D_WIN32_WINNT=0x0600
        )
        set(CMAKE_C_CREATE_WIN32_EXE /SUBSYSTEM:WINDOWS,6.00)
        set(CMAKE_C_CREATE_CONSOLE_EXE /SUBSYSTEM:CONSOLE,6.00)
        set(CMAKE_CXX_CREATE_WIN32_EXE /SUBSYSTEM:WINDOWS,6.00)
        set(CMAKE_CXX_CREATE_CONSOLE_EXE /SUBSYSTEM:CONSOLE,6.00)
    else()
        add_definitions(
            -DWINVER=0x0a00
            -D_WIN32_WINNT=0x0a00
        )
        set(CMAKE_C_CREATE_WIN32_EXE /SUBSYSTEM:WINDOWS,10.00)
        set(CMAKE_C_CREATE_CONSOLE_EXE /SUBSYSTEM:CONSOLE,10.00)
        set(CMAKE_CXX_CREATE_WIN32_EXE /SUBSYSTEM:WINDOWS,10.00)
        set(CMAKE_CXX_CREATE_CONSOLE_EXE /SUBSYSTEM:CONSOLE,10.00)
    endif()
endif()

set(required_programs
    cat
    diff
    msgfmt
    msgmerge
    sed
    xgettext
    xsltproc
)

if(WITH_MIKTEX_API_DOC)
    list(APPEND required_programs
        doxygen
    )
endif()

if(WITH_MIKTEX_DOC)
    list(APPEND required_programs
        pandoc
    )
endif()

if(WITH_UI_MFC)
    list(APPEND required_programs
        hhc
        makehm
    )
endif()

if(MSVC)
    list(APPEND required_programs
        mc
        midl
        mt
    )
endif()

if(WITH_BOOTSTRAPPING)
    list(APPEND required_programs
        curl
    )
endif()

foreach(p ${required_programs})
    string(TOUPPER "${p}" p_u)
    find_program(${p_u}_EXECUTABLE NAMES ${p})
    if(NOT ${p_u}_EXECUTABLE)
        message(FATAL_ERROR "The program ${p} could not be found.")
    endif()
endforeach()

if(WITH_MIKTEX_DOC)
    if(MIKTEX_NATIVE_WINDOWS)
        set(fop_name fop.cmd)
    else()
        set(fop_name fop)
    endif()
    find_program(FOP_EXECUTABLE NAMES ${fop_name})
    if(NOT FOP_EXECUTABLE)
        message(FATAL_ERROR "The program ${fop_name} could not be found.")
    endif()
endif()

find_package(BISON REQUIRED)
find_package(FLEX REQUIRED)
#not needed: find_package(ImageMagick REQUIRED)
#not needed: find_package(PythonInterp REQUIRED)
find_package(Threads REQUIRED)

if(MIKTEX_MACOS_BUNDLE)
    find_library(CoreFoundation CoreFoundation)
endif()

if(WITH_UI_QT)
    set(required_qt_components
        Concurrent
        Core
        Gui
        LinguistTools
        PrintSupport
        Qml
        Script
        ScriptTools
        UiTools
        Widgets
        Xml
    )
    if(MIKTEX_NATIVE_WINDOWS)
        list(APPEND required_qt_components
            WinExtras
        )
    endif()
    if(MIKTEX_UNIX_ALIKE AND NOT MIKTEX_MACOS_BUNDLE)
        list(APPEND required_qt_components
            DBus
        )
    endif()
    find_package(Qt${QT_SERIES} REQUIRED ${required_qt_components})
endif()

if(USE_SYSTEM_APR)
    find_package(APR REQUIRED)
endif()

if(USE_SYSTEM_APRUTIL)
    find_package(APRUTIL REQUIRED)
endif()

if(USE_SYSTEM_BOOST)
    if(MIKTEX_NATIVE_WINDOWS)
        set(Boost_USE_STATIC_LIBS ON)
        set(Boost_USE_DEBUG_LIBS ON)
        set(Boost_USE_RELEASE_LIBS ON)
        set(Boost_USE_MULTITHREADED ON)
        set(Boost_USE_STATIC_RUNTIME OFF)
    endif()
    find_package(Boost REQUIRED locale)
endif()

if(USE_SYSTEM_BZIP2)
    find_package(BZip2 REQUIRED)
endif()

if(USE_SYSTEM_CAIRO)
    find_package(CAIRO REQUIRED)
endif()

if(USE_SYSTEM_CURL)
    find_package(CURL REQUIRED)
endif()

if(USE_SYSTEM_EXPAT)
    find_package(EXPAT REQUIRED)
endif()

if(USE_SYSTEM_FMT)
    find_package(FMT REQUIRED)
endif()

if(USE_SYSTEM_FONTCONFIG)
    find_package(FONTCONFIG REQUIRED)
endif()

if(USE_SYSTEM_FREETYPE2)
    find_package(Freetype REQUIRED)
endif()

if(USE_SYSTEM_FRIBIDI)
    find_package(FRIBIDI REQUIRED)
endif()

if(USE_SYSTEM_GD)
    find_package(GD REQUIRED)
endif()

if(USE_SYSTEM_GMP)
    find_package(GMP REQUIRED)
endif()

if(USE_SYSTEM_GRAPHITE2)
    find_package(GRAPHITE2 REQUIRED)
endif()

if(USE_SYSTEM_HARFBUZZ)
    find_package(HARFBUZZ REQUIRED)
endif()

if(USE_SYSTEM_HARFBUZZ_ICU)
    find_package(HARFBUZZ_ICU REQUIRED)
endif()

if(USE_SYSTEM_HUNSPELL)
    find_package(HUNSPELL REQUIRED)
endif()

if(USE_SYSTEM_ICU)
    find_package(ICU REQUIRED COMPONENTS i18n uc)
endif()

if(USE_SYSTEM_JPEG)
    find_package(JPEG REQUIRED)
endif()

if(USE_SYSTEM_LOG4CXX)
    find_package(LOG4CXX REQUIRED)
endif()

if(USE_SYSTEM_LZMA)
    find_package(LibLZMA REQUIRED)
endif()

if(USE_SYSTEM_MPFR)
    find_package(MPFR REQUIRED)
endif()

if(USE_SYSTEM_MSPACK)
    find_package(MSPACK REQUIRED)
endif()

if(USE_SYSTEM_OPENGL)
    find_package(OpenGL REQUIRED)
endif()

if(USE_SYSTEM_OPENSSL_CRYPTO)
    find_package(OpenSSL REQUIRED)
endif()

if(USE_SYSTEM_PIXMAN)
    find_package(PIXMAN REQUIRED)
endif()

if(USE_SYSTEM_PNG)
    find_package(PNG REQUIRED)
endif()

if(USE_SYSTEM_POPT)
    find_package(POPT REQUIRED)
endif()

if(USE_SYSTEM_POPPLER)
    find_package(POPPLER REQUIRED)
endif()

if(USE_SYSTEM_POPPLER_QT AND WITH_UI_QT)
    find_package(POPPLER_QT${QT_SERIES} REQUIRED)
endif()

if(USE_SYSTEM_URIPARSER)
    find_package(URIPARSER REQUIRED)
endif()

if(USE_SYSTEM_ZLIB)
    find_package(ZLIB REQUIRED)
endif()

if(USE_SYSTEM_ZZIP)
    find_package(ZZIP REQUIRED)
endif()

if(MSVC)
    set(HAVE_PRAGMA_ONCE TRUE)
endif()

if(MIKTEX_NATIVE_WINDOWS AND MSVC)
    check_symbol_exists(alloca "malloc.h" HAVE_ALLOCA)
else()
    check_function_exists(alloca HAVE_ALLOCA)
endif()

check_symbol_exists(ntohl arpa/inet.h NEED_ARPA_INET_H)

check_function_exists(_mktemp_s HAVE__MKTEMP_S)
check_function_exists(access HAVE_ACCESS)
check_function_exists(arc4random_buf HAVE_ARC4RANDOM_BUF)
check_function_exists(chdir HAVE_CHDIR)
check_function_exists(chmod HAVE_CHMOD)
check_function_exists(chown HAVE_CHOWN)
check_function_exists(closedir HAVE_CLOSEDIR)
check_function_exists(confstr HAVE_CONFSTR)
check_function_exists(ctime HAVE_CTIME)
check_function_exists(finite HAVE_FINITE)
check_function_exists(fork HAVE_FORK)
check_function_exists(fseeko64 HAVE_FSEEKO64)
check_function_exists(fstatfs HAVE_FSTATFS)
check_function_exists(fstatvfs HAVE_FSTATVFS)
check_function_exists(ftello64 HAVE_FTELLO64)
check_function_exists(ftime HAVE_FTIME)
check_function_exists(futimes HAVE_FUTIMES)
check_function_exists(getcwd HAVE_GETCWD)
check_function_exists(getenv HAVE_GETENV)
check_function_exists(geteuid HAVE_GETEUID)
check_function_exists(getopt_long HAVE_GETOPT_LONG)
check_function_exists(getpagesize HAVE_GETPAGESIZE)
check_function_exists(getpid HAVE_GETPID)
check_function_exists(getprogname HAVE_GETPROGNAME)
check_function_exists(getrandom HAVE_GETRANDOM)
check_function_exists(gettimeofday HAVE_GETTIMEOFDAY)
check_function_exists(link HAVE_LINK)
check_function_exists(lrand48 HAVE_LRAND48)
check_function_exists(lstat HAVE_LSTAT)
check_function_exists(memcmp HAVE_MEMCMP)
check_function_exists(memmove HAVE_MEMMOVE)
check_function_exists(memset HAVE_MEMSET)
check_function_exists(mkdir HAVE_MKDIR)
check_function_exists(mkostemp HAVE_MKOSTEMP)
check_function_exists(mkstemp HAVE_MKSTEMP)
check_function_exists(mmap HAVE_MMAP)
check_function_exists(open HAVE_OPEN)
check_function_exists(opendir HAVE_OPENDIR)
check_function_exists(pclose HAVE_PCLOSE)
check_function_exists(popen HAVE_POPEN)
check_function_exists(posix_fadvise HAVE_POSIX_FADVISE)
check_function_exists(putenv HAVE_PUTENV)
check_function_exists(rand HAVE_RAND)
check_function_exists(rand_r HAVE_RAND_R)
check_function_exists(random HAVE_RANDOM)
check_function_exists(random_r HAVE_RANDOM_R)
check_function_exists(readdir HAVE_READDIR)
check_function_exists(readlink HAVE_READLINK)
check_function_exists(reallocarray HAVE_REALLOCARRAY)
check_function_exists(regexec HAVE_REGEXEC)
check_function_exists(rmdir HAVE_RMDIR)
check_function_exists(sched_yield HAVE_SCHED_YIELD)
check_function_exists(setenv HAVE_SETENV)
check_function_exists(setreuid HAVE_SETREUID)
check_function_exists(setuid HAVE_SETUID)
check_function_exists(sigaction HAVE_SIGACTION)
check_function_exists(spawnvp HAVE_SPAWNVP)
check_function_exists(stat HAVE_STAT)
check_function_exists(statvfs HAVE_STATVFS)
check_function_exists(stpcpy HAVE_DECL_STPCPY)
check_function_exists(strcasecmp HAVE_STRCASECMP)
check_function_exists(strchr HAVE_STRCHR)
check_function_exists(strdup HAVE_STRDUP)
check_function_exists(strerror HAVE_STRERROR)
check_function_exists(strlwr HAVE_STRLWR)
check_function_exists(strnlen HAVE_STRNLEN)
check_function_exists(strrchr HAVE_STRRCHR)
check_function_exists(strtok_r HAVE_STRTOK_R)
check_function_exists(strtol HAVE_STRTOL)
check_function_exists(strtoll HAVE_STRTOLL)
check_function_exists(uname HAVE_UNAME_SYSCALL)
check_function_exists(unlink HAVE_UNLINK)
check_function_exists(utime HAVE_UTIME)
check_function_exists(vfork HAVE_VFORK)
check_function_exists(vprintf HAVE_VPRINTF)
check_function_exists(waitpid HAVE_WAITPID)

if(WITH_UI_MFC)
    set(HAVE_AFXWIN_H "YES")
endif()

if(WITH_COM)
    set(HAVE_ATLBASE_H "YES")
endif()

check_include_files(alloca.h HAVE_ALLOCA_H)
check_include_files(arpa/inet.h HAVE_ARPA_INET_H)
check_include_files(assert.h HAVE_ASSERT_H)
check_include_files(byteorder.h HAVE_BYTEORDER_H)
check_include_files(dirent.h HAVE_DIRENT_H)
check_include_files(errno.h HAVE_ERRNO_H)
check_include_files(fcntl.h HAVE_FCNTL_H)
check_include_files(float.h HAVE_FLOAT_H)
check_include_files(inttypes.h HAVE_INTTYPES_H)
check_include_files(io.h HAVE_IO_H)
check_include_files(libgen.h HAVE_LIBGEN_H)
check_include_files(libintl.h HAVE_LIBINTL_H)
check_include_files(limits.h HAVE_LIMITS_H)
check_include_files(mcheck.h HAVE_MCHECK_H)
check_include_files(memory.h HAVE_MEMORY_H)
check_include_files(ndir.h HAVE_NDIR_H)
check_include_files(netinet/in.h HAVE_NETINET_IN_H)
check_include_files(stat.h HAVE_STAT_H)
check_include_files(stdbool.h HAVE_STDBOOL_H)
check_include_files(stdarg.h HAVE_STDARG_H)
check_include_files(stddef.h HAVE_STDDEF_H)
check_include_files(stdint.h HAVE_STDINT_H)
check_include_files(stdlib.h HAVE_STDLIB_H)
check_include_files(string.h HAVE_STRING_H)
check_include_files(strings.h HAVE_STRINGS_H)
check_include_files(sys/dir.h HAVE_SYS_DIR_H)
check_include_files(sys/mman.h HAVE_SYS_MMAN_H)
check_include_files(sys/mount.h HAVE_SYS_MOUNT_H)
check_include_files(sys/ndir.h HAVE_SYS_NDIR_H)
check_include_files(sys/param.h HAVE_SYS_PARAM_H)
check_include_files(sys/stat.h HAVE_SYS_STAT_H)
check_include_files(sys/statfs.h HAVE_SYS_STATFS_H)
check_include_files(sys/statvfs.h HAVE_SYS_STATVFS_H)
check_include_files(sys/time.h HAVE_SYS_TIME_H)
check_include_files(sys/timeb.h HAVE_SYS_TIMEB_H)
check_include_files(sys/types.h HAVE_SYS_TYPES_H)
check_include_files(sys/utime.h HAVE_SYS_UTIME_H)
check_include_files(sys/utsname.h HAVE_SYS_UTSNAME_H)
check_include_files(sys/wait.h HAVE_SYS_WAIT_H)
check_include_files(sys/vfs.h HAVE_SYS_VFS_H)
check_include_files(unistd.h HAVE_UNISTD_H)
check_include_files(utime.h HAVE_UTIME_H)

check_include_files(sched.h HAVE_SCHED_H)

check_struct_has_member("struct dirent" d_type dirent.h HAVE_STRUCT_DIRENT_D_TYPE)
check_struct_has_member("struct stat" st_mtim sys/stat.h HAVE_STRUCT_STAT_ST_MTIM)
check_struct_has_member("struct statfs" f_flags sys/statfs.h HAVE_STRUCT_STATFS_F_FLAGS)
check_struct_has_member("struct statfs" f_fstypename sys/statfs.h HAVE_STRUCT_STATFS_F_FSTYPENAME)
check_struct_has_member("struct statvfs" f_basetype sys/statvfs.h HAVE_STRUCT_STATVFS_F_BASETYPE)
check_struct_has_member("struct statvfs" f_fstypename sys/statvfs.h HAVE_STRUCT_STATVFS_F_FSTYPENAME)
check_struct_has_member("struct tm" tm_gmtoff time.h HAVE_TM_GMTOFF)

check_variable_exists(timezone HAVE_TIMEZONE)

check_type_size("long long" LONG_LONG)
set(SIZEOF_LONG_LONG ${LONG_LONG})
check_type_size("int" SIZEOF_INT)
check_type_size("long" SIZEOF_LONG)

if(HAVE_LIMITS_H)
    set(STDC_HEADERS)
endif()

###############################################################################
## set the build type
##
## the build type is derived from the MiKTeX release state; see
## miktex-version.cmake

if(MIKTEX_RELEASE_STATE EQUAL 0)
    if(MIKTEX_NATIVE_WINDOWS)
        set(CMAKE_BUILD_TYPE "RelWithDebInfo" CACHE STRING "The build type." FORCE)
    else()
        set(CMAKE_BUILD_TYPE "Release" CACHE STRING "The build type." FORCE)
    endif()
elseif(MIKTEX_RELEASE_STATE EQUAL 1)
    if(MIKTEX_NATIVE_WINDOWS)
        set(CMAKE_BUILD_TYPE "RelWithDebInfo" CACHE STRING "The build type." FORCE)
        #add_definitions(-DMIKTEX_DEBUG)
    else()
        set(CMAKE_BUILD_TYPE "Release" CACHE STRING "The build type." FORCE)
    endif()
elseif(MIKTEX_RELEASE_STATE EQUAL 4)
    set(CMAKE_BUILD_TYPE "Debug" CACHE STRING "The build type." FORCE)
    add_definitions(-DMIKTEX_DEBUG)
endif()

mark_as_advanced(CMAKE_BUILD_TYPE)

###############################################################################
## add global definitions

add_definitions(
    -DHAVE_CONFIG_H
    -DMIKTEX
)

if(WITH_UI_QT)
    add_definitions(
        -DMIKTEX_QT
    )
endif()

if(MIKTEX_NATIVE_WINDOWS)
    add_definitions(
        -DMIKTEX_WINDOWS
    )
    if(MSVC)
        ## better bind to latest CRT/MFC DLLs if redistributing as private
        ## assemblies
        add_definitions(
            -D_BIND_TO_CURRENT_ATL_VERSION=1
            -D_BIND_TO_CURRENT_CRT_VERSION=1
            -D_BIND_TO_CURRENT_MFC_VERSION=1
        )
    endif()
    if(WITH_UI_MFC)
        add_definitions(
            -DMIKTEX_ATLMFC
        )
    endif()
    ## use overloads for unsecure functions
    #add_definitions(
    #  -D_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1
    #)
elseif(MIKTEX_UNIX_ALIKE)
    add_definitions(
        -DMIKTEX_UNIX
    )
    if(MIKTEX_MACOS_BUNDLE)
        add_definitions(
            -DMIKTEX_MACOS_BUNDLE
        )
    endif()
endif()

###############################################################################
## add global include directories

include_directories(BEFORE
    ${CMAKE_BINARY_DIR}/include
    ${CMAKE_SOURCE_DIR}/include
)

# TODO: interface library
include_directories(BEFORE
    ${CMAKE_SOURCE_DIR}/${MIKTEX_REL_UI_DIR}/include
)

###############################################################################
## configure files

file(TO_NATIVE_PATH ${CMAKE_SOURCE_DIR} CMAKE_SOURCE_DIR_NATIVE)
file(TO_NATIVE_PATH ${CMAKE_BINARY_DIR} CMAKE_BINARY_DIR_NATIVE)

configure_file(
    include/miktex/Version.h.in
    ${CMAKE_CURRENT_BINARY_DIR}/include/miktex/Version.h
)

configure_file(
    include/miktex/config.h.cmake
    ${CMAKE_CURRENT_BINARY_DIR}/include/miktex/config.h
)

configure_file(
    Doxyfile.in
    ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile
)

configure_file(
    BuildUtilities/docbook/catalog.in
    ${CMAKE_CURRENT_BINARY_DIR}/BuildUtilities/docbook/catalog
)

configure_file(
    Admin/Scripts/makelocfile.cmd.in
    ${CMAKE_CURRENT_BINARY_DIR}/Admin/Scripts/makelocfile.cmd
)

configure_file(
    Admin/Scripts/putj2000version.cmd.in
    ${CMAKE_CURRENT_BINARY_DIR}/Admin/Scripts/putj2000version.cmd
)

###############################################################################
## add/import 3rd party libs
##
## base libraries (on which other libraries depend on) must be defined early

if(USE_SYSTEM_ZLIB)
    get_filename_component(suffix ${ZLIB_LIBRARY} EXT)
    if (suffix STREQUAL CMAKE_SHARED_LIBRARY_SUFFIX)
        add_library(MiKTeX::Imported::ZLIB SHARED IMPORTED)
    else()
        add_library(MiKTeX::Imported::ZLIB STATIC IMPORTED)
    endif()
    set_target_properties(MiKTeX::Imported::ZLIB
        PROPERTIES
        IMPORTED_LOCATION "${ZLIB_LIBRARY}"
        INTERFACE_COMPILE_DEFINITIONS "HAVE_LIBZ=1;HAVE_ZLIB=1;HAVE_ZLIB_H=1;HAVE_ZLIB_COMPRESS2=1"
        INTERFACE_INCLUDE_DIRECTORIES "${ZLIB_INCLUDE_DIRS}"
    )
else()
    add_subdirectory(${MIKTEX_REL_ZLIB_DIR})
endif()

if(USE_SYSTEM_APR)
    get_filename_component(suffix ${APR_LIBRARY} EXT)
    if (suffix STREQUAL CMAKE_SHARED_LIBRARY_SUFFIX)
        add_library(MiKTeX::Imported::APR SHARED IMPORTED)
    else()
        add_library(MiKTeX::Imported::APR STATIC IMPORTED)
    endif()
    set_target_properties(MiKTeX::Imported::APR
        PROPERTIES
        IMPORTED_LOCATION "${APR_LIBRARY}"
        INTERFACE_INCLUDE_DIRECTORIES "${APR_INCLUDE_DIRS}"
    )
else()
    add_subdirectory(${MIKTEX_REL_APR_DIR})
endif()

if(USE_SYSTEM_APRUTIL)
    get_filename_component(suffix ${APRUTIL_LIBRARY} EXT)
    if (suffix STREQUAL CMAKE_SHARED_LIBRARY_SUFFIX)
        add_library(MiKTeX::Imported::APRUTIL SHARED IMPORTED)
    else()
        add_library(MiKTeX::Imported::APRUTIL STATIC IMPORTED)
    endif()
    set_target_properties(MiKTeX::Imported::APRUTIL
        PROPERTIES
        IMPORTED_LOCATION "${APRUTIL_LIBRARY}"
        INTERFACE_INCLUDE_DIRECTORIES "${APRUTIL_INCLUDE_DIRS}"
    )
else()
    add_subdirectory(${MIKTEX_REL_APR_UTIL_DIR})
endif()

if(USE_SYSTEM_BZIP2)
    get_filename_component(suffix ${BZIP2_LIBRARY} EXT)
    if (suffix STREQUAL CMAKE_SHARED_LIBRARY_SUFFIX)
        add_library(MiKTeX::Imported::BZIP2 SHARED IMPORTED)
        set(bzip2_dll_name MiKTeX::Imported::BZIP2)
    else()
        add_library(MiKTeX::Imported::BZIP2 STATIC IMPORTED)
        set(bzip2_lib_name MiKTeX::Imported::BZIP2)
    endif()
    set_target_properties(MiKTeX::Imported::BZIP2
        PROPERTIES
        IMPORTED_LOCATION "${BZIP2_LIBRARY}"
        INTERFACE_INCLUDE_DIRECTORIES "${BZIP2_INCLUDE_DIR}"
    )
else()  
    add_subdirectory(${MIKTEX_REL_BZIP2_DIR})
endif()

if(MIKTEX_NATIVE_WINDOWS)
    add_subdirectory(${MIKTEX_REL_FREEGLUT_DIR})
endif()

if(USE_SYSTEM_FREETYPE2)
    get_filename_component(suffix ${FREETYPE_LIBRARY} EXT)
    if (suffix STREQUAL CMAKE_SHARED_LIBRARY_SUFFIX)
        add_library(MiKTeX::Imported::FREETYPE2 SHARED IMPORTED)
    else()
        add_library(MiKTeX::Imported::FREETYPE2 STATIC IMPORTED)
    endif()
    set_target_properties(MiKTeX::Imported::FREETYPE2
        PROPERTIES
        IMPORTED_LOCATION "${FREETYPE_LIBRARY}"
        INTERFACE_COMPILE_DEFINITIONS "HAVE_FT2BUILD_H=1;HAVE_LIBFREETYPE=1"
        INTERFACE_INCLUDE_DIRECTORIES "${FREETYPE_INCLUDE_DIRS}"
    )
else()
    add_subdirectory(${MIKTEX_REL_FREETYPE2_DIR})
endif()

if(USE_SYSTEM_PIXMAN)
    get_filename_component(suffix ${PIXMAN_LIBRARY} EXT)
    if (suffix STREQUAL CMAKE_SHARED_LIBRARY_SUFFIX)
        add_library(MiKTeX::Imported::PIXMAN SHARED IMPORTED)
    else()
        add_library(MiKTeX::Imported::PIXMAN STATIC IMPORTED)
    endif()
    set_target_properties(MiKTeX::Imported::PIXMAN
        PROPERTIES
        IMPORTED_LOCATION "${PIXMAN_LIBRARY}"
        INTERFACE_INCLUDE_DIRECTORIES "${PIXMAN_INCLUDE_DIRS}"
    )
else()
    add_subdirectory(${MIKTEX_REL_PIXMAN_DIR})
endif()

if(USE_SYSTEM_PNG)
    get_filename_component(suffix ${PNG_LIBRARY} EXT)
    if (suffix STREQUAL CMAKE_SHARED_LIBRARY_SUFFIX)
        add_library(MiKTeX::Imported::PNG SHARED IMPORTED)
    else()
        add_library(MiKTeX::Imported::PNG STATIC IMPORTED)
    endif()
    set_target_properties(MiKTeX::Imported::PNG
        PROPERTIES
        IMPORTED_LOCATION "${PNG_LIBRARY}"
        INTERFACE_COMPILE_DEFINITIONS HAVE_LIBPNG=1
        INTERFACE_INCLUDE_DIRECTORIES "${PNG_INCLUDE_DIRS}"
        INTERFACE_LINK_LIBRARIES MiKTeX::Imported::ZLIB
    )
else()
    add_subdirectory(${MIKTEX_REL_PNG_DIR})
endif()

if(USE_SYSTEM_CAIRO)
    get_filename_component(suffix ${CAIRO_LIBRARY} EXT)
    if (suffix STREQUAL CMAKE_SHARED_LIBRARY_SUFFIX)
        add_library(MiKTeX::Imported::CAIRO SHARED IMPORTED)
    else()
        add_library(MiKTeX::Imported::CAIRO STATIC IMPORTED)
    endif()
    set_target_properties(MiKTeX::Imported::CAIRO
        PROPERTIES
        IMPORTED_LOCATION "${CAIRO_LIBRARY}"
        INTERFACE_INCLUDE_DIRECTORIES "${CAIRO_INCLUDE_DIRS}"
        INTERFACE_LINK_LIBRARIES
            "MiKTeX::Imported::FREETYPE2;MiKTeX::Imported::PIXMAN;MiKTeX::Imported::PNG;MiKTeX::Imported::ZLIB;Threads::Threads"
    )
else()
    add_subdirectory(${MIKTEX_REL_CAIRO_DIR})
endif()

if(USE_SYSTEM_CURL)
    get_filename_component(suffix ${CURL_LIBRARY} EXT)
    if (suffix STREQUAL CMAKE_SHARED_LIBRARY_SUFFIX)
        add_library(MiKTeX::Imported::CURL SHARED IMPORTED)
    else()
        add_library(MiKTeX::Imported::CURL STATIC IMPORTED)
    endif()
    set_target_properties(MiKTeX::Imported::CURL
        PROPERTIES
        IMPORTED_LOCATION "${CURL_LIBRARY}"
        INTERFACE_INCLUDE_DIRECTORIES "${CURL_INCLUDE_DIRS}"
    )
else()
    add_subdirectory(${MIKTEX_REL_CURL_DIR})
endif()

if(USE_SYSTEM_EXPAT)
    get_filename_component(suffix ${EXPAT_LIBRARY} EXT)
    if (suffix STREQUAL CMAKE_SHARED_LIBRARY_SUFFIX)
        add_library(MiKTeX::Imported::EXPAT SHARED IMPORTED)
    else()
        add_library(MiKTeX::Imported::EXPAT STATIC IMPORTED)
    endif()
    set_target_properties(MiKTeX::Imported::EXPAT
        PROPERTIES
        IMPORTED_LOCATION "${EXPAT_LIBRARY}"
        INTERFACE_INCLUDE_DIRECTORIES "${EXPAT_INCLUDE_DIRS}"
    )
else()
    add_subdirectory(${MIKTEX_REL_EXPAT_DIR})
endif()

if(USE_SYSTEM_FMT)
    get_filename_component(suffix ${FMT_LIBRARY} EXT)
    if (suffix STREQUAL CMAKE_SHARED_LIBRARY_SUFFIX)
        add_library(MiKTeX::Imported::FMT SHARED IMPORTED)
    else()
        add_library(MiKTeX::Imported::FMT STATIC IMPORTED)
    endif()
    set_target_properties(MiKTeX::Imported::FMT
        PROPERTIES
        IMPORTED_LOCATION "${FMT_LIBRARY}"
        INTERFACE_INCLUDE_DIRECTORIES "${FMT_INCLUDE_DIRS}"
    )
else()
    add_subdirectory(${MIKTEX_REL_FMT_DIR})
endif()

if(USE_SYSTEM_FONTCONFIG)
    get_filename_component(suffix ${FONTCONFIG_LIBRARY} EXT)
    if (suffix STREQUAL CMAKE_SHARED_LIBRARY_SUFFIX)
        add_library(MiKTeX::Imported::FONTCONFIG SHARED IMPORTED)
    else()
        add_library(MiKTeX::Imported::FONTCONFIG STATIC IMPORTED)
    endif()
    set_target_properties(MiKTeX::Imported::FONTCONFIG
        PROPERTIES
        IMPORTED_LOCATION "${FONTCONFIG_LIBRARY}"
        INTERFACE_COMPILE_DEFINITIONS HAVE_LIBFONTCONFIG=1
        INTERFACE_INCLUDE_DIRECTORIES "${FONTCONFIG_INCLUDE_DIRS}"
    )
else()
    add_subdirectory(${MIKTEX_REL_FONTCONFIG_DIR})
endif()

if(USE_SYSTEM_FRIBIDI)
    get_filename_component(suffix ${FRIBIDI_LIBRARY} EXT)
    if (suffix STREQUAL CMAKE_SHARED_LIBRARY_SUFFIX)
        add_library(MiKTeX::Imported::FRIBIDI SHARED IMPORTED)
    else()
        add_library(MiKTeX::Imported::FRIBIDI STATIC IMPORTED)
    endif()
    set_target_properties(MiKTeX::Imported::FRIBIDI
        PROPERTIES
        IMPORTED_LOCATION "${FRIBIDI_LIBRARY}"
        INTERFACE_INCLUDE_DIRECTORIES "${FRIBIDI_INCLUDE_DIRS}"
    )
else()
    add_subdirectory(${MIKTEX_REL_FRIBIDI_DIR})
endif()

if(USE_SYSTEM_GLM)
    get_filename_component(suffix ${GLM_LIBRARY} EXT)
    if (suffix STREQUAL CMAKE_SHARED_LIBRARY_SUFFIX)
        add_library(MiKTeX::Imported::GLM SHARED IMPORTED)
    else()
        add_library(MiKTeX::Imported::GLM STATIC IMPORTED)
    endif()
    set_target_properties(MiKTeX::Imported::GLM
        PROPERTIES
        IMPORTED_LOCATION "${GLM_LIBRARY}"
        INTERFACE_INCLUDE_DIRECTORIES "${GLM_INCLUDE_DIRS}"
    )
else()
    add_subdirectory(${MIKTEX_REL_GLM_DIR})
endif()

if(USE_SYSTEM_JPEG)
    get_filename_component(suffix ${JPEG_LIBRARY} EXT)
    if (suffix STREQUAL CMAKE_SHARED_LIBRARY_SUFFIX)
        add_library(MiKTeX::Imported::JPEG SHARED IMPORTED)
    else()
        add_library(MiKTeX::Imported::JPEG STATIC IMPORTED)
    endif()
    set_target_properties(MiKTeX::Imported::JPEG
        PROPERTIES
        IMPORTED_LOCATION "${JPEG_LIBRARY}"
        INTERFACE_COMPILE_DEFINITIONS HAVE_LIBJPEG=1
        INTERFACE_INCLUDE_DIRECTORIES "${JPEG_INCLUDE_DIR}"
    )
else()
    add_subdirectory(${MIKTEX_REL_JPEG_DIR})
endif()

if(USE_SYSTEM_GD)
    get_filename_component(suffix ${GD_LIBRARY} EXT)
    if (suffix STREQUAL CMAKE_SHARED_LIBRARY_SUFFIX)
        add_library(MiKTeX::Imported::GD SHARED IMPORTED)
    else()
        add_library(MiKTeX::Imported::GD STATIC IMPORTED)
    endif()
    set_target_properties(MiKTeX::Imported::GD
        PROPERTIES
        IMPORTED_LOCATION "${GD_LIBRARY}"
        INTERFACE_INCLUDE_DIRECTORIES "${GD_INCLUDE_DIRS}"
    )
else()
    add_subdirectory(${MIKTEX_REL_GD_DIR})
endif()

if(USE_SYSTEM_GMP)
    get_filename_component(suffix ${GMP_LIBRARY} EXT)
    if (suffix STREQUAL CMAKE_SHARED_LIBRARY_SUFFIX)
        add_library(MiKTeX::Imported::GMP SHARED IMPORTED)
    else()
        add_library(MiKTeX::Imported::GMP STATIC IMPORTED)
    endif()
    set_target_properties(MiKTeX::Imported::GMP
        PROPERTIES
        IMPORTED_LOCATION "${GMP_LIBRARY}"
        INTERFACE_INCLUDE_DIRECTORIES "${GMP_INCLUDE_DIRS}"
    )
else()
    add_subdirectory(${MIKTEX_REL_GMP_DIR})
endif()

if(USE_SYSTEM_GRAPHITE2)
    get_filename_component(suffix ${GRAPHITE2_LIBRARY} EXT)
    if (suffix STREQUAL CMAKE_SHARED_LIBRARY_SUFFIX)
        add_library(MiKTeX::Imported::GRAPHITE2 SHARED IMPORTED)
    else()
        add_library(MiKTeX::Imported::GRAPHITE2 STATIC IMPORTED)
    endif()
    set_target_properties(MiKTeX::Imported::GRAPHITE2
        PROPERTIES
        IMPORTED_LOCATION "${GRAPHITE2_LIBRARY}"
        INTERFACE_INCLUDE_DIRECTORIES "${GRAPHITE2_INCLUDE_DIRS}"
    )
else()
    add_subdirectory(${MIKTEX_REL_GRAPHITE2_DIR})
endif()

if(USE_SYSTEM_HARFBUZZ)
    get_filename_component(suffix ${HARFBUZZ_LIBRARY} EXT)
    if (suffix STREQUAL CMAKE_SHARED_LIBRARY_SUFFIX)
        add_library(MiKTeX::Imported::HARFBUZZ SHARED IMPORTED)
    else()
        add_library(MiKTeX::Imported::HARFBUZZ STATIC IMPORTED)
    endif()
    set_target_properties(MiKTeX::Imported::HARFBUZZ
        PROPERTIES
        IMPORTED_LOCATION "${HARFBUZZ_LIBRARY}"
        INTERFACE_INCLUDE_DIRECTORIES "${HARFBUZZ_INCLUDE_DIRS}"
    )
else()
    add_subdirectory(${MIKTEX_REL_HARFBUZZ_DIR})
endif()

if(USE_SYSTEM_HARFBUZZ_ICU)
    get_filename_component(suffix ${HARFBUZZ_ICU_LIBRARY} EXT)
    if (suffix STREQUAL CMAKE_SHARED_LIBRARY_SUFFIX)
        add_library(MiKTeX::Imported::HARFBUZZ_ICU SHARED IMPORTED)
    else()
        add_library(MiKTeX::Imported::HARFBUZZ_ICU STATIC IMPORTED)
    endif()
    set_target_properties(MiKTeX::Imported::HARFBUZZ_ICU
        PROPERTIES
        IMPORTED_LOCATION "${HARFBUZZ_ICU_LIBRARY}"
        INTERFACE_INCLUDE_DIRECTORIES "${HARFBUZZ_ICU_INCLUDE_DIRS}"
    )
else()
    #add_subdirectory(${MIKTEX_REL_HARFBUZZ_DIR})
endif()

if(USE_SYSTEM_HUNSPELL)
    get_filename_component(suffix ${HUNSPELL_LIBRARY} EXT)
    if (suffix STREQUAL CMAKE_SHARED_LIBRARY_SUFFIX)
        add_library(MiKTeX::Imported::HUNSPELL SHARED IMPORTED)
    else()
        add_library(MiKTeX::Imported::HUNSPELL STATIC IMPORTED)
    endif()
    set_target_properties(MiKTeX::Imported::HUNSPELL
        PROPERTIES
        IMPORTED_LOCATION "${HUNSPELL_LIBRARY}"
        INTERFACE_INCLUDE_DIRECTORIES "${HUNSPELL_INCLUDE_DIRS}"
    )
else()
    add_subdirectory(${MIKTEX_REL_HUNSPELL_DIR})
endif()

if(USE_SYSTEM_LOG4CXX)
    get_filename_component(suffix ${LOG4CXX_LIBRARY} EXT)
    if (suffix STREQUAL CMAKE_SHARED_LIBRARY_SUFFIX)
        add_library(MiKTeX::Imported::LOG4CXX SHARED IMPORTED)
    else()
        add_library(MiKTeX::Imported::LOG4CXX STATIC IMPORTED)
    endif()
    set_target_properties(MiKTeX::Imported::LOG4CXX
        PROPERTIES
        IMPORTED_LOCATION "${LOG4CXX_LIBRARY}"
        INTERFACE_INCLUDE_DIRECTORIES "${LOG4CXX_INCLUDE_DIRS}"
    )
else()
    add_subdirectory(${MIKTEX_REL_LOG4CXX_DIR})
endif()

if(USE_SYSTEM_LZMA)
    get_filename_component(suffix ${LIBLZMA_LIBRARY} EXT)
    if (suffix STREQUAL CMAKE_SHARED_LIBRARY_SUFFIX)
        add_library(MiKTeX::Imported::LZMA SHARED IMPORTED)
    else()
        add_library(MiKTeX::Imported::LZMA STATIC IMPORTED)
    endif()
    set_target_properties(MiKTeX::Imported::LZMA
        PROPERTIES
        IMPORTED_LOCATION "${LIBLZMA_LIBRARY}"
        INTERFACE_INCLUDE_DIRECTORIES "${LIBLZMA_INCLUDE_DIRS}"
    )
else()
    add_subdirectory(${MIKTEX_REL_XZ_DIR})
endif()

if(USE_SYSTEM_MPFR)
    get_filename_component(suffix ${MPFR_LIBRARY} EXT)
    if (suffix STREQUAL CMAKE_SHARED_LIBRARY_SUFFIX)
        add_library(MiKTeX::Imported::MPFR SHARED IMPORTED)
    else()
        add_library(MiKTeX::Imported::MPFR STATIC IMPORTED)
    endif()
    set_target_properties(MiKTeX::Imported::MPFR
        PROPERTIES
        IMPORTED_LOCATION "${MPFR_LIBRARY}"
        INTERFACE_INCLUDE_DIRECTORIES "${MPFR_INCLUDE_DIRS}"
    )
else()
    add_subdirectory(${MIKTEX_REL_MPFR_DIR})
endif()

if(USE_SYSTEM_MSPACK)
    get_filename_component(suffix ${MSPACK_LIBRARY} EXT)
    if (suffix STREQUAL CMAKE_SHARED_LIBRARY_SUFFIX)
        add_library(MiKTeX::Imported::MSPACK SHARED IMPORTED)
    else()
        add_library(MiKTeX::Imported::MSPACK STATIC IMPORTED)
    endif()
    set_target_properties(MiKTeX::Imported::MSPACK
        PROPERTIES
        IMPORTED_LOCATION "${MSPACK_LIBRARY}"
        INTERFACE_INCLUDE_DIRECTORIES "${MSPACK_INCLUDE_DIRS}"
    )
else()
    add_subdirectory(${MIKTEX_REL_MSPACK_DIR})
endif()

if(USE_SYSTEM_OPENGL)
    get_filename_component(suffix ${OPENGL_gl_LIBRARY} EXT)
    if (suffix STREQUAL CMAKE_SHARED_LIBRARY_SUFFIX)
        add_library(MiKTeX::Imported::OPENGL SHARED IMPORTED)
    else()
        add_library(MiKTeX::Imported::OPENGL STATIC IMPORTED)
    endif()
    set_target_properties(MiKTeX::Imported::OPENGL
        PROPERTIES
        IMPORTED_LOCATION "${OPENGL_gl_LIBRARY}"
        INTERFACE_INCLUDE_DIRECTORIES "${OPENGL_INCLUDE_DIR}"
    )
    get_filename_component(suffix ${OPENGL_glu_LIBRARY} EXT)
    if (suffix STREQUAL CMAKE_SHARED_LIBRARY_SUFFIX)
        add_library(MiKTeX::Imported::GLU SHARED IMPORTED)
    else()
        add_library(MiKTeX::Imported::GLU STATIC IMPORTED)
    endif()
    set_target_properties(MiKTeX::Imported::GLU
        PROPERTIES
        IMPORTED_LOCATION "${OPENGL_glu_LIBRARY}"
        INTERFACE_INCLUDE_DIRECTORIES "${OPENGL_INCLUDE_DIR}"
    )
endif()

if(USE_SYSTEM_OPENSSL_CRYPTO)
    get_filename_component(suffix ${OPENSSL_CRYPTO_LIBRARY} EXT)
    if (suffix STREQUAL CMAKE_SHARED_LIBRARY_SUFFIX)
        add_library(MiKTeX::Imported::OPENSSL::CRYPTO SHARED IMPORTED)
    else()
        add_library(MiKTeX::Imported::OPENSSL::CRYPTO STATIC IMPORTED)
    endif()
    set_target_properties(MiKTeX::Imported::OPENSSL::CRYPTO
        PROPERTIES
        IMPORTED_LOCATION "${OPENSSL_CRYPTO_LIBRARY}"
        INTERFACE_INCLUDE_DIRECTORIES "${OPENSSL_INCLUDE_DIR}"
    )
elseif(WITH_LIBRESSL_CRYPTO)
    add_subdirectory(${MIKTEX_REL_LIBRESSL_DIR})
    set(openssl_crypto_dll_name ${libressl_crypto_dll_name})
    set(openssl_crypto_lib_name ${libressl_crypto_lib_name})
endif()

if(USE_SYSTEM_POPPLER)
    get_filename_component(suffix ${POPPLER_LIBRARY} EXT)
    if (suffix STREQUAL CMAKE_SHARED_LIBRARY_SUFFIX)
        add_library(MiKTeX::Imported::POPPLER SHARED IMPORTED)
    else()
        add_library(MiKTeX::Imported::POPPLER STATIC IMPORTED)
    endif()
    set_target_properties(MiKTeX::Imported::POPPLER
        PROPERTIES
        IMPORTED_LOCATION "${POPPLER_LIBRARY}"
        INTERFACE_INCLUDE_DIRECTORIES "${POPPLER_INCLUDE_DIRS}"
    )
    if(POPPLER_VERSION VERSION_LESS 0.59.0)
        message(FATAL_ERROR "libpoppler >=0.59.0 is required.")
    else()
        set_target_properties(MiKTeX::Imported::POPPLER
        PROPERTIES
            INTERFACE_COMPILE_DEFINITIONS MIKTEX_POPPLER_59=1
        )
    endif()
else()
    add_subdirectory(${MIKTEX_REL_POPPLER_DIR})
endif()

if(USE_SYSTEM_POPPLER_QT AND WITH_UI_QT)
    get_filename_component(suffix ${POPPLER_QT${QT_SERIES}_LIBRARY} EXT)
    if (suffix STREQUAL CMAKE_SHARED_LIBRARY_SUFFIX)
        add_library(MiKTeX::Imported::POPPLER_QT SHARED IMPORTED)
    else()
        add_library(MiKTeX::Imported::POPPLER_QT STATIC IMPORTED)
    endif()
    set_target_properties(MiKTeX::Imported::POPPLER_QT
        PROPERTIES
        IMPORTED_LOCATION "${POPPLER_QT${QT_SERIES}_LIBRARY}"
        INTERFACE_INCLUDE_DIRECTORIES "${POPPLER_QT${QT_SERIES}_INCLUDE_DIRS}"
    )
else()
    #add_subdirectory(${MIKTEX_REL_POPPLER_DIR})
endif()

if(USE_SYSTEM_POPT)
    get_filename_component(suffix ${POPT_LIBRARY} EXT)
    if (suffix STREQUAL CMAKE_SHARED_LIBRARY_SUFFIX)
        add_library(MiKTeX::Imported::POPT SHARED IMPORTED)
    else()
        add_library(MiKTeX::Imported::POPT STATIC IMPORTED)
    endif()
    set_target_properties(MiKTeX::Imported::POPT
        PROPERTIES
        IMPORTED_LOCATION "${POPT_LIBRARY}"
        INTERFACE_INCLUDE_DIRECTORIES "${POPT_INCLUDE_DIRS}"
    )
else()
    add_subdirectory(${MIKTEX_REL_POPT_DIR})
endif()

if(USE_SYSTEM_URIPARSER)
    get_filename_component(suffix ${URIPARSER_LIBRARY} EXT)
    if (suffix STREQUAL CMAKE_SHARED_LIBRARY_SUFFIX)
        add_library(MiKTeX::Imported::URIPARSER SHARED IMPORTED)
    else()
        add_library(MiKTeX::Imported::URIPARSER STATIC IMPORTED)
    endif()
    set_target_properties(MiKTeX::Imported::URIPARSER
        PROPERTIES
        IMPORTED_LOCATION "${URIPARSER_LIBRARY}"
        INTERFACE_INCLUDE_DIRECTORIES "${URIPARSER_INCLUDE_DIRS}"
    )
else()
    add_subdirectory(${MIKTEX_REL_URIPARSER_DIR})
endif()

if(USE_SYSTEM_ZZIP)
    get_filename_component(suffix ${ZZIP_LIBRARY} EXT)
    if (suffix STREQUAL CMAKE_SHARED_LIBRARY_SUFFIX)
        add_library(MiKTeX::Imported::ZZIP SHARED IMPORTED)
    else()
        add_library(MiKTeX::Imported::ZZIP STATIC IMPORTED)
    endif()
    set_target_properties(MiKTeX::Imported::ZZIP
        PROPERTIES
        IMPORTED_LOCATION "${ZZIP_LIBRARY}"
        INTERFACE_INCLUDE_DIRECTORIES "${ZZIP_INCLUDE_DIRS}"
    )
else()
    add_subdirectory(${MIKTEX_REL_ZZIP_DIR})
endif()

###############################################################################
## add the MiKTeX components

enable_testing()

add_subdirectory(${MIKTEX_REL_APP_DIR})
add_subdirectory(${MIKTEX_REL_AUTOSP_DIR})
add_subdirectory(${MIKTEX_REL_AXOHELP_DIR})
add_subdirectory(${MIKTEX_REL_BIBARTS_DIR})
add_subdirectory(${MIKTEX_REL_BIBTEXX_DIR})
add_subdirectory(${MIKTEX_REL_BIBTEX_DIR})
add_subdirectory(${MIKTEX_REL_BUILD_TOOLS_ETC_DIR})
add_subdirectory(${MIKTEX_REL_C4P_DIR})
add_subdirectory(${MIKTEX_REL_CFG_DIR})
add_subdirectory(${MIKTEX_REL_CHKTEX_DIR})
add_subdirectory(${MIKTEX_REL_CJKUTILS_DIR})
add_subdirectory(${MIKTEX_REL_CONFIGLIB_DIR})
add_subdirectory(${MIKTEX_REL_CONFIG_DIR})
add_subdirectory(${MIKTEX_REL_CORE_DIR})
add_subdirectory(${MIKTEX_REL_CWEB_DIR})
add_subdirectory(${MIKTEX_REL_DEFAULTS_DIR})
add_subdirectory(${MIKTEX_REL_DEVNAG_DIR})
add_subdirectory(${MIKTEX_REL_DOC_DIR})
add_subdirectory(${MIKTEX_REL_DVICOPY_DIR})
add_subdirectory(${MIKTEX_REL_DVIPDFMX_DIR})
add_subdirectory(${MIKTEX_REL_DVIPNG_DIR})
add_subdirectory(${MIKTEX_REL_DVIPS_DIR})
add_subdirectory(${MIKTEX_REL_DVISVGM_DIR})
add_subdirectory(${MIKTEX_REL_EGL_REGISTRY_DIR})
add_subdirectory(${MIKTEX_REL_EPSTOPDF_DIR})
add_subdirectory(${MIKTEX_REL_ETEX_DIR})
add_subdirectory(${MIKTEX_REL_EXTRACTOR_DIR})
add_subdirectory(${MIKTEX_REL_FINDTEXMF_DIR})
add_subdirectory(${MIKTEX_REL_FRIBIDIXETEX_DIR})
add_subdirectory(${MIKTEX_REL_GREGORIO_DIR})
add_subdirectory(${MIKTEX_REL_GSF2PK_DIR})
add_subdirectory(${MIKTEX_REL_HITEX_DIR})
add_subdirectory(${MIKTEX_REL_INIPOOL_DIR})
add_subdirectory(${MIKTEX_REL_INITEXMF_DIR})
add_subdirectory(${MIKTEX_REL_KPSEMU_DIR})
add_subdirectory(${MIKTEX_REL_KPSEWHICH_DIR})
add_subdirectory(${MIKTEX_REL_LCDF_TYPETOOLS_DIR})
add_subdirectory(${MIKTEX_REL_LACHECK_DIR})
add_subdirectory(${MIKTEX_REL_LOC_DIR})
add_subdirectory(${MIKTEX_REL_LUATEX_DIR})
add_subdirectory(${MIKTEX_REL_LUA53_DIR})
add_subdirectory(${MIKTEX_REL_M_TX_DIR})
add_subdirectory(${MIKTEX_REL_MAKEINDEX_DIR})
add_subdirectory(${MIKTEX_REL_MAKEX_DIR})
add_subdirectory(${MIKTEX_REL_MD5WALK_DIR})
add_subdirectory(${MIKTEX_REL_MD5_DIR})
add_subdirectory(${MIKTEX_REL_MFWARE_DIR})
add_subdirectory(${MIKTEX_REL_MF_DIR})
add_subdirectory(${MIKTEX_REL_MIKTEXSETUP_DIR})
add_subdirectory(${MIKTEX_REL_MIKTEX_DIR})
add_subdirectory(${MIKTEX_REL_MPMLIB_DIR})
add_subdirectory(${MIKTEX_REL_MPM_DIR})
add_subdirectory(${MIKTEX_REL_MP_DIR})
add_subdirectory(${MIKTEX_REL_MTHELP_DIR})
add_subdirectory(${MIKTEX_REL_NLOHMANN_JSON_DIR})
add_subdirectory(${MIKTEX_REL_OMEGAWARE_DIR})
add_subdirectory(${MIKTEX_REL_OPENGL_REGISTRY_DIR})
add_subdirectory(${MIKTEX_REL_OTPS_DIR})
add_subdirectory(${MIKTEX_REL_PADOUT_DIR})
add_subdirectory(${MIKTEX_REL_PATGEN_DIR})
add_subdirectory(${MIKTEX_REL_PDFTEX_DIR})
add_subdirectory(${MIKTEX_REL_PMX_DIR})
add_subdirectory(${MIKTEX_REL_POPT_WRAPPER_DIR})
add_subdirectory(${MIKTEX_REL_PPLIB_DIR})
add_subdirectory(${MIKTEX_REL_PROGRAMS_ETC_DIR})
add_subdirectory(${MIKTEX_REL_PS2PK_DIR})
add_subdirectory(${MIKTEX_REL_PSUTILS_DIR})
add_subdirectory(${MIKTEX_REL_PTEXENC_DIR})
add_subdirectory(${MIKTEX_REL_RES_DIR})
add_subdirectory(${MIKTEX_REL_SETUPLIB_DIR})
add_subdirectory(${MIKTEX_REL_SYNCTEX_CLI_DIR})
add_subdirectory(${MIKTEX_REL_TDSUTIL_DIR})
add_subdirectory(${MIKTEX_REL_TECKIT_DIR})
add_subdirectory(${MIKTEX_REL_TEX4HT_DIR})
add_subdirectory(${MIKTEX_REL_TEXIFY_DIR})
add_subdirectory(${MIKTEX_REL_TEXJP_DIR})
add_subdirectory(${MIKTEX_REL_TEXMF_DIR})
add_subdirectory(${MIKTEX_REL_TEXWARE_DIR})
add_subdirectory(${MIKTEX_REL_TEX_DIR})
add_subdirectory(${MIKTEX_REL_TEX_ETC_DIR})
add_subdirectory(${MIKTEX_REL_TIE_DIR})
add_subdirectory(${MIKTEX_REL_TOUCH_DIR})
add_subdirectory(${MIKTEX_REL_TRACE_DIR})
add_subdirectory(${MIKTEX_REL_TTF2PK2_DIR})
add_subdirectory(${MIKTEX_REL_UPMENDEX_DIR})
add_subdirectory(${MIKTEX_REL_UTIL_DIR})
add_subdirectory(${MIKTEX_REL_W2CEMU_DIR})
add_subdirectory(${MIKTEX_REL_WEB2C_DIR})
add_subdirectory(${MIKTEX_REL_WEB_DIR})
add_subdirectory(${MIKTEX_REL_XETEX_DIR})
add_subdirectory(${MIKTEX_REL_XINDY_DIR})
add_subdirectory(${MIKTEX_REL_XML2PMX_DIR})
add_subdirectory(${MIKTEX_REL_XPDF_DIR})

if(WITH_ASYMPTOTE)
    add_subdirectory(${MIKTEX_REL_ASYMPTOTE_DIR})
endif()

if(WITH_CONFIG_FILES)
    add_subdirectory(${MIKTEX_REL_CONFIGFILES_DIR})
endif()

if(WITH_TPMS)
    add_subdirectory(${MIKTEX_REL_TPM_DIR})
endif()

if(WITH_UI_QT)
    add_subdirectory(${MIKTEX_REL_TEXWORKS_DIR})
    add_subdirectory(${MIKTEX_REL_UI_QT_DIR})
endif()

if(WITH_UI_MFC)
    add_subdirectory(${MIKTEX_REL_SETUP_MFC_DIR})
    add_subdirectory(${MIKTEX_REL_YAP_MFC_DIR})
endif()

if(WITH_MPC)
    add_subdirectory(${MIKTEX_REL_MPC_DIR})
endif()

if(WITH_COM)
    add_subdirectory(Libraries/MiKTeX/Core/COM/test)
    add_subdirectory(Libraries/MiKTeX/PackageManager/COM/test)
endif()

if(MIKTEX_NATIVE_WINDOWS)
    add_subdirectory(${MIKTEX_REL_ARCTRL_WIN_DIR})
    add_subdirectory(${MIKTEX_REL_DIB_DIR})
    add_subdirectory(${MIKTEX_REL_DVI_DIR})
    add_subdirectory(${MIKTEX_REL_MTPRINT_DIR})
    add_subdirectory(${MIKTEX_REL_UNXEMU_DIR})
    add_subdirectory(${MIKTEX_REL_UTF8WRAP_DIR})
endif()

if(MIKTEX_NATIVE_WINDOWS)
    add_subdirectory(${MIKTEX_REL_LUAJIT_DIR})
endif()

if(NOT HAVE_GETOPT_LONG)
    add_subdirectory(${MIKTEX_REL_GETOPT_DIR})
endif()

if(NOT HAVE_REGEXEC)
    add_subdirectory(${MIKTEX_REL_REGEX_DIR})
endif()

if(WITH_UI_QT)
    add_subdirectory(${MIKTEX_REL_CONSOLE_QT_DIR})
endif()

###############################################################################
## API documentation

if(WITH_MIKTEX_API_DOC)
    add_custom_command(
        OUTPUT
            ${CMAKE_BINARY_DIR}/Documentation/API/html/index.html
        COMMAND
            ${DOXYGEN_EXECUTABLE}
        DEPENDS
            Doxyfile
        WORKING_DIRECTORY
            ${CMAKE_BINARY_DIR}
        VERBATIM
    )
    add_custom_target(gen-api-doc-html ALL
        DEPENDS
            ${CMAKE_BINARY_DIR}/Documentation/API/html/index.html
    )
    set_property(TARGET gen-api-doc-html PROPERTY FOLDER ${MIKTEX_CURRENT_FOLDER})
    install(
        DIRECTORY
            ${CMAKE_BINARY_DIR}/Documentation/API/html/
        DESTINATION
            ${MIKTEX_DOC_DESTINATION_DIR}/api/html
    )
endif()

###############################################################################
## configure Qt plugins (macOS)

if(MIKTEX_MACOS_BUNDLE)
    file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/qt.conf"
        "[Paths]\nPlugins = ../PlugIns\n"
    )
    install(
        FILES "${CMAKE_CURRENT_BINARY_DIR}/qt.conf"
        DESTINATION "${MIKTEX_BINARY_DESTINATION_DIR}"
    )
    install(
        FILES "${CMAKE_CURRENT_BINARY_DIR}/qt.conf"
        DESTINATION "${MIKTEX_INTERNAL_BINARY_DESTINATION_DIR}"
    )
endif()

###############################################################################
## bootstrapping

if(WITH_BOOTSTRAPPING)
    if(DEFINED ENV{MIKTEX_REPOSITORY})
        set(default_repository $ENV{MIKTEX_REPOSITORY})
    else()
        set(default_repository "http://ctan.org/tex-archive/systems/win32/miktex/tm/packages/")
    endif()
    set(MIKTEX_DEFAULT_REPOSITORY
        ${default_repository}
        CACHE STRING "MiKTeX package repository"
    )
    if(MIKTEX_RELEASE_STATE EQUAL 1)
        set(remote_repository
            "${MIKTEX_DEFAULT_REPOSITORY}next/"
        )
    else()
        set(remote_repository
            "${MIKTEX_DEFAULT_REPOSITORY}"
        )
    endif()
    list(APPEND bootstrapping_files
        miktex-zzdb1-${MIKTEX_PACKAGES_MAJOR_MINOR_STR}.tar.lzma
    )
    list(APPEND bootstrapping_files
        miktex-zzdb3-${MIKTEX_PACKAGES_MAJOR_MINOR_STR}.tar.lzma
    )
    foreach(p ${MIKTEX_BOOTSTRAPPING_PACKAGES})
        list(APPEND bootstrapping_files
            ${p}.tar.lzma
        )
    endforeach()
    foreach(f ${bootstrapping_files})
        add_custom_command(
            OUTPUT
                ${CMAKE_CURRENT_BINARY_DIR}/${f}
            COMMAND
                ${CURL_EXECUTABLE} -o ${CMAKE_CURRENT_BINARY_DIR}/${f} -fsSL ${remote_repository}/${f}
        )
        list(APPEND generated_bootstrapping_files ${CMAKE_CURRENT_BINARY_DIR}/${f})
    endforeach()
    add_custom_target(gen-bootstrapping-files ALL DEPENDS
        ${generated_bootstrapping_files}
    )
    install(
        FILES
            ${generated_bootstrapping_files}
        DESTINATION
            ${MIKTEX_BOOTSTRAPPING_DESTINATION_DIR}
    )
endif()

###############################################################################
## packaging

find_program(RPMBUILD_EXECUTABLE NAMES rpmbuild)

if(RPMBUILD_EXECUTABLE)
    list(APPEND CPACK_GENERATOR RPM)
endif()

if(UNIX AND NOT APPLE AND NOT RPMBUILD_EXECUTABLE)
    list(APPEND CPACK_GENERATOR DEB)
endif()

if(MIKTEX_MACOS_BUNDLE)
    set(CPACK_GENERATOR DragNDrop)
endif()

configure_file(
    "${CMAKE_SOURCE_DIR}/Packaging/cpack-config.cmake.in"
    "${CMAKE_BINARY_DIR}/Packaging/cpack-config.cmake"
    @ONLY
)

set(CPACK_PROJECT_CONFIG_FILE
    "${CMAKE_BINARY_DIR}/Packaging/cpack-config.cmake"
)

set(CPACK_PACKAGE_DESCRIPTION_FILE
    "${CMAKE_SOURCE_DIR}/Packaging/package-description.txt"
)

set(CPACK_PACKAGE_DESCRIPTION_SUMMARY
    "MiKTeX: a scalable TeX distribution"
)

set(CPACK_PACKAGE_CONTACT
    "Christian Schenk <cs@miktex.org>"
)

set(CPACK_PACKAGE_VENDOR
    "MiKTeX.org"
)

# TODO
configure_file(
    "${CMAKE_SOURCE_DIR}/COPYING.md"
    "${CMAKE_BINARY_DIR}/COPYING.txt"
)
set(CPACK_RESOURCE_FILE_LICENSE
    "${CMAKE_BINARY_DIR}/COPYING.txt"
)

set(CPACK_PACKAGE_FILE_NAME
    "miktex-${MIKTEX_VERSION_STR}-${MIKTEX_TARGET_SYSTEM_TAG}"
)

set(CPACK_DEBIAN_FILE_NAME "DEB-DEFAULT")

set(CPACK_DEBIAN_PACKAGE_RELEASE "${MIKTEX_LINUX_DIST_CODE_NAME}${MIKTEX_PACKAGE_REVISION}")

set(CPACK_DEBIAN_PACKAGE_HOMEPAGE "${MIKTEX_HQ_BASE_URL_NO_SLASH}")

find_program(DPKG_SHLIBDEPS_EXECUTABLE NAMES dpkg-shlibdeps)

set(debian_install_dependencies "debconf (>= 0.2.17)")
set(debian_runtime_dependencies "fontconfig")

if(DPKG_SHLIBDEPS_EXECUTABLE)
    set(CPACK_DEBIAN_PACKAGE_DEPENDS "${debian_install_dependencies}, ${debian_runtime_dependencies}")
    set(CPACK_DEBIAN_PACKAGE_SHLIBDEPS TRUE)
else()
    set(CPACK_DEBIAN_PACKAGE_DEPENDS
        "${debian_install_dependencies}, ${debian_runtime_dependencies}, libbz2-1.0, libc6 (>= 2.14), libcairo2 (>= 1.2.4), libcurl3-gnutls (>= 7.16.2), libexpat1 (>= 2.0.1), libfontconfig1 (>= 2.11), libfreetype6 (>= 2.3.9), libfribidi0 (>= 0.19.2), libgcc1 (>= 1:4.0), libgd3 (>= 2.1.0~alpha~), libgmp10, libgraphite2-3 (>= 1.2.2), libharfbuzz-icu0 (>= 0.9.9), libharfbuzz0b (>= 1.4.1), libicu57 (>= 57.1-1~), libjpeg62-turbo (>= 1.3.1), liblog4cxx10v5, liblzma5 (>= 5.1.1alpha+20120614), libmpfr4 (>= 3.1.3), libmspack0 (>= 0.4), libpixman-1-0 (>= 0.10.0), libpng16-16 (>= 1.6.2-1), libpoppler57 (>= 0.38.0), libpopt0 (>= 1.14), libssl1.0.2 (>= 1.0.2d), libstdc++6 (>= 6), liburiparser1 (>= 0.6.0), libzzip-0-13 (>= 0.13.56), zlib1g (>= 1:1.1.4)"
    )
endif()

set(CPACK_DEBIAN_PACKAGE_SECTION
    "tex"
)

#configure_file(
#  "${CMAKE_SOURCE_DIR}/Packaging/deb/config.in"
#  "${CMAKE_BINARY_DIR}/Packaging/deb/config"
#)

#list(APPEND CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA
#  "${CMAKE_BINARY_DIR}/Packaging/deb/config"
#)

#configure_file(
#  "${CMAKE_SOURCE_DIR}/Packaging/deb/postinst.in"
#  "${CMAKE_BINARY_DIR}/Packaging/deb/postinst"
#)

#list(APPEND CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA
#  "${CMAKE_BINARY_DIR}/Packaging/deb/postinst"
#)

configure_file(
    "${CMAKE_SOURCE_DIR}/Packaging/deb/prerm.in"
    "${CMAKE_BINARY_DIR}/Packaging/deb/prerm"
)

list(APPEND CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA
    "${CMAKE_BINARY_DIR}/Packaging/deb/prerm"
)

#configure_file(
#  "${CMAKE_SOURCE_DIR}/Packaging/deb/templates.in"
#  "${CMAKE_BINARY_DIR}/Packaging/deb/templates"
#)

#list(APPEND CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA
#  "${CMAKE_BINARY_DIR}/Packaging/deb/templates"
#)

set(CPACK_RPM_FILE_NAME "RPM-DEFAULT")

set(CPACK_RPM_PACKAGE_RELEASE ${MIKTEX_PACKAGE_REVISION})

if(MIKTEX_LINUX_DIST STREQUAL "centos")
    set(CPACK_RPM_PACKAGE_RELEASE_DIST ".el${MIKTEX_LINUX_DIST_VERSION}")
elseif(MIKTEX_LINUX_DIST STREQUAL "fedora")
    set(CPACK_RPM_PACKAGE_RELEASE_DIST ".fc${MIKTEX_LINUX_DIST_VERSION}")
elseif(MIKTEX_LINUX_DIST STREQUAL "opensuse")
    if(MIKTEX_LINUX_DIST_VERSION MATCHES "([0-9]+)\\.([0-9]+)")
        math(
            EXPR
                MIKTEX_LINUX_DIST_VERSION_INT
                "(10 * ${CMAKE_MATCH_1}) + ${CMAKE_MATCH_2}"
        )
    else()
        math(
            EXPR
                MIKTEX_LINUX_DIST_VERSION_INT
                "10 * ${MIKTEX_LINUX_DIST_VERSION}"
        )
    endif()
    set(CPACK_RPM_PACKAGE_RELEASE_DIST ".lp${MIKTEX_LINUX_DIST_VERSION_INT}")
endif()

set(CPACK_RPM_PACKAGE_URL "${MIKTEX_HQ_BASE_URL_NO_SLASH}")

set(CPACK_RPM_PACKAGE_AUTOREQ 1)

configure_file(
    "${CMAKE_SOURCE_DIR}/Packaging/rpm/post-install.sh.in"
    "${CMAKE_BINARY_DIR}/Packaging/rpm/post-install.sh"
)
set(CPACK_RPM_POST_INSTALL_SCRIPT_FILE
    "${CMAKE_BINARY_DIR}/Packaging/rpm/post-install.sh"
)

configure_file(
    "${CMAKE_SOURCE_DIR}/Packaging/rpm/pre-uninstall.sh.in"
    "${CMAKE_BINARY_DIR}/Packaging/rpm/pre-uninstall.sh"
)

set(CPACK_RPM_PRE_UNINSTALL_SCRIPT_FILE
    "${CMAKE_BINARY_DIR}/Packaging/rpm/pre-uninstall.sh"
)

set(CPACK_RPM_EXCLUDE_FROM_AUTO_FILELIST_ADDITION
    "/usr/libexec"
    "/usr/share/applications"
    "/usr/share/man"
    "/usr/share/man/man1"
    "/usr/share/man/man5"
    "/usr/share/pixmaps"
)

set(CPACK_STRIP_SYMBOLS TRUE)

include(CPack)

if(MIKTEX_MACOS_BUNDLE AND WITH_CODE_SIGNING)
    add_custom_target(signed-package
        COMMAND
            "${CMAKE_CPACK_COMMAND}" --config "${CMAKE_BINARY_DIR}/CPackConfig.cmake"
        COMMAND
            codesign -s "${MIKTEX_CODESIGN_IDENTITY}" *.dmg
    )
endif()

###############################################################################
## uninstall (see CMAKE FAQ)

configure_file(
    "${CMAKE_CURRENT_SOURCE_DIR}/cmake_uninstall.cmake.in"
    "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
    IMMEDIATE
    @ONLY
)

add_custom_target(uninstall
    COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake
)
