##*************************************************************************##
##  CUBE        http://www.scalasca.org/                                   ##
##*************************************************************************##
##  Copyright (c) 2023-2025                                                ##
##  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.                                                 ##
##*************************************************************************##


if (WIN32)
    # windows server requires Qt::Network
    find_package(QT NAMES Qt6 REQUIRED COMPONENTS Core )
    find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Network )

    # generate moc files automatically
    set(CMAKE_AUTOMOC ON)
else()
    # also check arpa/inet.h netdb.h netinet/in.h sys/socket.h sys/errno.h sys/types.h sys/wait.h unistd.h ?
    check_include_file("sys/socket.h" HAVE_SOCKETS)
endif()

# headers files to install
file(GLOB CUBELIB_HEADERS_PUBLIC
     "./cube/include/*.h"
     "./cube/include/derivated/*.h"
     "./cube/include/dimensions/*.h"
     "./cube/include/dimensions/calltree/*.h"
     "./cube/include/dimensions/metric/*.h"
     "./cube/include/dimensions/metric/cache/*.h"
     "./cube/include/dimensions/metric/strategies/*.h"
     "./cube/include/dimensions/metric/value/*.h"
     "./cube/include/dimensions/system/*.h"
     "./cube/include/network/*.h"
     "./cube/include/topologies/*.h"
     "./tools/common_inc/*.h"
)
list(APPEND CUBELIB_HEADERS_PUBLIC
     ./cube/include/service/CubeCriticalSection.h
     ./cube/include/service/CubeError.h
     ./cube/include/service/CubeIdIndexMap.h
     ./cube/include/service/CubeOperationProgress.h
     ./cube/include/service/CubeOperator.h
     ./cube/include/service/CubePlatformsCompat.h
     ./cube/include/service/CubeSemaphore.h
     ./cube/include/service/CubeSimpleSemaphore.h
     ./cube/include/service/CubeServices.h
     ./cube/include/service/CubeTypes.h
     ./cube/include/service/CubeZfstream.h
)
list(APPEND CUBELIB_HEADERS_PUBLIC
     ./cube/include/syntax/CubeDriver.h
     ./cube/include/syntax/cubepl/CubePL0Driver.h
     ./cube/include/syntax/cubepl/CubePL0MemoryInitializer.h
     ./cube/include/syntax/cubepl/CubePL0MemoryManager.h
     ./cube/include/syntax/cubepl/CubePL1Driver.h
     ./cube/include/syntax/cubepl/CubePL1MemoryInitializer.h
     ./cube/include/syntax/cubepl/CubePL1MemoryManager.h
     ./cube/include/syntax/cubepl/CubePL2LocalMemoryManager.h
     ./cube/include/syntax/cubepl/CubePL2MemoryInitializer.h
     ./cube/include/syntax/cubepl/CubePL2MemoryManager.h
     ./cube/include/syntax/cubepl/CubePLDriver.h
     ./cube/include/syntax/cubepl/CubePLMemoryInitializer.h
     ./cube/include/syntax/cubepl/CubePLMemoryManager.h
     ./cube/include/syntax/cubepl/evaluators/CubeEvaluators.h
     ./cube/include/syntax/cubepl/evaluators/CubeGeneralEvaluation.h
)

