##*************************************************************************##
##  CUBE        http://www.scalasca.org/                                   ##
##*************************************************************************##
##  Copyright (c) 2023-2024                                                ##
##  Forschungszentrum Juelich GmbH, Juelich Supercomputing Centre          ##
##                                                                         ##
##  This software may be modified and distributed under the terms of       ##
##  a BSD-style license.  See the COPYING file in the package base         ##
##  directory for details.                                                 ##
##*************************************************************************##


# Creates shared library libcube_library_tools.

set(HEADERS
     ./PerformanceAnalysis.h
     ./PerformanceTest.h
     ./PerformanceTest_incl.h
     ./bs/BSPOPHybridAuditAnalysis.h
     ./bs/BSPOPHybridCommunicationEfficiencyTest.h
     ./bs/BSPOPHybridLoadBalanceTest.h
     ./bs/BSPOPHybridMPICommunicationEfficiencyTest.h
     ./bs/BSPOPHybridMPILoadBalanceTest.h
     ./bs/BSPOPHybridMPIParallelEfficiencyTest.h
     ./bs/BSPOPHybridMPISerialisationTest.h
     ./bs/BSPOPHybridMPITransferTest.h
     ./bs/BSPOPHybridOMPCommunicationEfficiencyTest.h
     ./bs/BSPOPHybridOMPLoadBalanceEfficiencyTest.h
     ./bs/BSPOPHybridOMPParallelEfficiencyTest.h
     ./bs/BSPOPHybridParallelEfficiencyTest.h
     ./calculation/POPCalculation.h
     ./calculation/POPServerRequest.h
     ./common/POPComputationTimeTest.h
     ./common/POPIOEfficiencyTest.h
     ./common/POPIPCTest.h
     ./common/POPMpiIOTimeTest.h
     ./common/POPNoWaitINSTest.h
     ./common/POPPosixIOTimeTest.h
     ./common/POPStalledResourcesTest.h
     ./common/POPWallTimeTest.h
     ./common/gpu/POPGPUCommunicationEfficiencyTest.h
     ./common/gpu/POPGPUComputationTimeTest.h
     ./common/gpu/POPGPUImbalanceTest.h
     ./common/gpu/POPGPUParallelTest.h
     ./hybrid_add/POPHybridAmdahlTestAdd.h
     ./hybrid_add/POPHybridAuditAnalysisAdd.h
     ./hybrid_add/POPHybridCommunicationEfficiencyTestAdd.h
     ./hybrid_add/POPHybridImbalanceTestAdd.h
     ./hybrid_add/POPHybridOMPRegionEfficiencyTestAdd.h
     ./hybrid_add/POPHybridParallelEfficiencyTestAdd.h
     ./hybrid_add/POPHybridProcessEfficiencyTestAdd.h
     ./hybrid_add/POPHybridSerialisationTestAdd.h
     ./hybrid_add/POPHybridThreadEfficiencyTestAdd.h
     ./hybrid_add/POPHybridTransferTestAdd.h
     ./hybrid_mult/POPHybridAmdahlTest.h
     ./hybrid_mult/POPHybridAuditAnalysis.h
     ./hybrid_mult/POPHybridCommunicationEfficiencyTest.h
     ./hybrid_mult/POPHybridImbalanceTest.h
     ./hybrid_mult/POPHybridOMPRegionEfficiencyTest.h
     ./hybrid_mult/POPHybridParallelEfficiencyTest.h
     ./hybrid_mult/POPHybridProcessEfficiencyTest.h
     ./hybrid_mult/POPHybridSerialisationTest.h
     ./hybrid_mult/POPHybridThreadEfficiencyTest.h
     ./hybrid_mult/POPHybridTransferTest.h
     ./mpi/POPAuditAnalysis.h
     ./mpi/POPCommunicationEfficiencyTest.h
     ./mpi/POPImbalanceTest.h
     ./mpi/POPParallelEfficiencyTest.h
     ./mpi/POPSerialisationTest.h
     ./mpi/POPTransferTest.h
)

