configure_file(${CMAKE_CURRENT_SOURCE_DIR}/config.h.in ${CMAKE_CURRENT_BINARY_DIR}/config.h)

include(GNUInstallDirs)

if(WIN32)
  set(PKGCONFIG_LIBS_PRIVATE "")
else()
  set(PKGCONFIG_LIBS_PRIVATE "-lm")
endif()

set(PLFIT_CORE_SRCS error.c gss.c kolmogorov.c lbfgs.c mt.c plfit.c options.c rbinom.c sampling.c stats.c hzeta.c)

add_library(plfit ${PLFIT_CORE_SRCS})
target_include_directories(
  plfit PUBLIC
  ${CMAKE_CURRENT_BINARY_DIR}
  ${CMAKE_BINARY_DIR}/include
  ${CMAKE_CURRENT_SOURCE_DIR}
  ${CMAKE_SOURCE_DIR}/include
)
set_target_properties(plfit PROPERTIES SOVERSION 0)
target_link_libraries(plfit ${MATH_LIBRARY})

if(PLFIT_USE_OPENMP AND OPENMP_FOUND)
    target_link_libraries(plfit OpenMP::OpenMP_C)
endif()

if(CMAKE_C_COMPILER_ID STREQUAL "GNU" AND NOT APPLE)
  set_target_properties(plfit PROPERTIES LINK_FLAGS "-Wl,--version-script=${PROJECT_SOURCE_DIR}/src/plfit.map")
  set_target_properties(plfit PROPERTIES LINK_DEPENDS ${PROJECT_SOURCE_DIR}/src/plfit.map)
endif()

# Generate export header
include(GenerateExportHeader)
generate_export_header(plfit
  STATIC_DEFINE PLFIT_STATIC
  EXPORT_FILE_NAME ${PROJECT_BINARY_DIR}/include/plfit_export.h
)

join_paths(libdir_for_pc_file "\${exec_prefix}" "${CMAKE_INSTALL_LIBDIR}")
join_paths(includedir_for_pc_file "\${prefix}" "${CMAKE_INSTALL_INCLUDEDIR}")
configure_file(${PROJECT_SOURCE_DIR}/libplfit.pc.in ${PROJECT_BINARY_DIR}/libplfit.pc @ONLY)

install(TARGETS plfit LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})
install(
    FILES
    ${PROJECT_SOURCE_DIR}/include/plfit.h
    ${PROJECT_SOURCE_DIR}/include/plfit_decls.h
    ${PROJECT_SOURCE_DIR}/include/plfit_error.h
    ${PROJECT_BINARY_DIR}/include/plfit_export.h
    ${PROJECT_SOURCE_DIR}/include/plfit_mt.h
    ${PROJECT_SOURCE_DIR}/include/plfit_sampling.h
    ${PROJECT_BINARY_DIR}/include/plfit_version.h
    DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/plfit
)
install(
    FILES ${PROJECT_BINARY_DIR}/libplfit.pc
    DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig
)

add_executable(plfit-bin main.c getopt.c)
target_link_libraries(plfit-bin plfit ${MATH_LIBRARY})
set_target_properties(plfit-bin PROPERTIES OUTPUT_NAME plfit)
install(TARGETS plfit-bin RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})

add_executable(plgen plgen.c getopt.c)
target_link_libraries(plgen plfit ${MATH_LIBRARY})
install(TARGETS plgen RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})

if(PLFIT_COMPILE_PYTHON_MODULE)
    # Check whether we have SWIG and the Python libraries installed
    find_package(SWIG REQUIRED)
    include(${SWIG_USE_FILE})

    include(FindPython3)
	find_package(Python3 REQUIRED COMPONENTS Interpreter Development)

    set(CMAKE_SWIG_FLAGS "")
    set_property(SOURCE plfit.i PROPERTY SWIG_MODULE_NAME plfit)
    if (NOT BUILD_SHARED_LIBS)
        swig_add_library(plfit_python LANGUAGE python SOURCES plfit.i ${PLFIT_CORE_SRCS})
        target_link_libraries(plfit_python ${Python3_LIBRARIES} m)
    else()
        swig_add_library(plfit_python LANGUAGE python SOURCES plfit.i)
        target_link_libraries(plfit_python ${Python3_LIBRARIES} plfit m)
    endif()

    target_include_directories(
        plfit_python PUBLIC
        ${CMAKE_CURRENT_BINARY_DIR}
        ${CMAKE_BINARY_DIR}/include
        ${CMAKE_CURRENT_SOURCE_DIR}
        ${CMAKE_SOURCE_DIR}/include
        ${Python3_INCLUDE_DIRS}
    )

    install(TARGETS plfit_python DESTINATION ${Python3_SITEARCH})
	install(FILES ${CMAKE_CURRENT_BINARY_DIR}/plfit.py DESTINATION ${Python3_SITELIB})

endif(PLFIT_COMPILE_PYTHON_MODULE)
