cmake_minimum_required(VERSION 3.14.0)

project(ktoblzcheck VERSION 1.59.0)

# provide gnu compatible install dirs
include(GNUInstallDirs)

########### options ###############
set(BANKDATA_PATH "${CMAKE_INSTALL_FULL_DATADIR}/ktoblzcheck" CACHE STRING "Path where bankdata files are installed")
option(ENABLE_METHOD_TESTS "Enable testing methods" OFF)

########### global settings ###############
option(BUILD_STATIC "build static library and executables" OFF)
if(BUILD_STATIC)
    set(LIBS -static -static-libgcc -static-libstdc++)
    set(CMAKE_BUILD_TYPE Release)
endif()

set (CMAKE_CXX_STANDARD 14)

# define path for local cmake modules
list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake)

# definitions for running cross compile applications
include(MacrosWine)

# common macros
include(Macros)

# set PACKAGE_... variables
include(MacrosAutotools)
autopackage(${PROJECT_NAME} ${PROJECT_VERSION} "${PROJECT_HOMEPAGE_URL}" "https://sourceforge.net/projects/ktoblzcheck/support")

# definitions in source file
set(KTOBLZCHECK_VERSION_MAJOR ${PROJECT_VERSION_MAJOR})
set(KTOBLZCHECK_VERSION_MINOR ${PROJECT_VERSION_MINOR})
set(KTOBLZCHECK_VERSION_PATCH ${PROJECT_VERSION_PATCH})

# shared library version numbers
set(LIBKTOBLZCHECK_CURRENT 6)
set(LIBKTOBLZCHECK_AGE 5)
set(LIBKTOBLZCHECK_REVISION 26)
math(EXPR LIBKTOBLZCHECK_EFFECTIVE "${LIBKTOBLZCHECK_CURRENT} - ${LIBKTOBLZCHECK_AGE}")

if(WIN32)
    set(OS_WIN32 1)
endif()

# target build dir defaults
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib")
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")
if(WIN32)
   set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")
   set(CUSTOM_INSTALL_LIBDIR ${CMAKE_INSTALL_BINDIR})
else()
   set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib")
   set(CUSTOM_INSTALL_LIBDIR ${CMAKE_INSTALL_LIBDIR})
endif()

# target install defaults
set(INSTALL_TARGETS_DEFAULT_ARGS
    EXPORT KtoBlzCheckTargets
    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
    ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
)

# for embedding into installed header files
set(VERSION_MAJOR ${KTOBLZCHECK_VERSION_MAJOR})
set(VERSION_MINOR ${KTOBLZCHECK_VERSION_MINOR})

########### external packages ###############
find_package(Doxygen "1.8.3")

set(CMAKE_THREAD_PREFER_PTHREAD 1)
find_package(Threads REQUIRED)
if(CMAKE_USE_PTHREADS_INIT)
    set(HAVE_LIBPTHREAD 1)
endif()

if(CMAKE_CROSSCOMPILING)
    if(Python3_SITEARCH)
        set(Python_SITEARCH ${Python3_SITEARCH])
    endif()
    if(Python3_EXECUTABLE)
        set(Python_EXECUTABLE ${Python3_EXECUTABLE])
    endif()
    if(NOT Python_SITEARCH)
        message(FATAL_ERROR "Could not detect python3 installation directory for site packages."
        "To specify it, add -DPython_SITEARCH=<path> to cmake configure command.")
    endif()
    if(NOT Python_EXECUTABLE)
        message(FATAL_ERROR "Could not detect python3 executable for running command on the native system"
        "To specify it, add -DPython_EXECUTABLE=<path> to cmake configure command.")
    endif()
    set(Python_Interpreter_FOUND TRUE)
else()
    find_package (Python3 COMPONENTS Interpreter)
    if(Python3_FOUND)
        set(Python_EXECUTABLE ${Python3_EXECUTABLE})
        string(REGEX REPLACE "^([0-9]+.[0-9]+).*" "\\1" Python_VERSION_MAJOR_MINOR ${Python3_VERSION})
        set(Python_SITEARCH "${CMAKE_INSTALL_LIBDIR}/python${Python_VERSION_MAJOR_MINOR}/site-packages")
        set(Python_Interpreter_FOUND TRUE)
        message(STATUS "found python3 version ${Python3_VERSION} with site packages installation directory '${Python_SITEARCH}'")
    endif()
endif()

