#!/bin/bash
# Patch KOMPAS-3D v25 binaries to work with glibc 2.43 compatibility layer

set -e
set -o pipefail

if [ ! -d /opt/ascon ]; then
	echo "Ошибка: каталог /opt/ascon не найден — КОМПАС-3D v25 не установлен" >&2
	exit 1
fi

echo "Настройка файлов приложения..."
echo ""

# Патчинг ELF-бинарников в /opt/ascon/*v25*. Лаунчеры из /usr/bin — симлинки
# на эти же файлы, поэтому данный проход покрывает и их.
# Абсолютные пути librt/libpthread добавляются всем ELF-файлам, а не только тем,
# у кого есть голая запись: библиотеки LLVM (libc++ и др.) требуют libpthread.so.0
# без своего RUNPATH, и без предзагруженной compat-версии загрузился бы системный
# /lib64/libpthread.so.0, несовместимый со слоем glibc2.43 (GLIBC_PRIVATE).
# Идемпотентно: абсолютный путь добавляется, только если его ещё нет в NEEDED.
find /opt/ascon/*v25* -type f -not -name kactivation | \
while read -r line
do
	# Точная проверка «ELF N-bit», а не подстрока ELF: встречаются файлы
	# с ELF в имени (например, ADD_SELFCOMP_FROM_FILE.png)
	file -b "$line" | grep -q 'ELF [0-9]*-bit' || continue
	if patchelf --print-interpreter "$line" 2>/dev/null | grep -q ld-linux-x86-64.so.2 ; then
		patchelf --set-interpreter /usr/lib64/glibc2.43/ld-linux-glibc2.43-x86-64.so.2 "$line"
	fi
	needed=$(patchelf --print-needed "$line" 2>/dev/null || true)
	if ! echo "$needed" | grep -qxF '/usr/lib64/glibc2.43/librt.so.1' ; then
		patchelf --add-needed /usr/lib64/glibc2.43/librt.so.1 "$line"
	fi
	if ! echo "$needed" | grep -qxF '/usr/lib64/glibc2.43/libpthread.so.0' ; then
		patchelf --add-needed /usr/lib64/glibc2.43/libpthread.so.0 "$line"
	fi
done

# NOTE: vendor rpath ($ORIGIN:$ORIGIN/runtime_dependencies) must NOT be overwritten.
# It works through /usr/bin symlinks: on direct exec ld.so resolves $ORIGIN via
# /proc/self/exe (the real binary path), so libs are found in the real Bin dir.

# Remove GLIBC version requirement from kactivation
if [ -f /opt/ascon/kompas3d-v25/License/kactivation ]; then
	if ! patchelf --remove-needed-version libc.so.6 GLIBC_2.34 /opt/ascon/kompas3d-v25/License/kactivation ; then
		echo "Предупреждение: не удалось снять требование GLIBC_2.34 с kactivation" >&2
	fi
fi

# Create symlinks to glibc2.43 and LLVM18 libraries in Bin directories
# (home/study не имеют своих каталогов — они используют общий kompas3d-v25)
for dir in /opt/ascon/kompas3d-v25 /opt/ascon/kompas3d-viewer-v25
do
	[ -d "$dir" ] || continue
	for i in /usr/lib64/glibc2.43/*.so* /opt/llvm18/lib64/*.so*
	do
		dst="$dir/Bin/$(basename "$i")"
		# Не затирать файлы вендора — добавляем/обновляем только симлинк
		if [ -e "$dst" ] && [ ! -L "$dst" ]; then
			continue
		fi
		ln -sfr "$i" "$dst"
	done
done
echo "Настройка завершена!"
