cmake_minimum_required(VERSION 3.20) # C нужен для эталонного zlib: см. блок про установщики Forge ниже. project(Minecraft_launcher VERSION 0.1 LANGUAGES CXX C) set(CMAKE_CXX_STANDARD_REQUIRED ON) # CorePrivate нужен ради QZipReader — им распаковываются нативные библиотеки LWJGL. # Про привязку к версии Qt из-за него предупреждать не нужно: это осознанный выбор. set(QT_NO_PRIVATE_MODULE_WARNING ON) find_package(Qt6 REQUIRED COMPONENTS Quick QuickControls2 Core CorePrivate Gui Network) # ── Qt WebEngine: окно входа в аккаунт Microsoft ──────────────────────────── # # Модуль необязательный, и это принципиально: он ставится отдельной галочкой в # установщике Qt и тянет за собой WebChannel с Positioning, которых в типовой # установке нет. Если сделать его обязательным, у любого, кто их не поставил, # проект перестаёт конфигурироваться целиком — вместе с офлайном и Ely.by. # # Без модуля лаунчер собирается и работает как раньше, только вход через # Microsoft сообщает, что эта сборка его не умеет. find_package(Qt6 QUIET COMPONENTS WebEngineQuick) if(Qt6WebEngineQuick_FOUND) message(STATUS "Qt WebEngine найден: вход через аккаунт Microsoft будет доступен") set(LAUNCHER_MSA_QML_FILES MicrosoftLoginDialog.qml) else() message(WARNING "Qt WebEngine не найден — лаунчер соберётся без входа через аккаунт Microsoft. " "Чтобы его включить, доустановите в MaintenanceTool для своей версии Qt сразу три " "компонента: Qt WebEngine, Qt WebChannel и Qt Positioning.") set(LAUNCHER_MSA_QML_FILES "") endif() qt_standard_project_setup(REQUIRES 6.8) qt_add_executable(appMinecraft_launcher main.cpp ) qt_add_qml_module(appMinecraft_launcher URI Minecraft_launcher SOURCES localization.h localization.cpp launcherbackend.h launcherbackend.cpp launcherpaths.h launcherpaths.cpp minecraftversion.h minecraftversion.cpp javalocator.h javalocator.cpp zlibreference.h zlibreference.cpp javaruntime.h javaruntime.cpp javaruntimeservice.h javaruntimeservice.cpp javainstaller.h javainstaller.cpp authservice.h authservice.cpp msaauthservice.h msaauthservice.cpp gamelauncher.h gamelauncher.cpp versionmanifestservice.h versionmanifestservice.cpp versioninstaller.h versioninstaller.cpp modloader.h modloaderversionservice.h modloaderversionservice.cpp modloaderinstaller.h modloaderinstaller.cpp buildarchiveworker.h buildarchiveworker.cpp buildswitcher.h buildswitcher.cpp seasonalbuildservice.h seasonalbuildservice.cpp seasonalpackdownloader.h seasonalpackdownloader.cpp QML_FILES Main.qml DarkCombo.qml VersionPickerDialog.qml JavaPickerDialog.qml LabelledField.qml BuildsDialog.qml SeasonalBuildsDialog.qml LoaderRow.qml ProgressPanel.qml ${LAUNCHER_MSA_QML_FILES} RESOURCES images/Folder/Folder_Active.svg images/Folder/Folder_Idle.svg images/Folder/Folder_Pressed.svg images/Options/Options_active.svg images/Options/Options_Idle.svg images/Options/Options_Pressed.svg images/Play_Button/Play_Active.svg images/Play_Button/Play_Idle.svg images/Play_Button/Play_pressed.svg images/Profile_Box/Asset_23.jpg images/Profile_Box/Asset_23.svg images/Profile_Box/Asset_24.jpg images/Profile_Box/Asset_24.svg images/Profile_Box/Kishka_Profile_Active.svg images/Profile_Box/Kishka_Profile_Idle.svg images/Profile_Box/Kishka_Profile_open.svg images/Scroll/Scroll_Lever.svg images/Scroll/Scroll_palka.svg images/Version_box/Kishka_Profile_Open.svg images/Version_box/Kishka_Ver_Active.svg images/Version_box/Kishka_Ver_idle.svg images/Trash.svg images/Pencil.svg images/GovuztTW8AAHqBf.jpeg images/photo_2025-12-16_15-04-17.jpg images/photo_2025-12-21_02-30-09.jpg i18n/translations.json ) # Qt for iOS sets MACOSX_BUNDLE_GUI_IDENTIFIER automatically since Qt 6.1. # If you are developing for iOS or macOS you should consider setting an # explicit, fixed bundle identifier manually though. set_target_properties(appMinecraft_launcher PROPERTIES # MACOSX_BUNDLE_GUI_IDENTIFIER com.example.appMinecraft_launcher MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION} MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR} MACOSX_BUNDLE TRUE WIN32_EXECUTABLE TRUE ) target_link_libraries(appMinecraft_launcher PRIVATE Qt6::Quick Qt6::QuickControls2 Qt6::Core Qt6::CorePrivate Qt6::Gui Qt6::Network ) if(Qt6WebEngineQuick_FOUND) target_link_libraries(appMinecraft_launcher PRIVATE Qt6::WebEngineQuick) target_compile_definitions(appMinecraft_launcher PRIVATE LAUNCHER_HAS_WEBENGINE) endif() include(GNUInstallDirs) # ── Эталонный zlib для установщиков Forge и NeoForge ──────────────────────── # # Установщик Forge сверяет sha1 каждого jar, который сам же и собирает, с # эталоном из install_profile.json. Эталон посчитан на обычном zlib, а # дистрибутивы вроде CachyOS и Fedora подставляют вместо него zlib-ng: сжатие # корректное, но побайтово другое, поэтому установка падает на любой версии # игры («Processor failed, invalid outputs»). Сменить Java не выйдет — сборки # OpenJDK под Linux берут libz.so.1 из системы. # # Поэтому собираем обычный zlib из zlib/ — его исходники лежат в репозитории, # чтобы сборка не зависела от сети, а версия была зафиксирована: от неё зависит # побайтовый результат сжатия. Готовую библиотеку подсовываем через LD_PRELOAD # только процессу установщика. Сам лаунчер с ней не линкуется, системный # zlib-ng остаётся на месте. if(UNIX AND NOT APPLE) set(LAUNCHER_ZLIB_DIR "${CMAKE_INSTALL_LIBDIR}/galeonLauncher") set(LAUNCHER_ZLIB_SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/zlib") add_library(launcher_zlib_reference SHARED ${LAUNCHER_ZLIB_SOURCES}/adler32.c ${LAUNCHER_ZLIB_SOURCES}/compress.c ${LAUNCHER_ZLIB_SOURCES}/crc32.c ${LAUNCHER_ZLIB_SOURCES}/deflate.c ${LAUNCHER_ZLIB_SOURCES}/gzclose.c ${LAUNCHER_ZLIB_SOURCES}/gzlib.c ${LAUNCHER_ZLIB_SOURCES}/gzread.c ${LAUNCHER_ZLIB_SOURCES}/gzwrite.c ${LAUNCHER_ZLIB_SOURCES}/infback.c ${LAUNCHER_ZLIB_SOURCES}/inffast.c ${LAUNCHER_ZLIB_SOURCES}/inflate.c ${LAUNCHER_ZLIB_SOURCES}/inftrees.c ${LAUNCHER_ZLIB_SOURCES}/trees.c ${LAUNCHER_ZLIB_SOURCES}/uncompr.c ${LAUNCHER_ZLIB_SOURCES}/zutil.c ) target_include_directories(launcher_zlib_reference PRIVATE ${LAUNCHER_ZLIB_SOURCES}) # То же, что выставляет собственный configure zlib: без этого gz*-часть не # видит unistd.h и не собирается. target_compile_definitions(launcher_zlib_reference PRIVATE HAVE_UNISTD_H=1 HAVE_STDARG_H=1 _LARGEFILE64_SOURCE=1) # SONAME libz.so.1 обязателен: с ним ld.so считает предзагруженный объект # закрывающим зависимость, и системный zlib-ng в процессе java не появится. set_target_properties(launcher_zlib_reference PROPERTIES OUTPUT_NAME z VERSION 1.3.1 SOVERSION 1 C_VISIBILITY_PRESET default LIBRARY_OUTPUT_DIRECTORY $/zlib ) add_dependencies(appMinecraft_launcher launcher_zlib_reference) target_compile_definitions(appMinecraft_launcher PRIVATE LAUNCHER_ZLIB_INSTALL_DIR="${CMAKE_INSTALL_FULL_LIBDIR}/galeonLauncher" ) install(TARGETS launcher_zlib_reference LIBRARY DESTINATION ${LAUNCHER_ZLIB_DIR}) endif() install(TARGETS appMinecraft_launcher BUNDLE DESTINATION . LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} )