# source files
set ( CUBELIB_SOURCES
    ./cube/src/Cube.cpp
    ./cube/src/CubeAtomicDataRoutines.cpp
    ./cube/src/CubeAtomicRowWiseDataRoutines.cpp
    ./cube/src/CubeCalculationListRoutines.cpp
    ./cube/src/CubeCalculationRoutines.cpp
    ./cube/src/CubeCalculationRowWiseListRoutines.cpp
    ./cube/src/CubeCalculationRowWiseRoutines.cpp
    ./cube/src/CubeIoProxy.cpp
    ./cube/src/CubeNetworkProxy.cpp
    ./cube/src/CubeProxy.cpp
    ./cube/src/derivated/AggrCube.cpp
    ./cube/src/derivated/AggrCubeMaps.cpp
    ./cube/src/dimensions/CubeIdentObject.cpp
    ./cube/src/dimensions/CubeSerializableVertex.cpp
    ./cube/src/dimensions/CubeVertex.cpp
    ./cube/src/dimensions/calltree/CubeCnode.cpp
    ./cube/src/dimensions/calltree/CubeRegion.cpp
    ./cube/src/dimensions/metric/CubeCustomPreDerivedExclusiveMetric.cpp
    ./cube/src/dimensions/metric/CubeCustomPreDerivedInclusiveMetric.cpp
    ./cube/src/dimensions/metric/CubeExclusiveMetric.cpp
    ./cube/src/dimensions/metric/CubeInclusiveMetric.cpp
    ./cube/src/dimensions/metric/CubeMetric.cpp
    ./cube/src/dimensions/metric/CubeMetricBuildInType.cpp
    ./cube/src/dimensions/metric/CubeMetricCalculation.cpp
    ./cube/src/dimensions/metric/CubeMetricDeprecated.cpp
    ./cube/src/dimensions/metric/CubeMetricValueType.cpp
    ./cube/src/dimensions/metric/CubePostDerivedMetric.cpp
    ./cube/src/dimensions/metric/CubePreDerivedExclusiveMetric.cpp
    ./cube/src/dimensions/metric/CubePreDerivedInclusiveMetric.cpp
    ./cube/src/dimensions/metric/data/CubeDataMarker.cpp
    ./cube/src/dimensions/metric/data/rows/CubeRORowsSupplier.cpp
    ./cube/src/dimensions/metric/data/rows/CubeROZRowsSupplier.cpp
    ./cube/src/dimensions/metric/data/rows/CubeRow.cpp
    ./cube/src/dimensions/metric/data/rows/CubeRowsManager.cpp
    ./cube/src/dimensions/metric/data/rows/CubeSwapRowsSupplier.cpp
    ./cube/src/dimensions/metric/data/rows/CubeWORowsSupplier.cpp
    ./cube/src/dimensions/metric/data/rows/CubeWOZRowsSupplier.cpp
    ./cube/src/dimensions/metric/index/CubeDenseIndex.cpp
    ./cube/src/dimensions/metric/index/CubeIndexHeader.cpp
    ./cube/src/dimensions/metric/index/CubeIndexManager.cpp
    ./cube/src/dimensions/metric/index/CubeIndexMarker.cpp
    ./cube/src/dimensions/metric/index/CubeSparseIndex.cpp
    ./cube/src/dimensions/metric/matrix/CubeAdvMatrix.cpp
    ./cube/src/dimensions/metric/matrix/CubeRowWiseMatrix.cpp
    ./cube/src/dimensions/metric/strategies/CubeAllInMemoryPreloadStrategy.cpp
    ./cube/src/dimensions/metric/strategies/CubeAllInMemoryStrategy.cpp
    ./cube/src/dimensions/metric/strategies/CubeBasicStrategy.cpp
    ./cube/src/dimensions/metric/strategies/CubeLastNRowsStrategy.cpp
    ./cube/src/dimensions/metric/strategies/CubeManualStrategy.cpp
    ./cube/src/dimensions/metric/strategies/CubeParanoidStrategy.cpp
    ./cube/src/dimensions/metric/value/CubeCharValue.cpp
    ./cube/src/dimensions/metric/value/CubeComplexValue.cpp
    ./cube/src/dimensions/metric/value/CubeDoubleValue.cpp
    ./cube/src/dimensions/metric/value/CubeHistogramValue.cpp
    ./cube/src/dimensions/metric/value/CubeMaxDoubleValue.cpp
    ./cube/src/dimensions/metric/value/CubeMinDoubleValue.cpp
    ./cube/src/dimensions/metric/value/CubeNDoublesValue.cpp
    ./cube/src/dimensions/metric/value/CubeRateValue.cpp
    ./cube/src/dimensions/metric/value/CubeScaleFuncValue.cpp
    ./cube/src/dimensions/metric/value/CubeSignedLongValue.cpp
    ./cube/src/dimensions/metric/value/CubeSignedShortValue.cpp
    ./cube/src/dimensions/metric/value/CubeSignedValue.cpp
    ./cube/src/dimensions/metric/value/CubeStatLevel1Value.cpp
    ./cube/src/dimensions/metric/value/CubeStatLevel2Value.cpp
    ./cube/src/dimensions/metric/value/CubeStatLevel3Value.cpp
    ./cube/src/dimensions/metric/value/CubeStatLevel4Value.cpp
    ./cube/src/dimensions/metric/value/CubeStringValue.cpp
    ./cube/src/dimensions/metric/value/CubeTauAtomicValue.cpp
    ./cube/src/dimensions/metric/value/CubeUnsignedLongValue.cpp
    ./cube/src/dimensions/metric/value/CubeUnsignedShortValue.cpp
    ./cube/src/dimensions/metric/value/CubeUnsignedValue.cpp
    ./cube/src/dimensions/metric/value/CubeValue.cpp
    ./cube/src/dimensions/metric/value/trafo/single_value/CubeNOPTrafo.cpp
    ./cube/src/dimensions/metric/value/trafo/single_value/CubeSwapBytesTrafo.cpp
    ./cube/src/dimensions/system/CubeLocation.cpp
    ./cube/src/dimensions/system/CubeLocationGroup.cpp
    ./cube/src/dimensions/system/CubeSysres.cpp
    ./cube/src/dimensions/system/CubeSystemTreeNode.cpp
    ./cube/src/network/CubeCallpathSubtreeValuesRequest.cpp
    ./cube/src/network/CubeCallpathTreeValuesRequest.cpp
    ./cube/src/network/CubeClientCallbackData.cpp
    ./cube/src/network/CubeClientConnection.cpp
    ./cube/src/network/CubeClientServerVersionRequest.cpp
    ./cube/src/network/CubeCloseCubeRequest.cpp
    ./cube/src/network/CubeConnection.cpp
    ./cube/src/network/CubeDefineMetricRequest.cpp
    ./cube/src/network/CubeDisconnectRequest.cpp
    ./cube/src/network/CubeFileSystemRequest.cpp
    ./cube/src/network/CubeFlatTreeValuesRequest.cpp
    ./cube/src/network/CubeMetricSubtreeValuesRequest.cpp
    ./cube/src/network/CubeMetricTreeValuesRequest.cpp
    ./cube/src/network/CubeMiscDataRequest.cpp
    ./cube/src/network/CubeNegotiateProtocolRequest.cpp
    ./cube/src/network/CubeNetworkRequest.cpp
    ./cube/src/network/CubeOpenAlgorithmRequest.cpp
    ./cube/src/network/CubeOpenCubeRequest.cpp
    ./cube/src/network/CubePluginRequest.cpp
    ./cube/src/network/CubeProtocol.cpp
    ./cube/src/network/CubeSaveCubeRequest.cpp
    ./cube/src/network/CubeSerializable.cpp
    ./cube/src/network/CubeSerializablesFactory.cpp
    ./cube/src/network/CubeServerCallbackData.cpp
    ./cube/src/network/CubeServerConnection.cpp
    ./cube/src/network/CubeSocket.cpp
    ./cube/src/network/CubeSystemTreeValuesRequest.cpp
    ./cube/src/network/CubeTreeValueRequest.cpp
    ./cube/src/network/CubeUrl.cpp
    ./cube/src/network/CubeVersionRequest.cpp
    ./cube/src/service/CubeDeepSearchEnumerator.cpp
    ./cube/src/service/CubeError.cpp
    ./cube/src/service/CubeIdIndexMap.cpp
    ./cube/src/service/CubeIstream.cpp
    ./cube/src/service/CubeObjectsEnumerator.cpp
    ./cube/src/service/CubePlatformsCompat.cpp
    ./cube/src/service/CubePredicates.cpp
    ./cube/src/service/CubeServices.cpp
    ./cube/src/service/CubeWideSearchEnumerator.cpp
    ./cube/src/service/CubeZfstream.cpp
    ./cube/src/service/cubelayout/CubeFileFinder.cpp
    ./cube/src/service/cubelayout/layout/CubeFileBaseLayout.cpp
    ./cube/src/service/cubelayout/layout/CubeFileEmbeddedLayout.cpp
    ./cube/src/service/cubelayout/layout/CubeLayoutDetector.cpp
    ./cube/src/service/cubelayout/layout/CubeVirtualLayout.cpp
    ./cube/src/service/cubelayout/readers/CubeSimpleReader.cpp
    ./cube/src/service/cubelayout/readers/CubeTarReader.cpp
    ./cube/src/syntax/Cube4Parser.cpp
    ./cube/src/syntax/Cube4Scanner.cpp
    ./cube/src/syntax/CubeDriver.cpp
    ./cube/src/syntax/cubepl/CubePL0Driver.cpp
    ./cube/src/syntax/cubepl/CubePL0MemoryInitializer.cpp
    ./cube/src/syntax/cubepl/CubePL0MemoryManager.cpp
    ./cube/src/syntax/cubepl/CubePL0Parser.cpp
    ./cube/src/syntax/cubepl/CubePL0Scanner.cpp
    ./cube/src/syntax/cubepl/CubePL1Driver.cpp
    ./cube/src/syntax/cubepl/CubePL1MemoryInitializer.cpp
    ./cube/src/syntax/cubepl/CubePL1MemoryManager.cpp
    ./cube/src/syntax/cubepl/CubePL1Parser.cpp
    ./cube/src/syntax/cubepl/CubePL1Scanner.cpp
    ./cube/src/syntax/cubepl/CubePL2LocalMemoryManager.cpp
    ./cube/src/syntax/cubepl/CubePL2MemoryInitializer.cpp
    ./cube/src/syntax/cubepl/CubePL2MemoryManager.cpp
    ./cube/src/syntax/cubepl/CubePLMemoryManager.cpp
    ./cube/src/syntax/cubepl/evaluators/CubeGeneralEvaluation.cpp
    ./cube/src/syntax/cubepl/evaluators/binary/CubeAndEvaluation.cpp
    ./cube/src/syntax/cubepl/evaluators/binary/CubeBiggerEvaluation.cpp
    ./cube/src/syntax/cubepl/evaluators/binary/CubeBinaryEvaluation.cpp
    ./cube/src/syntax/cubepl/evaluators/binary/CubeDivideEvaluation.cpp
    ./cube/src/syntax/cubepl/evaluators/binary/CubeEqualEvaluation.cpp
    ./cube/src/syntax/cubepl/evaluators/binary/CubeHalfBiggerEvaluation.cpp
    ./cube/src/syntax/cubepl/evaluators/binary/CubeHalfSmallerEvaluation.cpp
    ./cube/src/syntax/cubepl/evaluators/binary/CubeMinusEvaluation.cpp
    ./cube/src/syntax/cubepl/evaluators/binary/CubeMultEvaluation.cpp
    ./cube/src/syntax/cubepl/evaluators/binary/CubeNotEqualEvaluation.cpp
    ./cube/src/syntax/cubepl/evaluators/binary/CubeOrEvaluation.cpp
    ./cube/src/syntax/cubepl/evaluators/binary/CubePlusEvaluation.cpp
    ./cube/src/syntax/cubepl/evaluators/binary/CubePowerEvaluation.cpp
    ./cube/src/syntax/cubepl/evaluators/binary/CubeRegexEvaluation.cpp
    ./cube/src/syntax/cubepl/evaluators/binary/CubeSmallerEvaluation.cpp
    ./cube/src/syntax/cubepl/evaluators/binary/CubeStringEqualityEvaluation.cpp
    ./cube/src/syntax/cubepl/evaluators/binary/CubeStringSemiEqualityEvaluation.cpp
    ./cube/src/syntax/cubepl/evaluators/binary/CubeXorEvaluation.cpp
    ./cube/src/syntax/cubepl/evaluators/nullary/CubeArgumentEvaluation.cpp
    ./cube/src/syntax/cubepl/evaluators/nullary/CubeConstantEvaluation.cpp
    ./cube/src/syntax/cubepl/evaluators/nullary/CubeDefinedVariableEvaluation.cpp
    ./cube/src/syntax/cubepl/evaluators/nullary/CubeDirectMetricEvaluation.cpp
    ./cube/src/syntax/cubepl/evaluators/nullary/CubeNullaryEvaluation.cpp
    ./cube/src/syntax/cubepl/evaluators/nullary/CubeSizeOfVariableEvaluation.cpp
    ./cube/src/syntax/cubepl/evaluators/nullary/CubeStringConstantEvaluation.cpp
    ./cube/src/syntax/cubepl/evaluators/nullary/CubeStringEvaluation.cpp
    ./cube/src/syntax/cubepl/evaluators/nullary/statements/CubeAssignmentEvaluation.cpp
    ./cube/src/syntax/cubepl/evaluators/nullary/statements/CubeCallpathSetEvaluation.cpp
    ./cube/src/syntax/cubepl/evaluators/nullary/statements/CubeExtendedIfEvaluation.cpp
    ./cube/src/syntax/cubepl/evaluators/nullary/statements/CubeFullIfEvaluation.cpp
    ./cube/src/syntax/cubepl/evaluators/nullary/statements/CubeMetricSetEvaluation.cpp
    ./cube/src/syntax/cubepl/evaluators/nullary/statements/CubeRegionSetEvaluation.cpp
    ./cube/src/syntax/cubepl/evaluators/nullary/statements/CubeShortIfEvaluation.cpp
    ./cube/src/syntax/cubepl/evaluators/nullary/statements/CubeSysresSetEvaluation.cpp
    ./cube/src/syntax/cubepl/evaluators/nullary/statements/CubeVariableEvaluation.cpp
    ./cube/src/syntax/cubepl/evaluators/nullary/statements/CubeWhileEvaluation.cpp
    ./cube/src/syntax/cubepl/evaluators/unary/CubeCallpathGetEvaluation.cpp
    ./cube/src/syntax/cubepl/evaluators/unary/CubeEncapsulation.cpp
    ./cube/src/syntax/cubepl/evaluators/unary/CubeEnvEvaluation.cpp
    ./cube/src/syntax/cubepl/evaluators/unary/CubeLowerCaseEvaluation.cpp
    ./cube/src/syntax/cubepl/evaluators/unary/CubeMetricGetEvaluation.cpp
    ./cube/src/syntax/cubepl/evaluators/unary/CubeNegativeEvaluation.cpp
    ./cube/src/syntax/cubepl/evaluators/unary/CubeNotEvaluation.cpp
    ./cube/src/syntax/cubepl/evaluators/unary/CubePrintExpressionEvaluation.cpp
    ./cube/src/syntax/cubepl/evaluators/unary/CubeRegionGetEvaluation.cpp
    ./cube/src/syntax/cubepl/evaluators/unary/CubeSysresGetEvaluation.cpp
    ./cube/src/syntax/cubepl/evaluators/unary/CubeUnaryEvaluation.cpp
    ./cube/src/syntax/cubepl/evaluators/unary/CubeUpperCaseEvaluation.cpp
    ./cube/src/syntax/cubepl/evaluators/unary/functions/lambda_calcul/CubeLambdaCalculEvaluation.cpp
    ./cube/src/syntax/cubepl/evaluators/unary/functions/single_argument/CubeACosEvaluation.cpp
    ./cube/src/syntax/cubepl/evaluators/unary/functions/single_argument/CubeASinEvaluation.cpp
    ./cube/src/syntax/cubepl/evaluators/unary/functions/single_argument/CubeATanEvaluation.cpp
    ./cube/src/syntax/cubepl/evaluators/unary/functions/single_argument/CubeAbsEvaluation.cpp
    ./cube/src/syntax/cubepl/evaluators/unary/functions/single_argument/CubeCeilEvaluation.cpp
    ./cube/src/syntax/cubepl/evaluators/unary/functions/single_argument/CubeCosEvaluation.cpp
    ./cube/src/syntax/cubepl/evaluators/unary/functions/single_argument/CubeExpEvaluation.cpp
    ./cube/src/syntax/cubepl/evaluators/unary/functions/single_argument/CubeFloorEvaluation.cpp
    ./cube/src/syntax/cubepl/evaluators/unary/functions/single_argument/CubeLnEvaluation.cpp
    ./cube/src/syntax/cubepl/evaluators/unary/functions/single_argument/CubeNegEvaluation.cpp
    ./cube/src/syntax/cubepl/evaluators/unary/functions/single_argument/CubePosEvaluation.cpp
    ./cube/src/syntax/cubepl/evaluators/unary/functions/single_argument/CubeRandomEvaluation.cpp
    ./cube/src/syntax/cubepl/evaluators/unary/functions/single_argument/CubeSgnEvaluation.cpp
    ./cube/src/syntax/cubepl/evaluators/unary/functions/single_argument/CubeSinEvaluation.cpp
    ./cube/src/syntax/cubepl/evaluators/unary/functions/single_argument/CubeSqrtEvaluation.cpp
    ./cube/src/syntax/cubepl/evaluators/unary/functions/single_argument/CubeTanEvaluation.cpp
    ./cube/src/syntax/cubepl/evaluators/unary/functions/two_arguments/CubeMaxEvaluation.cpp
    ./cube/src/syntax/cubepl/evaluators/unary/functions/two_arguments/CubeMinEvaluation.cpp
    ./cube/src/topologies/CubeCartesian.cpp
    ./tools/common_src/Filter.cpp
    ./tools/common_src/algebra4.cpp
    ./tools/common_src/algebra4-internals.cpp
    ./tools/common_src/helper.cpp
    ${CUBELIB_HEADERS_PUBLIC} # required for IDEs to show headers
)

