RyanHub – file viewer
filename: CMakeLists.txt
branch: feature/world
back to repo
# Global
cmake_minimum_required(VERSION 3.20.0)
set(CMAKE_CXX_STANDARD 20)

# Project variables
set(LOCAL_PROJECT_NAME "Stratos")
set(LOCAL_PROJECT_VERSION "1.0.0")
set(LOCAL_PROJECT_DESCRIPTION "Server software for Minecraft")

# Debugging
# For C
set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -O0")
# For C++
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -O0")


# Source files
set(SOURCES
        Server.cpp
        block/state/StateProperty.cpp
        block/Blocks.cpp
        nbt/io/NBTBuffer.cpp
        nbt/CompoundTag.cpp
        nbt/ListTag.cpp
        nbt/NBT.cpp
        nbt/Value.cpp
        nbt/StringTag.cpp
        nbt/Tag.cpp
        network/Network.cpp
        network/session/NetworkClient.cpp
        network/session/SessionAuth.cpp
        network/io/Socket.cpp
        network/protocol/PacketSerialization.cpp
        network/protocol/Packet.cpp
        network/protocol/PacketCodec.cpp
        registry/Registry.cpp
        utils/collection/PalettedStorage.cpp
        utils/config/Config.cpp
        utils/crypto/CryptoUtils.cpp
        utils/hash/MD5.cpp
        utils/io/ByteBuffer.cpp
        utils/io/CompressionUtils.cpp
        utils/io/FileUtils.cpp
        utils/Identifier.cpp
        utils/StringUtils.cpp
        world/format/chunk/Chunk.cpp
        world/format/io/Region.cpp
)

set(HEADERS
        Server.h
        block/state/StateProperty.h
        block/Block.h
        block/Blocks.h
        block/BlockState.h
        math/Angle.h
        math/Ints.h
        math/Position.h
        nbt/io/NBTBuffer.h
        nbt/ArrayTag.h
        nbt/CompoundTag.h
        nbt/ListTag.h
        nbt/NBT.h
        nbt/Value.h
        nbt/PrimitiveTag.h
        nbt/StringTag.h
        nbt/Tag.h
        network/Network.h
        network/session/NetworkClient.h
        network/session/SessionAuth.h
        network/io/Socket.h
        network/protocol/PacketSerialization.h
        network/protocol/Packet.h
        network/protocol/PacketCodec.h
        registry/Registries.h
        registry/Registry.h
        utils/collection/Iterable.h
        utils/collection/PalettedStorage.h
        utils/config/Config.h
        utils/crypto/CryptoUtils.h
        utils/hash/MD5.h
        utils/io/FileUtils.h
        utils/io/ByteBuffer.h
        utils/io/CompressionUtils.h
        utils/Hash.h
        utils/Identifier.h
        utils/MathUtils.h
        utils/Predicate.h
        utils/StringUtils.h
        utils/TimeUtils.h
        utils/Types.h
        utils/UUID.h
        utils/Validate.h
        world/format/chunk/Chunk.h
        world/format/chunk/Palette.h
        world/format/io/Region.h
        world/format/Biome.h
)

# Project
project(${LOCAL_PROJECT_NAME}
        VERSION ${LOCAL_PROJECT_VERSION}
        DESCRIPTION ${LOCAL_PROJECT_DESCRIPTION}
        LANGUAGES CXX)

add_executable(${LOCAL_PROJECT_NAME})

list(TRANSFORM SOURCES PREPEND "src/")
list(TRANSFORM HEADERS PREPEND "src/")

