cmake_minimum_required(VERSION 3.0)

project(ktoblzcheck VERSION 1.50.0)

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

########### options ###############
option(ENABLE_BANKDATA_DOWNLOAD "Enable download of raw bank data file" ON)
option(INSTALL_RAW_BANKDATA_FILE "Install raw bank data file" OFF)

########### global settings ###############
set(BANK_WEBSITE_HOST https://www.bundesbank.de)
set(BANK_WEBSITE_PATH /de/aufgaben/unbarer-zahlungsverkehr/serviceangebot/bankleitzahlen/download---bankleitzahlen-602592)

# provide gnu compatible install dirs
include(GNUInstallDirs)

# definitions for running cross compile applications
include(MacrosWine)

# 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()

find_package(Python2 COMPONENTS Interpreter Development)
# for cmake < 3.12
if(NOT Python2_Interpreter_FOUND)
    find_package(PythonInterp 2.7 REQUIRED)
    set(Python2_Interpreter_FOUND TRUE)
    set(Python2_EXECUTABLE ${PYTHON_EXECUTABLE})
endif()
if(Python2_Development_FOUND)
    string(REGEX REPLACE "^([0-9]+.[0-9]+).*" "\\1" Python2_VERSION_MAJOR_MINOR ${Python2_VERSION})
else()
    find_package(PythonLibs 2.6 REQUIRED)
    set(Python2_Development_FOUND TRUE)
    set(Python2_VERSION ${PYTHONLIBS_VERSION_STRING})
    string(REGEX REPLACE "^([0-9]+.[0-9]+).*" "\\1" Python2_VERSION_MAJOR_MINOR ${Python2_VERSION})
    set(Python2_SITEARCH "${CMAKE_INSTALL_LIBDIR}/python${Python2_VERSION_MAJOR_MINOR}/site-packages")
endif()

########### 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(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
set(BANKDATA_SRCPATH ${CMAKE_SOURCE_DIR}/src/bankdata)
if(ENABLE_BANKDATA_DOWNLOAD)
    string(TIMESTAMP _BANKDATA_FILE "bankdata_%Y%m%d.txt")
    set(BANKDATA_FILE ${_BANKDATA_FILE})
    set(BANKDATA_FILEPATH "${BANKDATA_SRCPATH}/${BANKDATA_FILE}")
    message(STATUS "Using bank data file ${BANKDATA_FILEPATH}")

    string(TIMESTAMP _BANKDATA_RAW_FILE "blz_%Y%m%d.txt")
    set(BANKDATA_RAW_FILE ${_BANKDATA_RAW_FILE})
    set(BANKDATA_RAW_FILEPATH "${BANKDATA_SRCPATH}/${BANKDATA_RAW_FILE}")
    message(STATUS "Using raw bank data file ${BANKDATA_RAW_FILEPATH}")
else()
    file(GLOB BANKDATA_FILEPATH  "${BANKDATA_SRCPATH}/bankdata_*.txt")
    get_filename_component(BANKDATA_FILE ${BANKDATA_FILEPATH} NAME)
    message(STATUS "Using present bank data file ${BANKDATA_FILEPATH}")

    file(GLOB BANKDATA_RAW_FILEPATH  "${BANKDATA_SRCPATH}/blz_*.txt")
    get_filename_component(BANKDATA_RAW_FILE ${BANKDATA_RAW_FILEPATH} NAME)
    message(STATUS "Using present raw bank data file ${BANKDATA_RAW_FILEPATH}")
endif()


########### 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}")
set(BANKDATA_PATH "\${pkgdatadir}")
if (Python2_Development_FOUND)
    set(pythondir "\${prefix}/${Python2_SITEARCH}")
endif()

configure_file(${PACKAGE}.pc.in ${CMAKE_CURRENT_BINARY_DIR}/${PACKAGE}.pc)
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.xz)
add_custom_command(OUTPUT ${temppath}
    COMMAND ${CMAKE_COMMAND} -E make_directory ${temppath}
)

add_custom_target(dist
    COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_SOURCE_DIR}  ${temppath}
    COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_BINARY_DIR}/config.h.cmake ${temppath}
    COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_BINARY_DIR}/ktoblzcheck.spec ${temppath}
    COMMAND ${CMAKE_COMMAND} -E tar -cJf ${tarball} ${tarname}
    WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/tmp
    COMMENT "generating ${tarball}"
    DEPENDS ${temppath} ${CMAKE_BINARY_DIR}/ktoblzcheck.spec ${CMAKE_BINARY_DIR}/config.h.cmake
)

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
)

########### 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()

add_subdirectory(autotests)
add_subdirectory(src)
add_subdirectory(doc)
