cmake_minimum_required(VERSION 3.18)
cmake_policy(VERSION 3.18)

project("C-Munipack"
    LANGUAGES C CXX 
    VERSION 2.1.35 
    HOMEPAGE_URL http://c-munipack.sourceforge.net/
    DESCRIPTION "Astrophotometry software with focus on variable stars."
)

enable_testing()

set(CMAKE_C_STANDARD 90)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_EXTENSIONS OFF)

set(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake/Modules" ${CMAKE_MODULE_PATH})

set(CMUNIPACK_LIBRARY_NAME "cmpack20")

set(targets_export_name ${CMUNIPACK_LIBRARY_NAME}Targets CACHE INTERNAL "")

set_property(GLOBAL PROPERTY USE_FOLDERS ON)

set(OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${OUTPUT_DIRECTORY})
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${OUTPUT_DIRECTORY})
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${OUTPUT_DIRECTORY})

include(CMakePackageConfigHelpers)
include(GNUInstallDirs)

if (MSVC)
    set(VSINSTALLDIR $ENV{VSINSTALLDIR} CACHE INTERNAL "")
    set(VCINSTALLDIR $ENV{VCINSTALLDIR} CACHE INTERNAL "")
endif(MSVC)

# Options
option(ENABLE_WCS "Enable support for WCS" ON)
option(ENABLE_TOOLKIT "Build and install command line tools" ON)
option(ENABLE_GUI "Build and install Muniwin - graphical user interface" ON)
option(ENABLE_TESTS "Build test suite." ON)
option(ENABLE_BUILD_DOC "Build manual and documentation" ON)
option(BUILD_SHARED_LIBS "Build shared libraries" ON)
if(WIN32)
    option(USE_INTERNAL_CFITSIO "Use internal cfitsio library" ON)
    option(USE_INTERNAL_ZLIB "Use internal zlib library" ON)
    option(USE_INTERNAL_EXPAT "Use internal expat library" ON)
    option(USE_EXTERNAL_FFTW3 "Use FFTW library" OFF)
else(WIN32)
    option(USE_INTERNAL_CFITSIO "Use internal cfitsio library" OFF)
    option(USE_INTERNAL_ZLIB "Use internal zlib library" OFF)
    option(USE_INTERNAL_EXPAT "Use internal expat library" OFF)
    option(USE_EXTENAL_FFTW3 "Use FFTW library" OFF)
endif(WIN32)

# Needed to include config.h
include_directories(${CMAKE_BINARY_DIR}/include)

# EXTERNAL DEPENDENCIES
# ---------------------

# M
if(UNIX AND NOT APPLE AND NOT BEOS AND NOT HAIKU AND NOT EMSCRIPTEN)
  find_library(M_LIBRARY m)
else()
  # libm is not needed and/or not available.
  set(M_LIBRARY "")
endif()

# ZLIB
if(USE_INTERNAL_ZLIB)
    message(STATUS "Using internal zlib library")
    add_subdirectory(thirdparty/zlib)
    add_library(cmpack_zlib ALIAS zlibstatic)
else(USE_INTERNAL_ZLIB)
    find_package(ZLIB REQUIRED)
    add_library(cmpack_zlib ALIAS ZLIB::ZLIB)
endif(USE_INTERNAL_ZLIB)

# CFITSIO
if(USE_INTERNAL_CFITSIO)
    message(STATUS "Using internal cfitsio library")
    add_subdirectory(thirdparty/cfitsio)
    add_library(cmpack_cfitsio ALIAS cfitsio)
else(CFITSIO REQUIRED)
    find_package(CFITSIO REQUIRED)
    add_library(cmpack_cfitsio ALIAS CFITSIO::CFITSIO)
endif(USE_INTERNAL_CFITSIO)

# EXPAT
if(USE_INTERNAL_EXPAT)
    message(STATUS "Using internal expat library")
    add_subdirectory(thirdparty/expat)
    add_library(cmpack_expat ALIAS expat)
else(USE_INTERNAL_EXPAT)
    find_package(EXPAT REQUIRED)
    add_library(cmpack_expat ALIAS EXPAT::EXPAT)
endif(USE_INTERNAL_EXPAT)

# WCSLIB
if(ENABLE_WCS)
    message(STATUS "Using internal wcslib library")
    add_subdirectory(thirdparty/wcslib)
    set(CMUNIPACK_HAVE_WCSLIB ON CACHE INTERNAL "")
    set(WCS_LIBRARY wcslib CACHE INTERNAL "")
else(ENABLE_WCS)
    set(CMUNIPACK_HAVE_WCSLIB OFF CACHE INTERNAL "")
    set(WCS_LIBRARY "" CACHE INTERNAL "")
endif(ENABLE_WCS)

# FFTPACK
if (USE_EXTENAL_FFTW3)
    find_package(FFTW3)
