Update the build system to create arc files

This commit is contained in:
BlueishSapphire 2026-03-05 23:26:55 -05:00
parent 09dff8f173
commit 92e751ac6b
No known key found for this signature in database
3 changed files with 549 additions and 54 deletions

View file

@ -88,59 +88,6 @@ target_link_libraries(MinecraftClient PRIVATE
>
)
if(CMAKE_HOST_WIN32)
message(STATUS "Starting redist copy...")
execute_process(
COMMAND robocopy.exe
"${CMAKE_CURRENT_SOURCE_DIR}/x64/Release"
"${CMAKE_CURRENT_BINARY_DIR}"
/S /MT /R:0 /W:0 /NP
)
message(STATUS "Starting asset copy...")
execute_process(
COMMAND robocopy.exe
"${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Client"
"${CMAKE_CURRENT_BINARY_DIR}"
/S /MT /R:0 /W:0 /NP
/XF "*.cpp" "*.c" "*.h" "*.hpp" "*.asm"
"*.xml" "*.lang" "*.vcxproj" "*.vcxproj.*" "*.sln"
"*.docx" "*.xls"
"*.bat" "*.cmd" "*.ps1" "*.py"
"*Test*"
/XD "Durango*" "Orbis*" "PS*" "Xbox"
)
message(STATUS "Patching Windows64Media...")
execute_process(
COMMAND robocopy.exe
"${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Client/DurangoMedia"
"${CMAKE_CURRENT_BINARY_DIR}/Windows64Media"
/S /MT /R:0 /W:0 /NP
/XF "*.h" "*.xml" "*.lang" "*.bat"
)
elseif(CMAKE_HOST_UNIX)
message(STATUS "Starting redist copy...")
execute_process(
COMMAND rsync -av "${CMAKE_CURRENT_SOURCE_DIR}/x64/Release/" "${CMAKE_CURRENT_BINARY_DIR}/"
)
message(STATUS "Starting asset copy...")
execute_process(
COMMAND rsync -av
"--exclude=*.cpp" "--exclude=*.c" "--exclude=*.h" "--exclude=*.hpp" "--exclude=*.asm"
"--exclude=*.xml" "--exclude=*.lang" "--exclude=*.vcxproj" "--exclude=*.vcxproj.*" "--exclude=*.sln"
"--exclude=*.docx" "--exclude=*.xls"
"--exclude=*.bat" "--exclude=*.cmd" "--exclude=*.ps1" "--exclude=*.py"
"--exclude=*Test*"
"--exclude=Durango*" "--exclude=Orbis*" "--exclude=PS*" "--exclude=Xbox"
"${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Client/" "${CMAKE_CURRENT_BINARY_DIR}/"
)
message(STATUS "Patching Windows64Media...")
execute_process(
COMMAND rsync -av
"--exclude=*.h" "--exclude=*.xml" "--exclude=*.lang" "--exclude=*.bat"
"${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Client/DurangoMedia/" "${CMAKE_CURRENT_BINARY_DIR}/Windows64Media/"
)
else()
message(FATAL_ERROR "Redist and asset copying is only supported on Windows (Robocopy) and Unix systems (rsync).")
endif()
include("${CMAKE_CURRENT_SOURCE_DIR}/cmake/CopyAssets.cmake")
set_property(DIRECTORY PROPERTY VS_STARTUP_PROJECT MinecraftClient)

460
cmake/AssetSources.cmake Normal file
View file