if (${HAVE_DLOPEN})
    list(APPEND CUBELIB_SOURCES
        ./cube/src/network/CubePluginManager.cpp
    )
    list(APPEND CUBELIB_HEADERS_PUBLIC
        ./cube/include/network/CubeServerPlugin.h
        ./cube/include/network/CubePluginManager.h
    )
endif()

if (WIN32)
    list(APPEND CUBELIB_SOURCES
       ./cube/src/network/CubeQtServerStreamSocket.cpp
    )
else()
    list(APPEND CUBELIB_SOURCES
        ./cube/src/network/CubePosixStreamSocket.cpp
    )
endif()

set ( CUBELIB_INCLUDE_DIRS
    ./tools
    ./tools/common_inc
    ./cube/include
    ./cube/include/derivated
    ./cube/include/dimensions
    ./cube/include/dimensions/calltree
    ./cube/include/dimensions/metric
    ./cube/include/dimensions/metric/cache
    ./cube/include/dimensions/metric/data
    ./cube/include/dimensions/metric/data/rows
    ./cube/include/dimensions/metric/index
    ./cube/include/dimensions/metric/matrix
    ./cube/include/dimensions/metric/strategies
    ./cube/include/dimensions/metric/value
    ./cube/include/dimensions/metric/value/trafo
    ./cube/include/dimensions/metric/value/trafo/single_value
    ./cube/include/dimensions/system
    ./cube/include/network
    ./cube/include/service
    ./cube/include/service/cubelayout
    ./cube/include/service/cubelayout/layout
    ./cube/include/service/cubelayout/readers
    ./cube/include/syntax
    ./cube/include/syntax/cubepl
    ./cube/include/syntax/cubepl/evaluators
    ./cube/include/syntax/cubepl/evaluators/binary
    ./cube/include/syntax/cubepl/evaluators/nullary
    ./cube/include/syntax/cubepl/evaluators/nullary/statements
    ./cube/include/syntax/cubepl/evaluators/unary
    ./cube/include/syntax/cubepl/evaluators/unary/functions/lambda_calcul
    ./cube/include/syntax/cubepl/evaluators/unary/functions/single_argument
    ./cube/include/syntax/cubepl/evaluators/unary/functions/two_arguments
    ./cube/include/topologies
)

