Name: hiddify Version: 4.1.2dev Release: 1%{?dist} Summary: Hiddify Next Client - Multi-platform auto-proxy client Obsoletes: hiddify < 4.1.2dev Provides: hiddify = %{version}-%{release} License: GPLv3 URL: https://github.com/hiddify/hiddify-app/archive/refs/tags/v4.1.2.tar.gz Source0: hiddify-%{version}.tar.gz ExcludeArch: i386 BuildRequires: patchelf, desktop-file-utils Requires: gtk3, glib2, libblkid, xz-libs, libayatana-appindicator-gtk3, libcurl, fuse # 1. Отключаем генерацию пакетов debuginfo %global debug_package %{nil} # 2. Отключаем проверку RPATH во избежание ложных блокировок в /opt %global __brp_check_rpaths %{nil} # 3. Полностью отключаем автоматический стриппинг (вырезание символов) и сжатие # Этот макрос полностью заменяет стандартный конвейер RPM на "пустышку" %define __os_install_post %{nil} # 4. Явно запрещаем системе искать и очищать debug-символы во Flutter/Go коде %define __strip /bin/true %description A multi-platform proxy client based on Sing-box universal proxy tool-chain. Hiddify offers a wide range of capabilities, like automatic node selection, TUN mode, remote profiles etc. Hiddify is ad-free and open-source. With support for a wide range of protocols, it provides a secure and private way for accessing free internet. %prep %autosetup %install # 1. Очищаем старый образ и создаем чистые папки внутри RPM BUILDROOT rm -rf %{buildroot} mkdir -p %{buildroot}/opt/hiddify/{lib,data} mkdir -p %{buildroot}%{_bindir} mkdir -p %{buildroot}%{_sysconfdir}/ld.so.conf.d # 2. Копируем графическое Flutter-приложение со всеми подпапками (включая lib/) cp -r ./lib/* %{buildroot}/opt/hiddify/lib cp -r ./data/* %{buildroot}/opt/hiddify/data cp HiddifyCli %{buildroot}/opt/hiddify/ cp hiddify %{buildroot}/opt/hiddify/ # 3. Находим и копируем Go-бинарник HiddifyCli (если он собран) find . -name "HiddifyCli" -exec cp {} %{buildroot}/opt/hiddify/ \; # 4. ИСПРАВЛЕНИЕ RPATH/RUNPATH (Двойной знак $ обязателен для RPM спецификаций) # Очищаем пути для главного исполняемого файла, чтобы он искал зависимости в папке lib/ if [ -f %{buildroot}/opt/hiddify/hiddify ]; then patchelf --set-rpath '$ORIGIN/lib' %{buildroot}/opt/hiddify/hiddify fi # Проходимся по абсолютно всем .so библиотекам во всех подпапках и жестко зашиваем им поиск в текущей директории find %{buildroot}/opt/hiddify/ -name "*.so" -exec patchelf --set-rpath '$ORIGIN' {} \; # 5. Корректируем относительные пути библиотек для Go-ядра if [ -f %{buildroot}/opt/hiddify/HiddifyCli ]; then patchelf --set-rpath '$ORIGIN:$ORIGIN/lib' %{buildroot}/opt/hiddify/HiddifyCli patchelf --replace-needed ./lib/libcore.so /opt/hiddify/lib/libcore.so %{buildroot}/opt/hiddify/HiddifyCli || true fi # 6. Создаем системную символическую ссылку ln -s /opt/hiddify/hiddify %{buildroot}%{_bindir}/hiddify # Генерируем конфигурационный файл. # Записываем внутрь путь к нативным .so библиотекам Flutter/Go приложения echo "/opt/hiddify/lib" > %{buildroot}%{_sysconfdir}/ld.so.conf.d/hiddify-x86_64.conf # Создаем необходимые системные директории для ярлыка и иконки mkdir -p %{buildroot}%{_datadir}/applications mkdir -p %{buildroot}%{_datadir}/icons/hicolor/scalable/apps # Генерируем .desktop файл # Exec указывает на глобальную символическую ссылку, которую мы создали в /usr/bin/hiddify cat << 'EOF' > %{buildroot}%{_datadir}/applications/hiddify.desktop [Desktop Entry] Name=Hiddify Comment=Multi-platform auto-proxy client based on Sing-Box Exec=%{_bindir}/hiddify Icon=hiddify Terminal=false Type=Application Categories=Network;X-Proxy;X-VPN; StartupWMClass=hiddify EOF # Валидируем созданный ярлык (сборка упадет, если в синтаксисе выше будет ошибка) desktop-file-validate %{buildroot}%{_datadir}/applications/hiddify.desktop # Копируем векторную иконку приложения # Находим logo.svg в корне или папках assets и копируем под системным именем hiddify.svg if [ -f data/flutter_assets/assets/images/logo.svg ]; then cp data/flutter_assets/assets/images/logo.svg %{buildroot}%{_datadir}/icons/hicolor/scalable/apps/hiddify.svg fi # Подстраховка: если logo.svg не был найден, создаем пустой файл, чтобы rpmbuild не падал if [ ! -f %{buildroot}%{_datadir}/icons/hicolor/scalable/apps/hiddify.svg ]; then touch %{buildroot}%{_datadir}/icons/hicolor/scalable/apps/hiddify.svg fi %files # Указываем RPM, какими файлами владеет этот пакет %{_bindir}/hiddify /opt/hiddify/ %{_sysconfdir}/ld.so.conf.d/hiddify-x86_64.conf %{_datadir}/applications/hiddify.desktop %{_datadir}/icons/hicolor/scalable/apps/hiddify.svg # Исключаем файлы из общей директории, чтобы объявить их отдельно ниже с макросом %caps #%exclude /opt/hiddify/hiddify #%exclude /opt/hiddify/HiddifyCli # Декларативное назначение capabilities для исполняемых файлов %attr(0755,root,root) %caps(cap_net_admin,cap_net_bind_service,cap_net_raw=eip) /opt/hiddify/hiddify %attr(0755,root,root) %caps(cap_net_admin,cap_net_bind_service,cap_net_raw=eip) /opt/hiddify/HiddifyCli %post ldconfig %postun ldconfig %changelog * Sun Jul 19 2026 Ravil Sarvaritdinov - Build for v4.1.2dev tag