cmake_minimum_required(VERSION 3.18)

set(generated_dir "${CMAKE_CURRENT_BINARY_DIR}/generated" CACHE INTERNAL "")

#
# PUBLIC HEADERS
# --------------
#
set(cmpack_public_headers
include/cmpack_adcurve.h
include/cmpack_allfile.h
include/cmpack_amass.h
include/cmpack_astro.h
include/cmpack_bias.h
include/cmpack_catfile.h
include/cmpack_ccdfile.h
include/cmpack_common.h
include/cmpack_config.h
include/cmpack_console.h
include/cmpack_dark.h
include/cmpack_flat.h
include/cmpack_fset.h
include/cmpack_hcorr.h
include/cmpack_image.h
include/cmpack_kombine.h
include/cmpack_konve.h
include/cmpack_lcurve.h
include/cmpack_match.h
include/cmpack_mbias.h
include/cmpack_mdark.h
include/cmpack_mfind.h
include/cmpack_mflat.h
include/cmpack_phot.h
include/cmpack_phtfile.h
include/cmpack_readall.h
include/cmpack_table.h
include/cmpack_tcorr.h
include/cmpack_tcurve.h
include/cmpack_wcs.h
include/cmunipack.h
)


#
# PRIVATE HEADERS
# ---------------

set(cmpack_private_headers
src/allimport.h
src/attach.h
src/catfile.h
src/ccdfile.h
src/center.h
src/cholesky.h
src/comfun.h
src/console.h
src/cr3.h
src/crx.h
src/fft.h
src/filter.h
src/find.h
src/fotometr.h
src/frameset.h
src/hash.h
src/header.h
src/image.h
src/imageheader.h
src/iost.h
src/konvcr3.h
src/konvcrw.h
src/konvfits.h
src/konvmrw.h
src/konvnef.h
src/konvoes.h
src/konvsbig.h
src/linsolver.h
src/list.h
src/match.h
src/matfun.h
src/matphilnr.h
src/matread.h
src/matsimple.h
src/matsolve.h
src/matstack.h
src/matwrite.h
src/mem.h
src/oesfile.h
src/phfun.h
src/phot.h
src/phtfile.h
src/phwrite.h
src/qrdecomp.h
src/robmean.h
src/sky.h
src/sort.h
src/stars.h
src/strutils.h
src/table.h
src/tabparser.h
src/trajd.h
src/wcsobj.h
src/xmldom.h
)


#
# SOURCES
#
set(cmpack_sources
${cmpack_public_headers}
${cmpack_private_headers}
src/adcurve.c
src/allimport.c
src/amass.c
src/attach.c
src/bias.c
src/catfile.c
src/ccdfile.c
src/center.c
src/cholesky.c
src/comfun.c
src/common.c
src/console.c
src/cr3.c
src/crx.c
src/dark.c
src/fft.c
src/filter.c
src/find.c
src/flat.c
src/fotometr.c
src/frameset.c
src/hash.c
src/hcorr.c
src/header.c
src/image.c
src/imageheader.c
src/iost.c
src/kombine.c
src/konvcr3.c
src/konvcrw.c
src/konve.c
src/konvfits.c
src/konvmrw.c
src/konvnef.c
src/konvoes.c
src/konvsbig.c
src/lcurve.c
src/linsolver.c
src/list.c
src/match.c
src/matfun.c
src/matphilnr.c
src/matread.c
src/matsimple.c
src/matsolve.c
src/matstack.c
src/matwrite.c
src/mbias.c
src/mdark.c
src/mem.c
src/mfind.c
src/mflat.c
src/oesfile.c
src/phfun.c
src/phot.c
src/phtfile.c
src/phwrite.c
src/plot.c
src/qrdecomp.c
src/robmean.c
src/sky.c
src/sort.c
src/stars.c
src/strutils.c
src/table.c
src/tabparser.c
src/tcorr.c
src/tcurve.c
src/trajd.c
src/wcsobj.c
src/xmldom.c
)

