cmake_minimum_required(VERSION 3.24) project(MinecraftConsoles LANGUAGES C CXX RC ASM_MASM) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) if(NOT WIN32) message(FATAL_ERROR "This CMake build currently supports Windows only.") endif() if(NOT CMAKE_SIZEOF_VOID_P EQUAL 8) message(FATAL_ERROR "Use a 64-bit generator/toolchain (x64).") endif() set(CMAKE_CONFIGURATION_TYPES "Debug" "Release" CACHE STRING "" FORCE ) set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") function(configure_msvc_target target) target_compile_options(${target} PRIVATE $<$,$>:/W3> $<$,$>:/W0> $<$:/MP> $<$:/FS> $<$:/GS-> $<$:/EHsc> $<$:/GR> $<$,$>:/Od> $<$,$>:/GL /O2 /Oi /GT /GF /Ob3> ) endfunction() # --- # Configuration # --- set(MINECRAFT_SHARED_DEFINES _LARGE_WORLDS _DEBUG_MENUS_ENABLED $<$:_DEBUG> _CRT_NON_CONFORMING_SWPRINTFS _CRT_SECURE_NO_WARNINGS ) # Add platform-specific defines list(APPEND MINECRAFT_SHARED_DEFINES ${PLATFORM_DEFINES}) set(WORLD_DIR "${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.World") set(CLIENT_DIR "${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Client") # --- # Sources # --- add_subdirectory(Minecraft.World) add_subdirectory(Minecraft.Client) # --- # MinecraftWorld # --- add_library(MinecraftWorld STATIC ${MINECRAFT_WORLD_SOURCES}) target_include_directories(MinecraftWorld PRIVATE "${CMAKE_CURRENT_BINARY_DIR}/generated/" "${WORLD_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}/include/" PUBLIC "${WORLD_DIR}/x64headers" ) target_compile_definitions(MinecraftWorld PRIVATE ${MINECRAFT_SHARED_DEFINES} _LIB ) if(MSVC) configure_msvc_target(MinecraftWorld) endif() # --- # MinecraftClient # --- add_executable(MinecraftClient WIN32 ${MINECRAFT_CLIENT_SOURCES}) target_include_directories(MinecraftClient PRIVATE "${CLIENT_DIR}" "${CLIENT_DIR}/Windows64/Iggy/include" "${CMAKE_CURRENT_SOURCE_DIR}/include/" ) target_compile_definitions(MinecraftClient PRIVATE ${MINECRAFT_SHARED_DEFINES} ) if(MSVC) configure_msvc_target(MinecraftClient) target_link_options(MinecraftClient PRIVATE $<$:/LTCG /INCREMENTAL:NO> ) endif() set_target_properties(MinecraftClient PROPERTIES VS_DEBUGGER_WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}" ) target_link_libraries(MinecraftClient PRIVATE MinecraftWorld d3d11 d3dcompiler XInput9_1_0 wsock32 legacy_stdio_definitions "${CLIENT_DIR}/Windows64/Iggy/lib/iggy_w64.lib" "${CLIENT_DIR}/Windows64/Iggy/lib/iggyperfmon_w64.lib" "${CLIENT_DIR}/Windows64/Iggy/lib/iggyexpruntime_w64.lib" $<$: # Debug 4J libraries "${CLIENT_DIR}/Windows64/4JLibs/libs/4J_Input_d.lib" "${CLIENT_DIR}/Windows64/4JLibs/libs/4J_Storage_d.lib" "${CLIENT_DIR}/Windows64/4JLibs/libs/4J_Render_PC_d.lib" > $<$>: # Release 4J libraries "${CLIENT_DIR}/Windows64/4JLibs/libs/4J_Input.lib" "${CLIENT_DIR}/Windows64/4JLibs/libs/4J_Storage.lib" "${CLIENT_DIR}/Windows64/4JLibs/libs/4J_Render_PC.lib" > ) # --- # Build versioning # --- set(BUILDVER_SCRIPT "${CMAKE_CURRENT_SOURCE_DIR}/cmake/GenerateBuildVer.cmake") set(BUILDVER_OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/generated/Common/BuildVer.h") add_custom_target(GenerateBuildVer COMMAND ${CMAKE_COMMAND} "-DOUTPUT_FILE=${BUILDVER_OUTPUT}" -P "${BUILDVER_SCRIPT}" COMMENT "Generating BuildVer.h..." VERBATIM ) add_dependencies(MinecraftClient GenerateBuildVer) # --- # Asset / redist copy # --- include("${CMAKE_CURRENT_SOURCE_DIR}/cmake/AssetCopyTargets.cmake") setup_asset_copy_targets() # Copy redist files add_custom_target(CopyRedist ALL COMMAND ${CMAKE_COMMAND} "-DCOPY_SOURCE=${CMAKE_CURRENT_SOURCE_DIR}/x64/Release" "-DCOPY_DEST=${CMAKE_CURRENT_BINARY_DIR}/$" -P "${COPY_SCRIPT}" COMMENT "Copying redist files..." VERBATIM ) add_dependencies(MinecraftClient CopyRedist) # --- # Project organisation # --- # Set the startup project for Visual Studio set_property(DIRECTORY PROPERTY VS_STARTUP_PROJECT MinecraftClient) # Setup folders for Visual Studio, just hides the build targets under a sub folder set_property(GLOBAL PROPERTY USE_FOLDERS ON) set_property(TARGET CopyRedist GenerateBuildVer PROPERTY FOLDER "Build")