target_include_directories(${LOCAL_PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src
        ${CMAKE_CURRENT_SOURCE_DIR}/vendor/spdlog/include
        ${CMAKE_CURRENT_SOURCE_DIR}/vendor/concurrentqueue
        ${CMAKE_CURRENT_SOURCE_DIR}/vendor/json/include
)
target_sources(${LOCAL_PROJECT_NAME} PRIVATE src/Stratos.cpp ${SOURCES} ${HEADERS})

if (WIN32)
    target_link_libraries(Stratos PRIVATE iphlpapi ws2_32)
endif ()

# OpenSSL
if (WIN32)
    set(OPENSSL_ROOT_DIR "C:/Program Files/OpenSSL-Win64")
    set(OPENSSL_INCLUDE_DIR "${OPENSSL_ROOT_DIR}/include")
    if(CMAKE_BUILD_TYPE STREQUAL "Debug")
        set(OPENSSL_LIB_DIR "${OPENSSL_ROOT_DIR}/lib/VC/x64/MDd")
    else()
        set(OPENSSL_LIB_DIR "${OPENSSL_ROOT_DIR}/lib/VC/x64/MD")
    endif()

    # Manually set the expected library paths
    set(OPENSSL_SSL_LIBRARY "${OPENSSL_LIB_DIR}/libssl.lib")
    set(OPENSSL_CRYPTO_LIBRARY "${OPENSSL_LIB_DIR}/libcrypto.lib")
    message(STATUS "Using OpenSSL from: ${OPENSSL_ROOT_DIR}\n\tInclude: ${OPENSSL_INCLUDE_DIR}\n\tSSL Library: ${OPENSSL_SSL_LIBRARY}\n\tCrypto Library: ${OPENSSL_CRYPTO_LIBRARY}")

    set(OPENSSL_USE_STATIC_LIBS TRUE)
    target_include_directories(${LOCAL_PROJECT_NAME} PRIVATE ${OPENSSL_INCLUDE_DIR})
    target_link_libraries(${LOCAL_PROJECT_NAME} PRIVATE ${OPENSSL_SSL_LIBRARY} ${OPENSSL_CRYPTO_LIBRARY})
else ()
    find_package(OpenSSL REQUIRED)
    if (OpenSSL_FOUND)
        message(STATUS "OpenSSL found: ${OPENSSL_INCLUDE_DIR} ${OpenSSL_LIBRARIES}")
        target_include_directories(${LOCAL_PROJECT_NAME} PRIVATE ${OPENSSL_INCLUDE_DIR})
        target_link_libraries(${LOCAL_PROJECT_NAME} PRIVATE ${OPENSSL_LIBRARIES})
    else ()
        message(FATAL_ERROR "OpenSSL not found. Please install OpenSSL or set the OPENSSL_ROOT_DIR variable.")
    endif ()
endif ()

# CPR
set(CPR_USE_SYSTEM_CURL OFF)
set(CPR_BUILD_TESTS OFF)
set(CPR_ENABLE_SSL ON)
set(CPR_BUILD_TESTS OFF)
set(CURL_ZLIB OFF)
set(CURL_USE_LIBIDN2 OFF)
set(CURL_USE_LIBPSL OFF)
set(CURL_ENABLE_HTTP ON)
set(CURL_ENABLE_SSL ON)
set(BUILD_CURL_EXE OFF)
set(BUILD_SHARED_LIBS OFF)
set(CURL_STATICLIB ON)
add_subdirectory(vendor/cpr)
target_link_libraries(${LOCAL_PROJECT_NAME} PRIVATE cpr::cpr)

# Zlib
set(BUILD_SHARED_LIBS OFF CACHE BOOL "Build static zlib")
add_subdirectory(vendor/zlib)
target_link_libraries(${LOCAL_PROJECT_NAME} PRIVATE zlibstatic)
target_include_directories(${LOCAL_PROJECT_NAME} PRIVATE vendor/zlib)


set_target_properties(${LOCAL_PROJECT_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "bin")

# Testing
enable_testing()

add_executable("${LOCAL_PROJECT_NAME}Test")

target_include_directories("${LOCAL_PROJECT_NAME}Test" PRIVATE
        ${CMAKE_CURRENT_SOURCE_DIR}/src
)

target_include_directories("${LOCAL_PROJECT_NAME}Test" PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src
        ${CMAKE_CURRENT_SOURCE_DIR}/vendor/spdlog/include
        ${CMAKE_CURRENT_SOURCE_DIR}/vendor/concurrentqueue
        ${CMAKE_CURRENT_SOURCE_DIR}/vendor/json/include
)
target_sources("${LOCAL_PROJECT_NAME}Test" PRIVATE
        test/stratos_test.cpp
        ${SOURCES}
        ${HEADERS}
)

if (WIN32)
    target_link_libraries("${LOCAL_PROJECT_NAME}Test" PRIVATE iphlpapi ws2_32)
    target_include_directories("${LOCAL_PROJECT_NAME}Test" PRIVATE ${OPENSSL_INCLUDE_DIR})
    target_link_libraries("${LOCAL_PROJECT_NAME}Test" PRIVATE ${OPENSSL_SSL_LIBRARY} ${OPENSSL_CRYPTO_LIBRARY})
else ()
    if (OpenSSL_FOUND)
        target_include_directories("${LOCAL_PROJECT_NAME}Test" PRIVATE ${OPENSSL_INCLUDE_DIR})
        target_link_libraries("${LOCAL_PROJECT_NAME}Test" PRIVATE ${OPENSSL_LIBRARIES})
    else ()
        message(FATAL_ERROR "OpenSSL not found. Please install OpenSSL or set the OPENSSL_ROOT_DIR variable.")
    endif ()
endif()
target_link_libraries("${LOCAL_PROJECT_NAME}Test" PRIVATE cpr::cpr)
target_link_libraries("${LOCAL_PROJECT_NAME}Test" PRIVATE zlib)
target_include_directories("${LOCAL_PROJECT_NAME}Test" PRIVATE vendor/zlib)

set_target_properties("${LOCAL_PROJECT_NAME}Test" PROPERTIES RUNTIME_OUTPUT_DIRECTORY "bin")

add_test(NAME NetworkSerialization COMMAND "${LOCAL_PROJECT_NAME}Test" --network-serialization)
add_test(NAME FileUtils COMMAND "${LOCAL_PROJECT_NAME}Test" --file-utils)
add_test(NAME StringUtils COMMAND "${LOCAL_PROJECT_NAME}Test" --string-utils)
add_test(NAME ByteBuffer COMMAND "${LOCAL_PROJECT_NAME}Test" --byte-buffer)
add_test(NAME NBT COMMAND "${LOCAL_PROJECT_NAME}Test" --nbt)
add_test(NAME Palette COMMAND "${LOCAL_PROJECT_NAME}Test" --palette)
add_test(NAME Predicate COMMAND "${LOCAL_PROJECT_NAME}Test" --predicate)