24 февраля 2026

Перепаковка бинарного пакета SDR++

После экспериментов с Gqrx решил попробовать SDR++. Бинарный пакет который предлагается для Debian 13 зависит от пакетов разработки и на моём ноутбуке конфликтует с Wine. Разбираться что там не так мне не хочется - проще перепаковать бинарный пакет sdrpp чтобы он зависел только от нужных библиотек.

Как найти от каких библиотек он зависит? В Debian есть dh_shlibdeps из debhelper, но он работает с локальными файлами. Т.е. если зависимость ещё не установлена, то dh_shlibdeps не сможет определить её.

Я распаковывал бинарный пакет и прошёлся ldd по всем исполняемым файлам и разделяемым библиотекам. Затем через apt-file нашёл в каких пакетах находятся отсутствующие зависимости и установил их.

$ PKG_FILE=sdrpp_debian_trixie_amd64.deb

$ wget https://github.com/AlexandreRouma/SDRPlusPlus/releases/download/nightly/$PKG_FILE

$ PKG_TMP=$(mktemp -d)
$ PKG_BINARY="$PKG_TMP/binary"
$ PKG_BUILD="$PKG_TMP/build"
$ PKG_NAME=$(dpkg-deb -f $PKG_FILE Package)
$ PKG_VERSION=$(dpkg-deb -f $PKG_FILE Version)
$ mkdir -p $PKG_BINARY $PKG_BUILD

$ dpkg-deb -R $PKG_FILE $PKG_BINARY

$ env LD_LIBRARY_PATH=$PKG_BINARY/usr/lib ldd $PKG_BINARY/usr/bin/sdrpp
	linux-vdso.so.1 (0x00007f8810a5b000)
	libsdrpp_core.so => /tmp/tmp.R2Fe3Rsnwm/binary/usr/lib/libsdrpp_core.so (0x00007f88103ff000)
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f88101e7000)
	libglfw.so.3 => not found
	libGL.so.1 => /lib/x86_64-linux-gnu/libGL.so.1 (0x00007f8810160000)
	libfftw3f.so.3 => /lib/x86_64-linux-gnu/libfftw3f.so.3 (0x00007f880fe00000)
	libvolk.so.3.2 => /lib/x86_64-linux-gnu/libvolk.so.3.2 (0x00007f880fa00000)
	libzstd.so.1 => /lib/x86_64-linux-gnu/libzstd.so.1 (0x00007f8810094000)
	libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f880f600000)
	libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f880f910000)
	libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f8810067000)
	/lib64/ld-linux-x86-64.so.2 (0x00007f8810a5d000)
	libGLdispatch.so.0 => /lib/x86_64-linux-gnu/libGLdispatch.so.0 (0x00007f880fd47000)
	libGLX.so.0 => /lib/x86_64-linux-gnu/libGLX.so.0 (0x00007f880fd13000)
	liborc-0.4.so.0 => /lib/x86_64-linux-gnu/liborc-0.4.so.0 (0x00007f880f549000)
	libX11.so.6 => /lib/x86_64-linux-gnu/libX11.so.6 (0x00007f880f401000)
	libxcb.so.1 => /lib/x86_64-linux-gnu/libxcb.so.1 (0x00007f880f8e5000)
	libXau.so.6 => /lib/x86_64-linux-gnu/libXau.so.6 (0x00007f881005e000)
	libXdmcp.so.6 => /lib/x86_64-linux-gnu/libXdmcp.so.6 (0x00007f8810056000)

$ apt-file search libglfw.so.3
libglfw3: /usr/lib/x86_64-linux-gnu/libglfw.so.3
libglfw3: /usr/lib/x86_64-linux-gnu/libglfw.so.3.4

$ sudo apt-get install libglfw3

Так нужно повторить для каждого "not found" в выводе ldd. Затем можно воспользоваться dh_shlibdeps для создания списка пакетов с этими зависимостями.

$ mkdir -p $PKG_BUILD/debian

$ cat > $PKG_BUILD/debian/control <<_EOF_
Source: ${PKG_NAME}
Section: hamradio
Priority: optional
Maintainer: Ryzerth
Standards-Version: 4.6.0
Build-Depends: debhelper-compat (= 13)

Package: ${PKG_NAME}
Architecture: amd64
Depends: \${shlibs:Depends}, \${misc:Depends}
Description: Bloat-free SDR receiver software
_EOF_

$ dch --create --package ${PKG_NAME} --newversion ${PKG_VERSION} --changelog $PKG_BUILD/debian/changelog Repackage

$ mkdir $PKG_BUILD/debian/$PKG_NAME

