add_library(plutils STATIC "")
target_sources(plutils
        PRIVATE
        plutils.c
        PUBLIC
        plutils.h
        )
include_directories(plutils
        PUBLIC
        $<BUILD_INTERFACE:${CMAKE_BINARY_DIR}/${INSTALL_INCLUDEDIR}>
        $<INSTALL_INTERFACE:${INSTALL_INCLUDEDIR}>)
install(
        TARGETS
        plutils
        ARCHIVE
        DESTINATION ${INSTALL_LIBDIR}
        COMPONENT lib
        RUNTIME
        DESTINATION ${INSTALL_BINDIR}
        COMPONENT bin
        LIBRARY
        DESTINATION ${INSTALL_LIBDIR}
        COMPONENT lib
        PUBLIC_HEADER
        DESTINATION ${INSTALL_INCLUDEDIR}
        COMPONENT dev
)
#INCLUDE(plutils/CMakeLists.txt)
if(BUILD_SHARED_LIBS)
    add_library(parlibc-shared SHARED "")
    target_sources(parlibc-shared
            PRIVATE
            parlib.c
            bexchange.c
            transpose.c
            PUBLIC
            parlib.h)

    target_include_directories(parlibc-shared
            PUBLIC
            $<BUILD_INTERFACE:${CMAKE_BINARY_DIR}/${INSTALL_INCLUDEDIR}>
            $<INSTALL_INTERFACE:${INSTALL_INCLUDEDIR}>
            )
    target_link_libraries(parlibc-shared
            PRIVATE
            plutils
            PUBLIC
            $<$<BOOL:${MPI_FOUND}>:MPI::MPI_C>)

    set_target_properties(parlibc-shared
            PROPERTIES
            POSITION_INDEPENDENT_CODE 1
            VISIBILITY_INLINES_HIDDEN 1
            SOVERSION ${PROJECT_VERSION_MAJOR}
            OUTPUT_NAME "parlib"
            PUBLIC_HEADER "parlib.h"
            MACOSX_RPATH ON
            )
endif(BUILD_SHARED_LIBS)

if(BUILD_STATIC_LIBS)

add_library(parlibc-static STATIC "")
    target_sources(parlibc-static
            PRIVATE
            parlib.c
            bexchange.c
            transpose.c
            PUBLIC
            parlib.h)
set_target_properties(parlibc-static
        PROPERTIES
        POSITION_INDEPENDENT_CODE 1
        SOVERSION ${PROJECT_VERSION_MAJOR}
        ARCHIVE_OUTPUT_NAME "parlib"
        PUBLIC_HEADER "parlib.h"
        )
target_link_libraries(parlibc-static
        PRIVATE
        plutils
        PUBLIC
        $<$<BOOL:${MPI_FOUND}>:MPI::MPI_C>)
target_include_directories(parlibc-static
        PUBLIC
        $<BUILD_INTERFACE:${CMAKE_BINARY_DIR}/${INSTALL_INCLUDEDIR}>
        $<INSTALL_INTERFACE:${INSTALL_INCLUDEDIR}>
        )
endif(BUILD_STATIC_LIBS)
#if (CMAKE_BUILD_TYPE)
#    file(COPY parlib.h
#            DESTINATION
#            ${CMAKE_BINARY_DIR}/include)
#endif()
#install(TARGETS parlibc-static DESTINATION  ${CMAKE_BINARY_DIR}/lib)


if( BUILD_FORT_LIBS )
if(BUILD_STATIC_LIBS)
    if(FORTRANUNDERSCORE)
        add_definitions(-DFORTRANUNDERSCORE)
    elseif(FORTRANDOUBLEUNDERSCORE)
        add_definitions(-DFORTRANDOUBLEUNDERSCORE)
    endif()
    include(FortranCInterface)
    FortranCInterface_VERIFY()
    FortranCInterface_HEADER(${CMAKE_CURRENT_SOURCE_DIR}/FC.h MACRO_NAMESPACE "FC_")
    message(STATUS "FORTRAN_C_INTEFACE TEST:    ${FortranCInterface_VERIFIED_C}")
    add_definitions(-DFC_MANGLE=1)
    add_library(parlibf-static STATIC "")
    target_sources( parlibf-static
            PRIVATE
            parlibf.c
            bexchangef.c
            transposef.c
            FC.h
            PUBLIC
            parlibf.h)

    target_link_libraries(parlibf-static
            PRIVATE
            plutils
            PUBLIC
            MPI::MPI_C
            parlibc-static)
    set_target_properties(parlibf-static
            PROPERTIES
            ARCHIVE_OUTPUT_NAME "parlibf"
            PUBLIC_HEADER "parlibf.h"
            LINKER_LANGUAGE Fortran
            )
    target_include_directories(parlibf-static
            PUBLIC
            $<BUILD_INTERFACE:${CMAKE_BINARY_DIR}/${INSTALL_INCLUDEDIR}>
            $<INSTALL_INTERFACE:${INSTALL_INCLUDEDIR}>
            )