find_package(SQLite3 REQUIRED)
find_package(CURL REQUIRED)
cmake_policy(SET CMP0079 NEW)

########### configure checks ###############
include(CheckIncludeFile)
check_include_file(dirent.h     HAVE_DIRENT_H)
check_include_file(dlfcn.h      HAVE_DLFCN_H)
check_include_file(inttypes.h   HAVE_INTTYPES_H)
check_include_file(memory.h     HAVE_MEMORY_H)
check_include_file(sqlite3.h    HAVE_SQLITE3_H)
check_include_file(stdint.h     HAVE_STDINT_H)
check_include_file(stdlib.h     HAVE_STDLIB_H)
check_include_file(stdio.h      HAVE_STDIO_H)
check_include_file(string.h     HAVE_STRING_H)
check_include_file(strings.h    HAVE_STRINGS_H)
check_include_file(syslog.h     HAVE_SYSLOG_H)
check_include_file(sys/stat.h   HAVE_SYS_STAT_H)
check_include_file(sys/types.h  HAVE_SYS_TYPES_H)
check_include_file(windows.h    HAVE_WINDOWS_H)

include(CheckTypeSize)
check_type_size("long long" LONG_LONG)


# bankdata related variables in source dir
set(BANKDATA_SRCPATH ${CMAKE_SOURCE_DIR}/src/bankdata)
set(BANKDATA_TEST_FILEPATH "${BANKDATA_SRCPATH}/bankdata_test.txt")

# bankdata related variables for install location
add_definitions(-DBANKDATA_PATH="${BANKDATA_PATH}")

# bankdata database related variables
set(BANKDATA_DB "bankdata.de.db")
set(BANKDATA_NL_DB "bankdata.nl.db")
set(BANKDATA_CH_DB "bankdata.ch.db")
set(BANKDATA_TEST_DB "bankdata.test.db")

set(BANKDATA_DBPATH "${BANKDATA_PATH}/${BANKDATA_DB}")
set(BANKDATA_NL_DBPATH "${BANKDATA_PATH}/${BANKDATA_NL_DB}")
set(BANKDATA_CH_DBPATH "${BANKDATA_PATH}/${BANKDATA_CH_DB}")
set(BANKDATA_TEST_DBPATH "${BANKDATA_SRCPATH}/${BANKDATA_TEST_DB}")

list(APPEND ADDITIONAL_CLEAN_FILES ${BANKDATA_TEST_DBPATH})

message(STATUS "Using bank data db ${BANKDATA_DBPATH}")
message(STATUS "Using bank data db ${BANKDATA_NL_DBPATH}")
message(STATUS "Using bank data db ${BANKDATA_CH_DBPATH}")
message(STATUS "Using bank data db ${BANKDATA_TEST_DBPATH}")


########### generate pkgconfig file ###############
set(prefix "\${pcfiledir}/../..")
set(exec_prefix "\${prefix}")
set(bindir "\${prefix}/${CMAKE_INSTALL_BINDIR}")
set(libdir "\${prefix}/${CMAKE_INSTALL_LIBDIR}")
set(includedir "\${prefix}/${CMAKE_INSTALL_INCLUDEDIR}")
set(datadir "\${prefix}/${CMAKE_INSTALL_DATADIR}")
if (Python_SITEARCH)
    set(pythondir "\${prefix}${Python_SITEARCH}")
endif()

configure_file(${PACKAGE}.pc.in ${CMAKE_CURRENT_BINARY_DIR}/${PACKAGE}.pc @ONLY)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PACKAGE}.pc DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)

########### generate cmake find_package file ###############
include(CMakePackageConfigHelpers)

set(INSTALL_CMAKE_DIR ${CMAKE_INSTALL_LIBDIR}/cmake/KtoBlzCheck)
configure_package_config_file(KtoBlzCheckConfig.cmake.in
    ${CMAKE_CURRENT_BINARY_DIR}/KtoBlzCheckConfig.cmake
    INSTALL_DESTINATION ${INSTALL_CMAKE_DIR}
)
write_basic_package_version_file(
    ${CMAKE_CURRENT_BINARY_DIR}/KtoBlzCheckConfigVersion.cmake
    VERSION ${PROJECT_VERSION}
    COMPATIBILITY AnyNewerVersion
)

install(EXPORT KtoBlzCheckTargets
    FILE KtoBlzCheckTargets.cmake
    DESTINATION ${INSTALL_CMAKE_DIR}
)

