include("${CMAKE_CURRENT_LIST_DIR}/cmake/sources/Common.cmake") include("${CMAKE_CURRENT_LIST_DIR}/cmake/sources/Windows.cmake") include("${CMAKE_SOURCE_DIR}/cmake/CommonSources.cmake") include("${CMAKE_SOURCE_DIR}/cmake/Utils.cmake") # Combine all source files into a single variable for the target # We cant use CMAKE_CONFIGURE_PRESET here as VS doesn't set it, so just rely on the folder set(MINECRAFT_CLIENT_SOURCES ${MINECRAFT_CLIENT_COMMON} ${MINECRAFT_CLIENT_WINDOWS} ${SOURCES_COMMON} ) add_executable(Minecraft.Client ${MINECRAFT_CLIENT_SOURCES}) # Only define executable on windows if(PLATFORM_NAME STREQUAL "Windows64") set_target_properties(Minecraft.Client PROPERTIES WIN32_EXECUTABLE TRUE) endif() target_include_directories(Minecraft.Client PRIVATE "${CMAKE_BINARY_DIR}/generated/" # This is for the generated BuildVer.h "${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}/Windows64/Libs/Iggy/inc" "${CMAKE_CURRENT_SOURCE_DIR}/Windows64/Libs/Discord/inc" "${CMAKE_CURRENT_SOURCE_DIR}/Common/Libs/zlib/inc" "${CMAKE_SOURCE_DIR}/include/" ) if(PLATFORM_NAME STREQUAL "Windows64") target_include_directories(Minecraft.Client PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/Windows64" "${CMAKE_CURRENT_SOURCE_DIR}/Windows64/Libs/4JLibs/inc" "${CMAKE_CURRENT_SOURCE_DIR}/Windows64/Libs/4JLibs/impls/Windows_Libs/Render/vendor" "${CMAKE_CURRENT_SOURCE_DIR}/Windows64/Libs/4JLibs/impls/Windows_Libs/Render/vendor/DirectXMath" "${CMAKE_SOURCE_DIR}/Minecraft.World/x64headers" ) # Build RmlUi as a static library (skip samples, tests, backends) set(BUILD_SHARED_LIBS OFF CACHE BOOL "" FORCE) # Download FreeType for RmlUi font engine include(FetchContent) set(CMAKE_POLICY_VERSION_MINIMUM 3.5) set(FT_DISABLE_ZLIB ON CACHE BOOL "" FORCE) set(FT_DISABLE_BZIP2 ON CACHE BOOL "" FORCE) set(FT_DISABLE_PNG ON CACHE BOOL "" FORCE) set(FT_DISABLE_HARFBUZZ ON CACHE BOOL "" FORCE) set(FT_DISABLE_BROTLI ON CACHE BOOL "" FORCE) FetchContent_Declare( freetype GIT_REPOSITORY https://gitlab.freedesktop.org/freetype/freetype.git GIT_TAG VER-2-13-2 GIT_SHALLOW TRUE ) FetchContent_MakeAvailable(freetype) if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND MINGW) target_compile_definitions(freetype PRIVATE _INC_SETJMPEX) endif() if(TARGET freetype-interface AND NOT TARGET Freetype::Freetype) add_library(Freetype::Freetype ALIAS freetype-interface) endif() set(RMLUI_SAMPLES OFF CACHE BOOL "" FORCE) set(RMLUI_TESTS OFF CACHE BOOL "" FORCE) set(RMLUI_LUA_BINDINGS OFF CACHE BOOL "" FORCE) set(RMLUI_LOTTIE_PLUGIN OFF CACHE BOOL "" FORCE) set(RMLUI_SVG_PLUGIN OFF CACHE BOOL "" FORCE) set(RMLUI_FONT_ENGINE "freetype" CACHE STRING "" FORCE) set(CMAKE_DISABLE_FIND_PACKAGE_Freetype ON CACHE BOOL "" FORCE) add_subdirectory("${CMAKE_CURRENT_SOURCE_DIR}/Windows64/Libs/RmlUi" "${CMAKE_BINARY_DIR}/rmlui") target_link_libraries(Minecraft.Client PRIVATE rmlui) # Add RmlUi include path only to files that include RmlUi headers, # not to the whole target (avoids PCH macro conflicts with windows.h). set(RMLUI_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/Windows64/Libs/RmlUi/Include") set(_RMLUI_SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_RmlBase.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_RmlBase.h" "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_HelpAndOptionsMenu.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_HelpAndOptionsMenu.h" "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_PauseMenu.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_PauseMenu.h" "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_SettingsMenu.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_SettingsMenu.h" "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_SkinSelectMenu.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_SkinSelectMenu.h" "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_LoadCreateJoinMenu.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_LoadCreateJoinMenu.h" "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_MessageBox.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_MessageBox.h" "${CMAKE_CURRENT_SOURCE_DIR}/Windows64/RmlUi_Renderer_D3D11.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/Windows64/RmlUi_Renderer_D3D11.h" "${CMAKE_CURRENT_SOURCE_DIR}/Windows64/RmlUi_SystemInterface_Win64.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/Windows64/RmlUi_SystemInterface_Win64.h" "${CMAKE_CURRENT_SOURCE_DIR}/Windows64/RmlUi_FileInterface.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/Windows64/RmlUi_FileInterface.h" "${CMAKE_CURRENT_SOURCE_DIR}/RmlManager.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/RmlManager.h" ) set_property(SOURCE ${_RMLUI_SOURCES} APPEND PROPERTY INCLUDE_DIRECTORIES "${RMLUI_INCLUDE_DIR}") endif() target_compile_definitions(Minecraft.Client PRIVATE ${MINECRAFT_SHARED_DEFINES} ) target_precompile_headers(Minecraft.Client PRIVATE "$<$:stdafx.h>") set_source_files_properties(compat_shims.cpp PROPERTIES SKIP_PRECOMPILE_HEADERS ON) # This redefines internal MSVC CRT symbols which will cause an issue with PCH configure_compiler_target(Minecraft.Client) set_target_properties(Minecraft.Client PROPERTIES OUTPUT_NAME "Project-Zenith" VS_DEBUGGER_WORKING_DIRECTORY "$" ) target_link_libraries(Minecraft.Client PRIVATE Minecraft.World d3d11 d3dcompiler ws2_32 $<$:legacy_stdio_definitions> # Allow our override of CRT internal symbols (__acrt_iob_func) to take priority $<$>:-Wl,--allow-multiple-definition> # Group libs with circular deps so linker rescan resolves all symbols $<$>:-Wl,--start-group> XInput9_1_0 $<$: # Debug Discord libraries "${CMAKE_CURRENT_SOURCE_DIR}/Windows64/Libs/Discord/libs/discord-rpc_d.lib" # Debug Discord libraries "${CMAKE_CURRENT_SOURCE_DIR}/Windows64/Libs/Discord/libs/discord-rpc_d.lib" # Debug 4J libraries "${CMAKE_CURRENT_SOURCE_DIR}/Windows64/Libs/4JLibs/libs/4J_Input_d.lib" "${CMAKE_CURRENT_SOURCE_DIR}/Windows64/Libs/4JLibs/libs/4J_Storage_d.lib" "${CMAKE_CURRENT_SOURCE_DIR}/Windows64/Libs/4JLibs/libs/4J_Render_PC_d.lib" # Debug ZLIB libraries ${CMAKE_CURRENT_SOURCE_DIR}/Common/Libs/zlib/libs/zlibstatic.lib > $<$>: # Release Discord libraries "${CMAKE_CURRENT_SOURCE_DIR}/Windows64/Libs/Discord/libs/discord-rpc.lib" # Release Discord libraries "${CMAKE_CURRENT_SOURCE_DIR}/Windows64/Libs/Discord/libs/discord-rpc.lib" # Release 4J libraries "${CMAKE_CURRENT_SOURCE_DIR}/Windows64/Libs/4JLibs/libs/4J_Input.lib" "${CMAKE_CURRENT_SOURCE_DIR}/Windows64/Libs/4JLibs/libs/4J_Storage.lib" "${CMAKE_CURRENT_SOURCE_DIR}/Windows64/Libs/4JLibs/libs/4J_Render_PC.lib" # Release ZLIB libraries ${CMAKE_CURRENT_SOURCE_DIR}/Common/Libs/zlib/libs/zlibstatic.lib > $<$>:${CMAKE_CURRENT_SOURCE_DIR}/Common/Libs/zlib/libs/libz.a> $<$>:${CMAKE_CURRENT_SOURCE_DIR}/Windows64/Libs/zstd/libs/libzstd.a> $<$>:-Wl,--end-group> ) # Iggy libs foreach(lib IN LISTS IGGY_LIBS) target_link_libraries(Minecraft.Client PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/Windows64/Libs/Iggy/libs/${lib}") endforeach() # --- # Asset / redist copy # --- include("${CMAKE_SOURCE_DIR}/cmake/CopyAssets.cmake") set(ASSET_FOLDER_PAIRS "${CMAKE_CURRENT_SOURCE_DIR}/Assets" "Assets" ) setup_asset_folder_copy(Minecraft.Client "${ASSET_FOLDER_PAIRS}") # Copy redist files add_copyredist_target(Minecraft.Client) # Make sure Saves exists on Windows if(PLATFORM_NAME STREQUAL "Windows64") add_saves_target(Minecraft.Client) endif()