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.
find_package(Qt6 REQUIRED COMPONENTS Quick QuickControls2 Core CorePrivate Gui Network)

qt_standard_project_setup(REQUIRES 6.8)

qt_add_executable(appMinecraft_launcher
    main.cpp
)

qt_add_qml_module(appMinecraft_launcher
    URI Minecraft_launcher
    SOURCES
        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
        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
    QML_FILES
        Main.qml
        DarkCombo.qml
        VersionPickerDialog.qml
        JavaPickerDialog.qml
        LabelledField.qml
        BuildsDialog.qml
        LoaderRow.qml
        ProgressPanel.qml
        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
)

# 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
)

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}
    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)