@ -0,0 +1,460 @@
set(ASSETS_COMMON
"Graphics/MinecraftIcon.png"
"Graphics/SaveChest.png"
"Graphics/TexturePackIcon.png"
"HTMLColours.col"
"languages.loc"
"splashes.txt"
)
set(ASSETS_1080P
"AnvilMenu1080.swf"
"AnvilMenuSplit1080.swf"
"BeaconMenu1080.swf"
"BeaconMenuSplit1080.swf"
"BrewingStandMenu1080.swf"
"BrewingStandMenuSplit1080.swf"
"ChestLargeMenu1080.swf"
"ChestLargeMenuSplit1080.swf"
"ChestMenu1080.swf"
"ChestMenuSplit1080.swf"
"ComponentLogo1080.swf"
"ComponentLogoSplit1080.swf"
"Controls1080.swf"
"ControlsRemotePlay1080.swf"
"ControlsSplit1080.swf"
"Crafting2x2Menu1080.swf"
"Crafting2x2MenuSplit1080.swf"
"Crafting3x3Menu1080.swf"
"Crafting3x3MenuSplit1080.swf"
"CreateWorldMenu1080.swf"
"CreativeMenu1080.swf"
"CreativeMenuSplit1080.swf"
"Credits1080.swf"
"DLCMainMenu1080.swf"
"DLCOffersMenu1080.swf"
"DeathMenu1080.swf"
"DeathMenuSplit1080.swf"
"DispenserMenu1080.swf"
"DispenserMenuSplit1080.swf"
"EULA1080.swf"
"EnchantingMenu1080.swf"
"EnchantingMenuSplit1080.swf"
"EndPoem1080.swf"
"FireworksMenu1080.swf"
"FireworksMenuSplit1080.swf"
"FullscreenProgress1080.swf"
"FullscreenProgressSplit1080.swf"
"FurnaceMenu1080.swf"
"FurnaceMenuSplit1080.swf"
"HUD1080.swf"
"HUDSplit1080.swf"
"HelpAndOptionsMenu1080.swf"
"HelpAndOptionsMenuSplit1080.swf"
"HopperMenu1080.swf"
"HopperMenuSplit1080.swf"
"HorseInventoryMenu1080.swf"
"HorseInventoryMenuSplit1080.swf"
"HowToPlay1080.swf"
"HowToPlayMenu1080.swf"
"HowToPlayMenuSplit1080.swf"
"HowToPlaySplit1080.swf"
"InGameHostOptions1080.swf"
"InGameHostOptionsSplit1080.swf"
"InGameInfoMenu1080.swf"
"InGameInfoMenuSplit1080.swf"
"InGamePlayerOptions1080.swf"
"InGamePlayerOptionsSplit1080.swf"
"InGameTeleportMenu1080.swf"
"InGameTeleportMenuSplit1080.swf"
"Intro1080.swf"
"InventoryMenu1080.swf"
"InventoryMenuSplit1080.swf"
"JoinMenu1080.swf"
"Keyboard1080.swf"
"KeyboardSplit1080.swf"
"LanguagesMenu1080.swf"
"LanguagesMenuSplit1080.swf"
"LaunchMoreOptionsMenu1080.swf"
"LeaderboardMenu1080.swf"
"LoadMenu1080.swf"
"LoadOrJoinMenu1080.swf"
"MainMenu1080.swf"
"MenuBackground1080.swf"
"MessageBox1080.swf"
"MessageBoxSplit1080.swf"
"NewUpdateMessage1080.swf"
"Panorama1080.swf"
"PanoramaSplit1080.swf"
"PauseMenu1080.swf"
"PauseMenuSplit1080.swf"
"PressStartToPlay1080.swf"
"QuadrantSignin1080.swf"
"ReinstallMenu1080.swf"
"ReinstallMenuSplit1080.swf"
"SaveMenu1080.swf"
"SaveMessage1080.swf"
"SettingsAudioMenu1080.swf"
"SettingsAudioMenuSplit1080.swf"
"SettingsControlMenu1080.swf"
"SettingsControlMenuSplit1080.swf"
"SettingsGraphicsMenu1080.swf"
"SettingsGraphicsMenuSplit1080.swf"
"SettingsMenu1080.swf"
"SettingsMenuSplit1080.swf"
"SettingsOptionsMenu1080.swf"
"SettingsOptionsMenuSplit1080.swf"
"SettingsUIMenu1080.swf"
"SettingsUIMenuSplit1080.swf"
"SignEntryMenu1080.swf"
"SignEntryMenuSplit1080.swf"
"SkinSelectMenu1080.swf"
"SkinSelectMenuSplit1080.swf"
"Timer1080.swf"
"TimerSplit1080.swf"
"ToolTips1080.swf"
"ToolTipsSplit1080.swf"
"TradingMenu1080.swf"
"TradingMenuSplit1080.swf"
"TutorialPopup1080.swf"
"TutorialPopupSplit1080.swf"
)
set(ASSETS_DEBUG_1080P
"DebugCreateSchematic1080.swf"
"DebugMenu1080.swf"
"DebugOptionsMenu1080.swf"
"DebugSetCamera1080.swf"
"DebugUIConsoleComponent1080.swf"
"DebugUIMarketingGuide1080.swf"
)
set(ASSETS_720P
"AnvilMenu720.swf"
"AnvilMenuSplit720.swf"
"BeaconMenu720.swf"
"BeaconMenuSplit720.swf"
"BrewingStandMenu720.swf"
"BrewingStandMenuSplit720.swf"
"ChestLargeMenu720.swf"
"ChestLargeMenuSplit720.swf"
"ChestMenu720.swf"
"ChestMenuSplit720.swf"
"ComponentLogo720.swf"
"ComponentLogoSplit720.swf"
"Controls720.swf"
"ControlsSplit720.swf"
"Crafting2x2Menu720.swf"
"Crafting2x2MenuSplit720.swf"
"Crafting3x3Menu720.swf"
"Crafting3x3MenuSplit720.swf"
"CreateWorldMenu720.swf"
"CreativeMenu720.swf"
"CreativeMenuSplit720.swf"
"Credits720.swf"
"DLCMainMenu720.swf"
"DLCOffersMenu720.swf"
"DeathMenu720.swf"
"DeathMenuSplit720.swf"
"DispenserMenu720.swf"
"DispenserMenuSplit720.swf"
"EULA720.swf"
"EnchantingMenu720.swf"
"EnchantingMenuSplit720.swf"
"EndPoem720.swf"
"FireworksMenu720.swf"
"FireworksMenuSplit720.swf"
"FullscreenProgress720.swf"
"FullscreenProgressSplit720.swf"
"FurnaceMenu720.swf"
"FurnaceMenuSplit720.swf"
"GamertagSplit720.swf"
"HUD720.swf"
"HUDSplit720.swf"
"HelpAndOptionsMenu720.swf"
"HelpAndOptionsMenuSplit720.swf"
"HopperMenu720.swf"
"HopperMenuSplit720.swf"
"HorseInventoryMenu720.swf"
"HorseInventoryMenuSplit720.swf"
"HowToPlay720.swf"
"HowToPlayMenu720.swf"
"HowToPlayMenuSplit720.swf"
"HowToPlaySplit720.swf"
"InGameHostOptions720.swf"
"InGameHostOptionsSplit720.swf"
"InGameInfoMenu720.swf"
"InGameInfoMenuSplit720.swf"
"InGamePlayerOptions720.swf"
"InGamePlayerOptionsSplit720.swf"
"InGameTeleportMenu720.swf"
"InGameTeleportMenuSplit720.swf"
"Intro720.swf"
"InventoryMenu720.swf"
"InventoryMenuSplit720.swf"
"JoinMenu720.swf"
"LanguagesMenu720.swf"
"LanguagesMenuSplit720.swf"
"LaunchMoreOptionsMenu720.swf"
"LeaderboardMenu720.swf"
"LoadMenu720.swf"
"LoadOrJoinMenu720.swf"
"MainMenu720.swf"
"MenuBackground720.swf"
"MessageBox720.swf"
"MessageBoxSplit720.swf"
"NewUpdateMessage720.swf"
"Panorama720.swf"
"PanoramaSplit720.swf"
"PauseMenu720.swf"
"PauseMenuSplit720.swf"
"PressStartToPlay720.swf"
"QuadrantSignin720.swf"
"ReinstallMenu720.swf"
"ReinstallMenuSplit720.swf"
"SaveMessage720.swf"
"SettingsAudioMenu720.swf"
"SettingsAudioMenuSplit720.swf"
"SettingsControlMenu720.swf"
"SettingsControlMenuSplit720.swf"
"SettingsGraphicsMenu720.swf"
"SettingsGraphicsMenuSplit720.swf"
"SettingsMenu720.swf"
"SettingsMenuSplit720.swf"
"SettingsOptionsMenu720.swf"
"SettingsOptionsMenuSplit720.swf"
"SettingsUIMenu720.swf"
"SettingsUIMenuSplit720.swf"
"SignEntryMenu720.swf"
"SignEntryMenuSplit720.swf"
"SkinSelectMenu720.swf"
"SkinSelectMenuSplit720.swf"
"Timer720.swf"
"ToolTips720.swf"
"ToolTipsSplit720.swf"
"TradingMenu720.swf"
"TradingMenuSplit720.swf"
"TrialExitUpsell720.swf"
"TutorialPopup720.swf"
"TutorialPopupSplit720.swf"
)
set(ASSETS_DEBUG_720P
"DebugCreateSchematic720.swf"
"DebugMenu720.swf"
"DebugOptionsMenu720.swf"
"DebugSetCamera720.swf"
"DebugUIConsoleComponent720.swf"
"DebugUIMarketingGuide720.swf"
)
set(ASSETS_480P
"AnvilMenu480.swf"
"BeaconMenu480.swf"
"BrewingStandMenu480.swf"
"ChestLargeMenu480.swf"
"ChestMenu480.swf"
"ComponentLogo480.swf"
"Controls480.swf"
"Crafting2x2Menu480.swf"
"Crafting3x3Menu480.swf"
"CreateWorldMenu480.swf"
"CreativeMenu480.swf"
"Credits480.swf"
"DLCMainMenu480.swf"
"DLCOffersMenu480.swf"
"DeathMenu480.swf"
"DispenserMenu480.swf"
"EULA480.swf"
"EnchantingMenu480.swf"
"EndPoem480.swf"
"FireworksMenu480.swf"
"FullscreenProgress480.swf"
"FurnaceMenu480.swf"
"HUD480.swf"
"HelpAndOptionsMenu480.swf"
"HopperMenu480.swf"
"HorseInventoryMenu480.swf"
"HowToPlay480.swf"
"HowToPlayMenu480.swf"
"InGameHostOptions480.swf"
"InGameInfoMenu480.swf"
"InGamePlayerOptions480.swf"
"InGameTeleportMenu480.swf"
"Intro480.swf"
"InventoryMenu480.swf"
"JoinMenu480.swf"
"LanguagesMenu480.swf"
"LaunchMoreOptionsMenu480.swf"
"LeaderboardMenu480.swf"
"LoadMenu480.swf"
"LoadOrJoinMenu480.swf"
"MainMenu480.swf"
"MenuBackground480.swf"
"MessageBox480.swf"
"NewUpdateMessage480.swf"
"Panorama480.swf"
"PauseMenu480.swf"
"PressStartToPlay480.swf"
"ReinstallMenu480.swf"
"SaveMessage480.swf"
"SettingsAudioMenu480.swf"
"SettingsControlMenu480.swf"
"SettingsGraphicsMenu480.swf"
"SettingsMenu480.swf"
"SettingsOptionsMenu480.swf"
"SettingsUIMenu480.swf"
"SignEntryMenu480.swf"
"SkinSelectMenu480.swf"
"Timer480.swf"
"ToolTips480.swf"
"TradingMenu480.swf"
"TrialExitUpsell480.swf"
"TutorialPopup480.swf"
)
set(ASSETS_VITA
"AnvilMenuVita.swf"
"BeaconMenuVita.swf"
"BrewingStandMenuVita.swf"
"ChestLargeMenuVita.swf"
"ChestMenuVita.swf"
"ComponentLogoVita.swf"
"ControlsTVVita.swf"
"ControlsVita.swf"
"Crafting2x2MenuVita.swf"
"Crafting3x3MenuVita.swf"
"CreateWorldMenuVita.swf"
"CreativeMenuVita.swf"
"CreditsVita.swf"
"DLCMainMenuVita.swf"
"DLCOffersMenuVita.swf"
"DeathMenuVita.swf"
"DispenserMenuVita.swf"
"EULAVita.swf"
"EnchantingMenuVita.swf"
"EndPoemVita.swf"
"FireworksMenuVita.swf"
"FullscreenProgressVita.swf"
"FurnaceMenuVita.swf"
"HUDVita.swf"
"HelpAndOptionsMenuVita.swf"
"HopperMenuVita.swf"
"HorseInventoryMenuVita.swf"
"HowToPlayMenuVita.swf"
"HowToPlayVita.swf"
"InGameHostOptionsVita.swf"
"InGameInfoMenuVita.swf"
"InGamePlayerOptionsVita.swf"
"InGameTeleportMenuVita.swf"
"IntroVita.swf"
"InventoryMenuVita.swf"
"JoinMenuVita.swf"
"LanguagesMenuVita.swf"
"LaunchMoreOptionsMenuVita.swf"
"LeaderboardMenuVita.swf"
"LoadMenuVita.swf"
"LoadOrJoinMenuVita.swf"
"MainMenuVita.swf"
"MenuBackgroundVita.swf"
"MessageBoxVita.swf"
"NewUpdateMessageVita.swf"
"PanoramaVita.swf"
"PauseMenuVita.swf"
"PressStartToPlayVita.swf"
"ReinstallMenuVita.swf"
"SaveMessageVita.swf"
"SettingsAudioMenuVita.swf"
"SettingsControlMenuVita.swf"
"SettingsGraphicsMenuVita.swf"
"SettingsMenuVita.swf"
"SettingsOptionsMenuVita.swf"
"SettingsUIMenuVita.swf"
"SignEntryMenuVita.swf"
"SkinSelectMenuVita.swf"
"TimerVita.swf"
"ToolTipsVita.swf"
"TradingMenuVita.swf"
"TutorialPopupVita.swf"
)
set(ASSETS_HD
"skinHDGraphicsHud.swf"
"skinHDGraphicsInGame.swf"
"skinHDGraphicsLabels.swf"
"skinHDGraphics.swf"
"skinHDHud.swf"
"skinHDInGame.swf"
"skinHDLabels.swf"
"skinHD.swf"
)
set(ASSETS_SD
"skinGraphicsHud.swf"
"skinGraphicsInGame.swf"
"skinGraphicsLabels.swf"
"skinGraphics.swf"
"skinHud.swf"
"skinInGame.swf"
"skinLabels.swf"
)
set(ASSETS_WINDOWS64
${ASSETS_COMMON}
${ASSETS_SD}
${ASSETS_HD}
${ASSETS_VITA}
${ASSETS_480P}
${ASSETS_720P}
${ASSETS_DEBUG_720P}
${ASSETS_1080P}
${ASSETS_DEBUG_1080P}
"skin.swf"
"skinHDWin.swf"
"skinWin.swf"
)
set(ASSETS_DURANGO
${ASSETS_COMMON}
${ASSETS_HD}
${ASSETS_1080P}
${ASSETS_DEBUG_1080P}
"DefaultSaveThumbnail64x64.png"
"skinHDDurango.swf"
)
set(ASSETS_ORBIS
${ASSETS_COMMON}
${ASSETS_HD}
${ASSETS_1080P}
${ASSETS_DEBUG_1080P}
"DefaultOptionsImage228x128.png"
"DefaultSaveImage228x128.png"
"DefaultSaveThumbnail64x64.png"
"skinHDOrbis.swf"
)
set(ASSETS_PSVITA
${ASSETS_COMMON}
${ASSETS_SD}
${ASSETS_VITA}
${ASSETS_DEBUG_720P}
"DefaultOptionsImage320x176.png"
"DefaultSaveImage320x176.png"
"DefaultSaveThumbnail64x64.png"
"skin.swf"
"skinVita.swf"
)
set(ASSETS_PS3
${ASSETS_COMMON}
${ASSETS_SD}
${ASSETS_480P}
${ASSETS_720P}
${ASSETS_DEBUG_720P}
"DefaultOptionsImage320x176.png"
"DefaultSaveImage320x176.png"
"DefaultSaveThumbnail64x64.png"
"skin.swf"
"skinPS3.swf"
)