endif(BUILD_STATIC_LIBS)
    if(BUILD_SHARED_LIBS)
    add_library(parlibf-shared SHARED "")
    target_sources(parlibf-shared
            PRIVATE
            parlibf.c
            bexchangef.c
            transposef.c
            FC.h
            PUBLIC
            parlibf.h)

    target_link_libraries(parlibf-shared
            PRIVATE
            plutils
            PRIVATE
            PUBLIC
            MPI::MPI_C
            parlibc-shared)

    set_target_properties(parlibf-shared
            PROPERTIES
            POSITION_INDEPENDENT_CODE 1
            VISIBILITY_INLINES_HIDDEN 1
            SOVERSION ${PROJECT_VERSION_MAJOR}
            OUTPUT_NAME "parlibf"
            PUBLIC_HEADER "parlibf.h"
            MACOSX_RPATH ON
            LINKER_LANGUAGE Fortran
            )

    target_include_directories(parlibf-shared
            PUBLIC
            $<BUILD_INTERFACE:${CMAKE_BINARY_DIR}/${INSTALL_INCLUDEDIR}>
            $<INSTALL_INTERFACE:${INSTALL_INCLUDEDIR}>
            )
endif(BUILD_SHARED_LIBS)

endif(BUILD_FORT_LIBS)

#~TESTS
if(BUILD_FORT_LIBS)
if(BUILD_SHARED_LIBS)
add_executable(parlibf_test_shared parlibf_test.F90)
target_link_libraries(parlibf_test_shared
        parlibf-shared)
endif(BUILD_SHARED_LIBS)
if(BUILD_STATIC_LIBS)
    add_executable(parlibf_test_static parlibf_test.F90)
    target_link_libraries(parlibf_test_static
            parlibf-static)
endif(BUILD_STATIC_LIBS)
endif(BUILD_FORT_LIBS)
if(BUILD_SHARED_LIBS)
    add_executable(parlibc_test_shared parlibc-test.c)
target_link_libraries(parlibc_test_shared
        parlibc-shared)
endif(BUILD_SHARED_LIBS)
if(BUILD_STATIC_LIBS)
    add_executable(parlibc_test_static parlibc-test.c)
    target_link_libraries(parlibc_test_static
            parlibc-static)
endif(BUILD_STATIC_LIBS)
#Installation
if(BUILD_STATIC_LIBS)
install(
        TARGETS
        parlibc-static
        ARCHIVE
        DESTINATION ${INSTALL_LIBDIR}
        COMPONENT lib
        RUNTIME
        DESTINATION ${INSTALL_BINDIR}
        COMPONENT bin
        LIBRARY
        DESTINATION ${INSTALL_LIBDIR}
        COMPONENT lib
        PUBLIC_HEADER
        DESTINATION ${INSTALL_INCLUDEDIR}
        COMPONENT dev
)
endif(BUILD_STATIC_LIBS)
if(BUILD_SHARED_LIBS)
install(
        TARGETS
        parlibc-shared
        ARCHIVE
        DESTINATION ${INSTALL_LIBDIR}
        COMPONENT lib
        RUNTIME
        DESTINATION ${INSTALL_BINDIR}
        COMPONENT bin
        LIBRARY
        DESTINATION ${INSTALL_LIBDIR}
        COMPONENT lib
        PUBLIC_HEADER
        DESTINATION ${INSTALL_INCLUDEDIR}
        COMPONENT dev
)
endif(BUILD_SHARED_LIBS)

if( BUILD_FORT_LIBS )
if(BUILD_STATIC_LIBS)
install(
        TARGETS
        parlibf-static
        ARCHIVE
        DESTINATION ${INSTALL_LIBDIR}
        COMPONENT lib
        RUNTIME
        DESTINATION ${INSTALL_BINDIR}
        COMPONENT bin
        LIBRARY
        DESTINATION ${INSTALL_LIBDIR}
        COMPONENT lib
        PUBLIC_HEADER
        DESTINATION ${INSTALL_INCLUDEDIR}
        COMPONENT dev
)
endif(BUILD_STATIC_LIBS)
if(BUILD_SHARED_LIBS)
    install(
            TARGETS
            parlibf-shared
            ARCHIVE
            DESTINATION ${INSTALL_LIBDIR}
            COMPONENT lib
            RUNTIME
            DESTINATION ${INSTALL_BINDIR}
            COMPONENT bin
            LIBRARY
            DESTINATION ${INSTALL_LIBDIR}
            COMPONENT lib
            PUBLIC_HEADER
            DESTINATION ${INSTALL_INCLUDEDIR}
            COMPONENT dev
    )
endif(BUILD_SHARED_LIBS)
endif(BUILD_FORT_LIBS)

#adding man pages
add_subdirectory(man)