# 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)