set(SOURCES
     ./PerformanceAnalysis.cpp
     ./PerformanceTest.cpp
     ./PerformanceTest_incl.cpp
     ./bs/BSPOPHybridAuditAnalysis.cpp
     ./bs/BSPOPHybridCommunicationEfficiencyTest.cpp
     ./bs/BSPOPHybridLoadBalanceTest.cpp
     ./bs/BSPOPHybridMPICommunicationEfficiencyTest.cpp
     ./bs/BSPOPHybridMPILoadBalanceTest.cpp
     ./bs/BSPOPHybridMPIParallelEfficiencyTest.cpp
     ./bs/BSPOPHybridMPISerialisationTest.cpp
     ./bs/BSPOPHybridMPITransferTest.cpp
     ./bs/BSPOPHybridOMPCommunicationEfficiencyTest.cpp
     ./bs/BSPOPHybridOMPLoadBalanceEfficiencyTest.cpp
     ./bs/BSPOPHybridOMPParallelEfficiencyTest.cpp
     ./bs/BSPOPHybridParallelEfficiencyTest.cpp
     ./calculation/POPCalculation.cpp
     ./calculation/POPServerRequest.cpp
     ./common/POPComputationTimeTest.cpp
     ./common/POPIOEfficiencyTest.cpp
     ./common/POPIPCTest.cpp
     ./common/POPMpiIOTimeTest.cpp
     ./common/POPNoWaitINSTest.cpp
     ./common/POPPosixIOTimeTest.cpp
     ./common/POPStalledResourcesTest.cpp
     ./common/POPWallTimeTest.cpp
     ./common/gpu/POPGPUCommunicationEfficiencyTest.cpp
     ./common/gpu/POPGPUComputationTimeTest.cpp
     ./common/gpu/POPGPUImbalanceTest.cpp
     ./common/gpu/POPGPUParallelTest.cpp
     ./hybrid_add/POPHybridAmdahlTestAdd.cpp
     ./hybrid_add/POPHybridAuditAnalysisAdd.cpp
     ./hybrid_add/POPHybridCommunicationEfficiencyTestAdd.cpp
     ./hybrid_add/POPHybridImbalanceTestAdd.cpp
     ./hybrid_add/POPHybridOMPRegionEfficiencyTestAdd.cpp
     ./hybrid_add/POPHybridParallelEfficiencyTestAdd.cpp
     ./hybrid_add/POPHybridProcessEfficiencyTestAdd.cpp
     ./hybrid_add/POPHybridSerialisationTestAdd.cpp
     ./hybrid_add/POPHybridThreadEfficiencyTestAdd.cpp
     ./hybrid_add/POPHybridTransferTestAdd.cpp
     ./hybrid_mult/POPHybridAmdahlTest.cpp
     ./hybrid_mult/POPHybridAuditAnalysis.cpp
     ./hybrid_mult/POPHybridCommunicationEfficiencyTest.cpp
     ./hybrid_mult/POPHybridImbalanceTest.cpp
     ./hybrid_mult/POPHybridOMPRegionEfficiencyTest.cpp
     ./hybrid_mult/POPHybridParallelEfficiencyTest.cpp
     ./hybrid_mult/POPHybridProcessEfficiencyTest.cpp
     ./hybrid_mult/POPHybridSerialisationTest.cpp
     ./hybrid_mult/POPHybridThreadEfficiencyTest.cpp
     ./hybrid_mult/POPHybridTransferTest.cpp
     ./mpi/POPAuditAnalysis.cpp
     ./mpi/POPCommunicationEfficiencyTest.cpp
     ./mpi/POPImbalanceTest.cpp
     ./mpi/POPParallelEfficiencyTest.cpp
     ./mpi/POPSerialisationTest.cpp
     ./mpi/POPTransferTest.cpp
)

file(GLOB CUBELIB_HEADERS_PUBLIC
     "*.h"
     "./bs/*.h"
     "./calculation/*.h"
     "./common/*.h"
     "./common/gpu/*.h"
     "./mpi/*.h"
     "./hybrid_add/*.h"
     "./hybrid_mult/*.h"
)

add_library(cube_popx_library OBJECT
    ${HEADERS}
    ${SOURCES}
)
set_property(TARGET cube_popx_library PROPERTY POSITION_INDEPENDENT_CODE ON)

target_link_libraries(cube_popx_library PRIVATE
    cube-base
    libcube_library_tools
    utils
    libjson_cpp_library
)

# popx includes are used by internal project 008a.POPx
target_include_directories(cube_popx_library PUBLIC
    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/calculation>
    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/common>
    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/common/gpu>
    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/mpi>
    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/hybrid_add>
    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/hybrid_mult>
    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/bs>
    $<INSTALL_INTERFACE:include/cubelib>
)

install(FILES
    ${CUBELIB_HEADERS_PUBLIC}
    DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/cubelib
)