endif (USE_EXTENAL_FFTW3)
if (FFTW3_FOUND)
    set(CMUNIPACK_USE_FFTW 1)
    message(STATUS "Using FFTW")
else ()
    set(CMUNIPACK_USE_INTERNAL_FFTPACK 1)
    message(STATUS "Using internal fftpack library")
    add_subdirectory(thirdparty/fftpack)
    add_library(cmpack_fftpack ALIAS fftpack)
endif(FFTW3_FOUND)

# GTK
if(ENABLE_GUI)
    find_package(GTK2 2.8 REQUIRED gtk)
    if (WIN32)
        file(TO_CMAKE_PATH $ENV{GTKMM_BASEPATH} GTK2_ROOT)
    endif(WIN32)
endif(ENABLE_GUI)


# GLOBAL VARIABLES
# ----------------

if(UNIX AND NOT WIN32)
     get_filename_component(CMUNIPACK_INSTALL_DATADIR "${CMAKE_INSTALL_DATADIR}/${CMAKE_PROJECT_NAME}-${CMAKE_PROJECT_VERSION_MAJOR}.0" ABSOLUTE BASE_DIR "${CMAKE_INSTALL_PREFIX}" CACHE)
     add_compile_definitions(CMUNIPACK_INSTALL_DATADIR="${CMUNIPACK_INSTALL_DATADIR}")      
endif(UNIX AND NOT WIN32)

# CORE LIBRARY
# ------------

add_subdirectory(lib)

# COMMANDS (TOOLKIT)
# ------------------

if(ENABLE_TOOLKIT)
    add_subdirectory(toolkit)
endif(ENABLE_TOOLKIT)


# MUNIWIN (UI)
# ------------
if(ENABLE_GUI)
    add_subdirectory(muniwin)
endif(ENABLE_GUI)

# TESTS
# -----

if(ENABLE_TESTS)
    find_package(GTest CONFIG REQUIRED)
    add_library(gtest ALIAS GTest::gtest)
    add_library(gmock ALIAS GTest::gmock)
    include(GoogleTest)
endif(ENABLE_TESTS)


# DOCS & USER MANUAL
# ------------------

add_subdirectory(doc)


# CONFIGURATION FILES
# -------------------

file(WRITE ${CMAKE_BINARY_DIR}/VERSION ${CMAKE_PROJECT_VERSION})
if(UNIX AND NOT WIN32)
    install(FILES ${CMAKE_BINARY_DIR}/VERSION DESTINATION "${CMUNIPACK_INSTALL_DATADIR}")
else(UNIX AND NOT WIN32)
    install(FILES ${CMAKE_BINARY_DIR}/VERSION DESTINATION "${CMAKE_INSTALL_DATADIR}")
endif(UNIX AND NOT WIN32)

configure_file(${PROJECT_SOURCE_DIR}/cmake/config.h.in config.h)


# LICENCES
# --------

if(UNIX AND NOT WIN32)
    install(FILES COPYING LICENSE.CDDL LICENSE.GPL2 LICENSE.LGPL DESTINATION "${CMUNIPACK_INSTALL_DATADIR}")
else(UNIX AND NOT WIN32)
    install(FILES COPYING LICENSE.CDDL LICENSE.GPL2 LICENSE.LGPL DESTINATION "${CMAKE_INSTALL_DATADIR}")
endif(UNIX AND NOT WIN32)

# PACKAGING
# ---------

set(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake" ${CMAKE_MODULE_PATH})

configure_file(${PROJECT_SOURCE_DIR}/cmake/NSISConfig.nsh.in NSISConfig.nsh @ONLY)

set(CPACK_PACKAGE_VENDOR "David Motl")
set(CPACK_PACKAGE_FILE_NAME "${CMAKE_PROJECT_NAME}-${CMAKE_PROJECT_VERSION}-x64")
set(CPACK_PACKAGE_INSTALL_DIRECTORY "${CMAKE_PROJECT_NAME}-${CMAKE_PROJECT_VERSION_MAJOR}.${CMAKE_PROJECT_VERSION_MINOR}")
set(CPACK_PACKAGE_ICON "${CMAKE_SOURCE_DIR}/muniwin/src/muniwin.ico")
set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/COPYING")
set(CPACK_RESOURCE_FILE_README "${CMAKE_SOURCE_DIR}/README")
SET(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_CURRENT_SOURCE_DIR}/README")
set(CPACK_MONOLITHIC_INSTALL ON)
set(CPACK_STRIP_FILES ON)

set(CPACK_SOURCE_PACKAGE_FILE_NAME "${CMAKE_PROJECT_NAME}-${CMAKE_PROJECT_VERSION}-source")
set(CPACK_SOURCE_IGNORE_FILES "/.git/" "/.vs/" "/out/")

if(WIN32)
  set(CPACK_GENERATOR "NSIS")
  set(CPACK_SOURCE_GENERATOR "ZIP")
endif(WIN32)

include(CPack)