88
cmake/CopyAssets.cmake Normal file
View file

@ -0,0 +1,88 @@
include("${CMAKE_CURRENT_SOURCE_DIR}/cmake/AssetSources.cmake")
set(_project_dir "${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Client")
function(copy_tree_if_exists src_rel dst_rel)
set(_src "${_project_dir}/${src_rel}")
set(_dst "${CMAKE_CURRENT_BINARY_DIR}/${dst_rel}")
if(EXISTS "${_src}")
file(MAKE_DIRECTORY "${_dst}")
file(GLOB_RECURSE _files RELATIVE "${_src}" "${_src}/*")
foreach(_file IN LISTS _files) # if not a source file
if(NOT _file MATCHES "\\.(cpp|c|h|hpp|xml|lang)$")
set(_full_src "${_src}/${_file}")
set(_full_dst "${_dst}/${_file}")
if(IS_DIRECTORY "${_full_src}")
file(MAKE_DIRECTORY "${_full_dst}")
else()
get_filename_component(_dst_dir "${_full_dst}" DIRECTORY)
file(MAKE_DIRECTORY "${_dst_dir}")
configure_file(${_full_src} ${_full_dst} COPYONLY)
endif()
endif()
endforeach()
endif()
endfunction()
function(make_media_archive arc_name)
set(_dst "${CMAKE_CURRENT_BINARY_DIR}/Common/Media/${arc_name}")
set(_src_dir "${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Client/Common/Media")
set(_src)
foreach(file IN LISTS ARGN)
list(APPEND _src "${_src_dir}/${file}")
endforeach()
get_filename_component(_dst_dir "${_dst}" DIRECTORY)
file(MAKE_DIRECTORY "${_dst_dir}")
add_custom_command(
OUTPUT "${_dst}.zip"
DEPENDS ${_src}
WORKING_DIRECTORY ${_src_dir}
COMMAND ${CMAKE_COMMAND} -E tar "cf" "${_dst}.zip" --format=zip -- ${ARGN}
COMMENT "Creating archive ${arc_name}.zip"
VERBATIM
)
add_custom_command(
OUTPUT "${_dst}.arc"
DEPENDS "${_dst}.zip"
COMMAND python "${CMAKE_CURRENT_SOURCE_DIR}/arcconv.py" "zip2arc" "${_dst}.zip" "${_dst}.arc"
COMMENT "Creating archive ${arc_name}.arc"
VERBATIM
)
add_custom_target("arc_${arc_name}" DEPENDS "${_dst}.arc")
add_dependencies(MinecraftClient "arc_${arc_name}")
endfunction()
copy_tree_if_exists("Durango/Sound" "Windows64/Sound")
copy_tree_if_exists("music" "music")
copy_tree_if_exists("Windows64/GameHDD" "Windows64/GameHDD")
copy_tree_if_exists("Common/res" "Common/res")
copy_tree_if_exists("Common/Trial" "Common/Trial")
copy_tree_if_exists("Common/Tutorial" "Common/Tutorial")
copy_tree_if_exists("Windows64Media" "Windows64Media")
make_media_archive("MediaWindows64" ${ASSETS_WINDOWS64})
make_media_archive("MediaDurango" ${ASSETS_DURANGO})
make_media_archive("MediaOrbis" ${ASSETS_ORBIS})
make_media_archive("MediaPSVita" ${ASSETS_PSVITA})
make_media_archive("MediaPS3" ${ASSETS_PS3})
# Some runtime code asserts if this directory tree is missing.
file(MAKE_DIRECTORY "Windows64/GameHDD")
# Keep legacy runtime redistributables in a familiar location.
copy_tree_if_exists("Windows64/Miles/lib/redist64" "redist64")
copy_tree_if_exists("Windows64/Iggy/lib/redist64" "redist64")
set(CONFIGURATION $<$<CONFIG:Release>:Release>)
# Runtime DLLs required at launch.
configure_file("Minecraft.Client/Windows64/Iggy/lib/redist64/iggy_w64.dll" "iggy_w64.dll" COPYONLY)
configure_file("Minecraft.Client/Windows64/Miles/lib/redist64/mss64.dll" "mss64.dll" COPYONLY)