#################################################################################
# cubelib base library
##################################################################################

# OBJECT libraries can be combined into a shared library
# In cubelib-autoconf this has been realised using static libraries and then linking them together with "-Wl,-whole-archive"
add_library(cube-base OBJECT
    ${CUBELIB_SOURCES}
)
set_property(TARGET cube-base PROPERTY POSITION_INDEPENDENT_CODE ON)

# these pathes will be propagated to all object libraries which depend on cube-base
target_include_directories(cube-base PUBLIC
    ${CUBELIB_INCLUDE_DIRS}
    ${CMAKE_BINARY_DIR}/src
)

target_compile_definitions(cube-base PRIVATE
    BACKEND_BUILD_NOMPI
    NOCROSS_BUILD
)

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

#################################################################################
# optional settings and libraries for the cubelib base library
##################################################################################
if (HAVE_SOCKETS)
    target_compile_definitions(cube-base PRIVATE HAVE_POSIX_SOCKET)
endif()

# zlib support for compression
if (WIN32)
     target_compile_definitions( cube-base PUBLIC FRONTEND_CUBE_COMPRESSED_READONLY )
     target_link_libraries( cube-base PUBLIC z )
else()
     set(CUBELIB_COMPRESSION "ReadOnly" CACHE STRING "Compression support (ReadOnly/ReadWrite/None)" )
     set_property(CACHE CUBELIB_COMPRESSION PROPERTY STRINGS "ReadOnly" "ReadWrite" "None")
     if (NOT CUBELIB_COMPRESSION STREQUAL "None")
          find_package(ZLIB QUIET)
          if (NOT ZLIB_FOUND)
               message("zlib is not available, compression is disabled")
          else()
               if (CUBELIB_COMPRESSION STREQUAL "ReadOnly")
                    target_compile_definitions( cube-base PUBLIC FRONTEND_CUBE_COMPRESSED_READONLY )
               elseif (CUBELIB_COMPRESSION STREQUAL "ReadWrite")
                    target_compile_definitions( cube-base PUBLIC FRONTEND_CUBE_COMPRESSED )
               endif()
               target_link_libraries( cube-base PUBLIC ZLIB::ZLIB )
               # CUBE_COMPRESSED is obsolete
          endif()
     endif()
endif()

target_link_libraries(cube-base PRIVATE utils Threads::Threads)
if (HAVE_DLOPEN)
     target_compile_definitions(cube-base PRIVATE HAVE_DLOPEN)
     target_link_libraries(cube-base PUBLIC
         $<IF:$<BOOL:${WIN32}>,dlfcn-win32::dl,dl> # dlopen requires an extra package on windows/mingw
     )
endif()
if (WIN32) # server on windows requires Qt
    target_link_libraries(cube-base PUBLIC
        Qt::Core
        Qt::Network
    )
endif()
