forge on linux fix

This commit is contained in:
2026-08-28 00:13:59 +03:00
parent af41017446
commit bbc8633257
5 changed files with 389 additions and 32 deletions
+72 -2
View File
@@ -1,6 +1,7 @@
cmake_minimum_required(VERSION 3.16)
cmake_minimum_required(VERSION 3.20)
project(Minecraft_launcher VERSION 0.1 LANGUAGES CXX)
# C нужен для эталонного zlib: см. блок про установщики Forge ниже.
project(Minecraft_launcher VERSION 0.1 LANGUAGES CXX C)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
@@ -24,6 +25,8 @@ qt_add_qml_module(appMinecraft_launcher
minecraftversion.cpp
javalocator.h
javalocator.cpp
zlibreference.h
zlibreference.cpp
javaruntime.h
javaruntime.cpp
javaruntimeservice.h
@@ -75,6 +78,73 @@ target_link_libraries(appMinecraft_launcher
)
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 и подсовываем его через LD_PRELOAD
# только процессу установщика. Сам лаунчер с ним не линкуется, системный
# zlib-ng остаётся на месте.
if(UNIX AND NOT APPLE)
include(FetchContent)
# SOURCE_SUBDIR указывает на несуществующий каталог: нужны только исходники.
# add_subdirectory от zlib притащил бы свои install-правила и цели example
# и minigzip.
FetchContent_Declare(zlib_reference
GIT_REPOSITORY https://github.com/madler/zlib.git
GIT_TAG v1.3.1
GIT_SHALLOW TRUE
SOURCE_SUBDIR do-not-configure
)
FetchContent_MakeAvailable(zlib_reference)
set(LAUNCHER_ZLIB_DIR "${CMAKE_INSTALL_LIBDIR}/galeonLauncher")
add_library(launcher_zlib_reference SHARED
${zlib_reference_SOURCE_DIR}/adler32.c
${zlib_reference_SOURCE_DIR}/compress.c
${zlib_reference_SOURCE_DIR}/crc32.c
${zlib_reference_SOURCE_DIR}/deflate.c
${zlib_reference_SOURCE_DIR}/gzclose.c
${zlib_reference_SOURCE_DIR}/gzlib.c
${zlib_reference_SOURCE_DIR}/gzread.c
${zlib_reference_SOURCE_DIR}/gzwrite.c
${zlib_reference_SOURCE_DIR}/infback.c
${zlib_reference_SOURCE_DIR}/inffast.c
${zlib_reference_SOURCE_DIR}/inflate.c
${zlib_reference_SOURCE_DIR}/inftrees.c
${zlib_reference_SOURCE_DIR}/trees.c
${zlib_reference_SOURCE_DIR}/uncompr.c
${zlib_reference_SOURCE_DIR}/zutil.c
)
target_include_directories(launcher_zlib_reference PRIVATE ${zlib_reference_SOURCE_DIR})
# То же, что выставляет собственный 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 $<TARGET_FILE_DIR:appMinecraft_launcher>/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}