# used by install autotests
export(EXPORT KtoBlzCheckTargets FILE KtoBlzCheckTargets.cmake)

install(FILES
    ${CMAKE_CURRENT_BINARY_DIR}/KtoBlzCheckConfig.cmake
    ${CMAKE_CURRENT_BINARY_DIR}/KtoBlzCheckConfigVersion.cmake
    DESTINATION ${INSTALL_CMAKE_DIR}
)

########### generate config.h ###############
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/config.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config.h)
add_definitions(
    -DHAVE_CONFIG_H
)

########### generate spec file ###############
configure_file(ktoblzcheck.spec.in ${CMAKE_BINARY_DIR}/ktoblzcheck.spec)

########### generate tarball ###############
set(tarname ${PACKAGE}-${PROJECT_VERSION})
set(temppath ${CMAKE_BINARY_DIR}/tmp/${tarname})
set(tarball ${CMAKE_BINARY_DIR}/${tarname}.tar.gz)
add_custom_command(OUTPUT ${temppath}
    COMMAND ${CMAKE_COMMAND} -E make_directory ${temppath}
)

add_custom_target(dist
    COMMAND ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR} -t package_source
)

add_custom_target(rpm
    COMMAND rpmbuild -ta ${tarball}
    WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
    COMMENT "generating rpm file"
    DEPENDS dist
)

add_custom_target(srpm
    COMMAND rpmbuild -ts ${tarball}
    WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
    COMMENT "generating srpm file"
    DEPENDS dist
)

#
# add package_source target
#

# find files not in git repo
exec_program(git ${CMAKE_SOURCE_DIR}
    ARGS ls-files --others --directory
    OUTPUT_VARIABLE IGNORE_FILES
)

string(REGEX REPLACE "\n" ";" IGNORE_FILES "${IGNORE_FILES}")

set(CPACK_GENERATOR "TGZ")
set(CPACK_SOURCE_GENERATOR "TGZ")
list(APPEND CPACK_SOURCE_IGNORE_FILES
    .git/
    ${IGNORE_FILES}
    build/
    ".*~$"
    ".*\\.autosave"
)
set(CPACK_SOURCE_PACKAGE_FILE_NAME "${PROJECT_NAME}-${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}")
set(CPACK_STRIP_FILES TRUE)
set(CPACK_VERBATIM_VARIABLES YES)
include(CPack)

########### generate installer ###############
if(WIN32)
    find_file(
        ISCC_EXECUTABLE ISCC.exe
        PATH
            ${ISCC_DIR}
            "$ENV{ProgramFiles}/Inno\ Setup\ 5/"
            "$ENV{ProgramFiles}/Inno\ Setup\ 6/"
        NO_DEFAULT_PATH
    )
    if (ISCC_EXECUTABLE)
        message(STATUS "Inno Setup compiler found at ${ISCC_EXECUTABLE}")
        configure_file(${CMAKE_CURRENT_SOURCE_DIR}/ktoblzcheck.iss.in ${CMAKE_CURRENT_BINARY_DIR}/ktoblzcheck.iss)
        set(FILES "README;COPYING;README.WIN32;AUTHORS;ChangeLog")
        foreach(f ${FILES})
            configure_file(${CMAKE_CURRENT_SOURCE_DIR}/${f} ${CMAKE_CURRENT_BINARY_DIR}/${f} COPYONLY)
        endforeach()
        add_custom_target(setup
            COMMAND ${CMAKE_MAKE_PROGRAM} install DESTDIR=${CMAKE_CURRENT_BINARY_DIR}/win32-tmp
            COMMAND ${CMAKE_COMMAND} -E copy_directory
                ${CMAKE_CURRENT_BINARY_DIR}/win32-tmp${CMAKE_INSTALL_PREFIX}
                ${CMAKE_CURRENT_BINARY_DIR}/win32-tmp
            COMMAND wine ${ISCC_EXECUTABLE} z:${CMAKE_CURRENT_BINARY_DIR}/ktoblzcheck.iss
            WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
        )
    endif()
endif()

# enable ctest
enable_testing()

if(NOT CROSS_COMPILING)
    add_subdirectory(autotests)
endif()
add_subdirectory(src)
add_subdirectory(doc)


add_custom_target(uncrustify
    COMMAND ${CMAKE_SOURCE_DIR}/uncrustify.sh
    COMMENT "uncrustify sources"
)

include(FeatureSummary)
feature_summary(WHAT ALL)