if (MSVC)
    # to distinguish between debug and release lib
    set(CMAKE_DEBUG_POSTFIX "d")

    add_library(libcmpack SHARED ${cmpack_sources})

    # msvc does not append 'lib' - do it here to have consistent name
    set_target_properties(libcmpack PROPERTIES OUTPUT_NAME ${CMUNIPACK_LIBRARY_NAME})
    set_target_properties(libcmpack PROPERTIES PREFIX "lib")
    set_target_properties(libcmpack PROPERTIES IMPORT_PREFIX "lib")
    target_compile_definitions(libcmpack PRIVATE _CRT_SECURE_NO_DEPRECATE _CRT_SECURE_NO_WARNINGS _NO_OLDNAMES)
    target_compile_definitions(libcmpack PUBLIC CMUNIPACK_BUILD_SHARED_LIB)
    target_compile_options(libcmpack PRIVATE /W3 /WX)
    target_compile_options(libcmpack PRIVATE -D__STDC__=1)
  
else (MSVC)

    add_library(libcmpack SHARED ${cmpack_sources})
    target_compile_definitions(libcmpack PUBLIC CMUNIPACK_BUILD_SHARED_LIB)
    set_property(TARGET libcmpack PROPERTY POSITION_INDEPENDENT_CODE 1)
    set_target_properties(libcmpack PROPERTIES OUTPUT_NAME "${CMUNIPACK_LIBRARY_NAME}")

endif(MSVC)

target_include_directories(libcmpack PUBLIC 
    "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include;${generated_dir};${CMAKE_BINARY_DIR}>" 
    "$<INSTALL_INTERFACE:$<INSTALL_PREFIX>/${CMAKE_INSTALL_INCLUDEDIR}>"
)
set_target_properties(libcmpack PROPERTIES FOLDER lib)
set_target_properties(libcmpack PROPERTIES C_STANDARD 99)
target_link_libraries(libcmpack PRIVATE cmpack_zlib cmpack_cfitsio cmpack_expat ${WCS_LIBRARY} ${M_LIBRARY})

if (CMUNIPACK_USE_FFTW)
    target_link_libraries(libcmpack PRIVATE FFTW3::fftw3)
elseif (CMUNIPACK_USE_INTERNAL_FFTPACK)
    target_link_libraries(libcmpack PRIVATE fftpack)
endif(CMUNIPACK_USE_FFTW)

# Install the project targets.
install(TARGETS libcmpack EXPORT ${targets_export_name})

install(FILES ${cmpack_public_headers} TYPE INCLUDE)

# Install PDBs
if (MSVC)
    install(FILES $<TARGET_PDB_FILE:libcmpack> 
        CONFIGURATIONS "RelWithDebInfo" "Debug" 
        TYPE BIN
        OPTIONAL
    )
endif(MSVC)

# DOCUMENTATION
# -------------

add_subdirectory(doc)


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

configure_file(cmake/cmpack_version.h.in ${generated_dir}/cmpack_version.h)
install(FILES "${generated_dir}/cmpack_version.h" TYPE INCLUDE)

# INSTALL
# -------

# Needed to set the namespace for both the export targets and the
# alias libraries

set(version_file "${generated_dir}/${CMUNIPACK_LIBRARY_NAME}ConfigVersion.cmake")
write_basic_package_version_file(${version_file} VERSION ${PROJECT_VERSION} COMPATIBILITY AnyNewerVersion)

set(cmake_files_install_dir "${CMAKE_INSTALL_LIBDIR}/cmake/${CMUNIPACK_LIBRARY_NAME}-${PROJECT_VERSION}")
install(EXPORT ${targets_export_name} NAMESPACE ${CMUNIPACK_LIBRARY_NAME}:: DESTINATION ${cmake_files_install_dir})

set(config_file "${generated_dir}/${CMUNIPACK_LIBRARY_NAME}Config.cmake")
configure_package_config_file("${CMAKE_CURRENT_SOURCE_DIR}/cmake/Config.cmake.in" 
    "${config_file}" INSTALL_DESTINATION ${cmake_files_install_dir})

install(FILES ${version_file} ${config_file} 
    DESTINATION ${cmake_files_install_dir}
)

# Configure and install pkgconfig files.
set(configured_pc "${generated_dir}/${CMUNIPACK_LIBRARY_NAME}.pc")
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/cmake/${CMUNIPACK_LIBRARY_NAME}.pc.in" "${configured_pc}" @ONLY)

install(FILES "${configured_pc}" 
    DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig"
)