$ cp -a $PKG_BINARY/* $PKG_BUILD/debian/$PKG_NAME

$ cd $PKG_BUILD

$ dh_shlibdeps --package=$PKG_NAME
dpkg-shlibdeps: предупреждение: не удалось выделить имя и версию из библиотеки «libsdrpp_core.so»
dpkg-shlibdeps: предупреждение: не удалось выделить имя и версию из библиотеки «libsdrpp_core.so»
dpkg-shlibdeps: ошибка: cannot find library libsdrplay_api.so.3 needed by debian/sdrpp/usr/lib/sdrpp/plugins/sdrplay_source.so (ELF format: 'elf64-x86-64' abi: 'ELF:64:l:amd64:0'; RPATH: '')
dpkg-shlibdeps: предупреждение: задействованы отклонения - результат может быть неправильным
 diversion by libc6 from: /lib64/ld-linux-x86-64.so.2
dpkg-shlibdeps: предупреждение: задействованы отклонения - результат может быть неправильным
 diversion by libc6 to: /lib64/ld-linux-x86-64.so.2.usr-is-merged
dpkg-shlibdeps: предупреждение: cannot find library libfobos.so needed by debian/sdrpp/usr/lib/sdrpp/plugins/fobossdr_source.so (ELF format: 'elf64-x86-64' abi: 'ELF:64:l:amd64:0'; RPATH: '')
dpkg-shlibdeps: ошибка: cannot find library libhydrasdr.so.0 needed by debian/sdrpp/usr/lib/sdrpp/plugins/hydrasdr_source.so (ELF format: 'elf64-x86-64' abi: 'ELF:64:l:amd64:0'; RPATH: '')
dpkg-shlibdeps: предупреждение: cannot find library librfnm.so needed by debian/sdrpp/usr/lib/sdrpp/plugins/rfnm_source.so (ELF format: 'elf64-x86-64' abi: 'ELF:64:l:amd64:0'; RPATH: '')
dpkg-shlibdeps: ошибка: cannot find library libperseus-sdr.so.0 needed by debian/sdrpp/usr/lib/sdrpp/plugins/perseus_source.so (ELF format: 'elf64-x86-64' abi: 'ELF:64:l:amd64:0'; RPATH: '')
dpkg-shlibdeps: ошибка: невозможно продолжать из-за ошибок, указанных выше
Замечание: библиотеки не ищутся в других двоичных пакетах, в которых нет файла shlibs или symbols. Чтобы помочь dpkg-shlibdeps
найти персональные библиотеки, используйте -l.
dh_shlibdeps: error: dpkg-shlibdeps -Tdebian/sdrpp.substvars debian/sdrpp/usr/lib/libsdrpp_core.so debian/sdrpp/usr/lib/sdrpp/plugins/spyserver_source.so debian/sdrpp/usr/lib/sdrpp/plugins/spectran_http_source.so debian/sdrpp/usr/lib/sdrpp/plugins/sdrpp_server_source.so debian/sdrpp/usr/lib/sdrpp/plugins/sdrplay_source.so debian/sdrpp/usr/lib/sdrpp/plugins/scanner.so debian/sdrpp/usr/lib/sdrpp/plugins/rtl_tcp_source.so debian/sdrpp/usr/lib/sdrpp/plugins/rtl_sdr_source.so debian/sdrpp/usr/lib/sdrpp/plugins/rigctl_server.so debian/sdrpp/usr/lib/sdrpp/plugins/rigctl_client.so debian/sdrpp/usr/lib/sdrpp/plugins/rfspace_source.so debian/sdrpp/usr/lib/sdrpp/plugins/rfnm_source.so debian/sdrpp/usr/lib/sdrpp/plugins/recorder.so debian/sdrpp/usr/lib/sdrpp/plugins/radio.so debian/sdrpp/usr/lib/sdrpp/plugins/plutosdr_source.so debian/sdrpp/usr/lib/sdrpp/plugins/perseus_source.so debian/sdrpp/usr/lib/sdrpp/plugins/pager_decoder.so debian/sdrpp/usr/lib/sdrpp/plugins/new_portaudio_sink.so debian/sdrpp/usr/lib/sdrpp/plugins/network_source.so debian/sdrpp/usr/lib/sdrpp/plugins/network_sink.so debian/sdrpp/usr/lib/sdrpp/plugins/meteor_demodulator.so debian/sdrpp/usr/lib/sdrpp/plugins/m17_decoder.so debian/sdrpp/usr/lib/sdrpp/plugins/limesdr_source.so debian/sdrpp/usr/lib/sdrpp/plugins/iq_exporter.so debian/sdrpp/usr/lib/sdrpp/plugins/hydrasdr_source.so debian/sdrpp/usr/lib/sdrpp/plugins/hermes_source.so debian/sdrpp/usr/lib/sdrpp/plugins/hackrf_source.so debian/sdrpp/usr/lib/sdrpp/plugins/frequency_manager.so debian/sdrpp/usr/lib/sdrpp/plugins/fobossdr_source.so debian/sdrpp/usr/lib/sdrpp/plugins/file_source.so debian/sdrpp/usr/lib/sdrpp/plugins/discord_integration.so debian/sdrpp/usr/lib/sdrpp/plugins/bladerf_source.so debian/sdrpp/usr/lib/sdrpp/plugins/audio_source.so debian/sdrpp/usr/lib/sdrpp/plugins/audio_sink.so debian/sdrpp/usr/lib/sdrpp/plugins/atv_decoder.so debian/sdrpp/usr/lib/sdrpp/plugins/airspyhf_source.so debian/sdrpp/usr/lib/sdrpp/plugins/airspy_source.so debian/sdrpp/usr/bin/sdrpp returned exit code 2
dh_shlibdeps: error: Aborting due to earlier error

Итого имеем несколько плагинов у которых отсутствуют необходимые разделяемые библиотеки в бинарном пакете sdrpp и их не найти в архиве Debian (завёл SDRPlusPlus #1733 на это):

  • libsdrplay_api.so.3 (debian/sdrpp/usr/lib/sdrpp/plugins/sdrplay_source.so)
  • libfobos.so (debian/sdrpp/usr/lib/sdrpp/plugins/fobossdr_source.so)
  • libhydrasdr.so.0 (debian/sdrpp/usr/lib/sdrpp/plugins/hydrasdr_source.so)
  • librfnm.so (debian/sdrpp/usr/lib/sdrpp/plugins/rfnm_source.so)
  • libperseus-sdr.so.0 (debian/sdrpp/usr/lib/sdrpp/plugins/perseus_source.so)

У меня нет "железа" для которого нужны эти плагины и собирать недостающие библиотеки нет никакого желания - просто удаляю сломанные плагины.

$ rm $PKG_BUILD/debian/sdrpp/usr/lib/sdrpp/plugins/{sdrplay_source.so,fobossdr_source.so,hydrasdr_source.so,rfnm_source.so,perseus_source.so}

$ dh_shlibdeps --package=$PKG_NAME
dpkg-shlibdeps: предупреждение: не удалось выделить имя и версию из библиотеки «libsdrpp_core.so»
dpkg-shlibdeps: предупреждение: не удалось выделить имя и версию из библиотеки «libsdrpp_core.so»
dpkg-shlibdeps: предупреждение: задействованы отклонения - результат может быть неправильным
 diversion by libc6 from: /lib64/ld-linux-x86-64.so.2
dpkg-shlibdeps: предупреждение: задействованы отклонения - результат может быть неправильным
 diversion by libc6 to: /lib64/ld-linux-x86-64.so.2.usr-is-merged

Повторный запуск dh_shlibdeps завершился без ошибок и можно собирать пакет дальше.

$ fakeroot dh_gencontrol --package=$PKG_NAME

$ fakeroot dpkg-deb -b debian/$PKG_NAME ${PKG_NAME}_${PKG_VERSION}_amd64_fixed.deb

$ dpkg -I ${PKG_NAME}_${PKG_VERSION}_amd64_fixed.deb
 новый пакет Debian, версия 2.0.
 размер 2106380 байт(а): управляющий архив длиной 572 байт(а).
     629 bytes,     9 lines      control
 Package: sdrpp
 Version: 1.2.1-1487
 Architecture: amd64
 Maintainer: Ryzerth
 Installed-Size: 8941
 Depends: libad9361-0 (>= 0.3), libairspy0 (>= 1.0.10), libairspyhf1 (>= 1.6.8), libbladerf2 (>= 0.2024.05), libc6 (>= 2.38), libcodec2-1.2 (>= 1.2.0), libfftw3-single3 (>= 3.3.10), libgcc-s1 (>= 3.4), libgl1, libglfw3 (>= 3.3), libhackrf0 (>= 2024.02.1), libiio0 (>= 0.26), liblimesuite23.11-1 (>= 23.11.0+dfsg), libportaudio2 (>= 19+svn20101113), librtaudio7 (>= 6.0.1~ds), librtlsdr0, libstdc++6 (>= 14), libvolk3.2 (>= 3.2.0), libzstd1 (>= 1.5.5)
 Section: hamradio
 Priority: optional
 Description: Bloat-free SDR receiver software

В результате перепаковки этот пакет будет иметь правильные зависимости и не содержать "сломанные" плагины для которых забыли положить разделяемые библиотеки.


Вы можете следить за обновлениями блога с помощью Atom/RSS и Telegram.

Комментариев нет:

Отправить комментарий