LINUX.ORG.RU

Криво устанавливаются либы

 ,


1

1

Привет. Нужна подсказка. Решил собрать свежую FLTK с гита, упаковать в пакет (создать PKGBUILD для makepkg) и установить менеджером. PKGBUILD:

pkgname=my_fltk
pkgver=1.4
pkgrel=1
pkgdesc="my build of fltk library from git"
arch=('x86_64' 'i686')
conflicts=(fltk)

build() {
  cd $srcdir
  mkdir -p builddir
  cd builddir
  cmake -DFLTK_OPTION_STD=ON -DFLTK_BACKEND_WAYLAND=OFF -DFLTK_BUILD_EXAMPLES=ON -DFLTK_BUILD_FLUID=OFF -DCMAKE_INSTALL_PREFIX=/usr ..
  make
}

package() {
  cd $srcdir/builddir
  make DESTDIR="$pkgdir" install
}

Дело вот в чем - в builddir после сборки я получаю полноценные либы (с ними собираются тесты и примеры), но в пакет попадают какие-то обрубки (вес многократно ниже, нужных символов внутри нет (искал при помощи nm)), при попытке что-то собрать получаю undefined reference даже на Fl::run(). Я не забыл дать что-то линкеру 100%.

Что происходит с либами при добавлении их в пакет и последующей установке силами makepkg?

Если я захожу в buildir и делаю там make DESTDIR=/tmp/123 install, то в tmp получаю полноценные либы, не обрубки



Последнее исправление: kvpfs_2 (всего исправлений: 1)
Ответ на: комментарий от dataman

Про aur верно, надо с его собрать. Но мне интересно, что makepkg делает с либами при установке? Не вижу каких-то радикальных отличий с aur, которые могут все сломать, запускал make install руками с DESTDIR в tmp, туда копируются нормальные архивы, а не шлак урезанный

kvpfs_2
() автор топика
Последнее исправление: kvpfs_2 (всего исправлений: 1)
Ответ на: комментарий от kvpfs_2

Но мне интересно, что makepkg делает с либами при установке?

То, что написано в массиве OPTIONS=() в /etc/makepkg.conf:

# Makepkg defaults: OPTIONS=(!strip docs libtool staticlibs emptydirs !zipman !purge !debug !lto !autodeps)
#  A negated option will do the opposite of the comments below.
#
#-- strip:      Strip symbols from binaries/libraries
#-- docs:       Save doc directories specified by DOC_DIRS
#-- libtool:    Leave libtool (.la) files in packages
#-- staticlibs: Leave static library (.a) files in packages
#-- emptydirs:  Leave empty directories in packages
#-- zipman:     Compress manual (man and info) pages in MAN_DIRS with gzip
#-- purge:      Remove files specified by PURGE_TARGETS
#-- debug:      Add debugging flags as specified in DEBUG_* variables
#-- lto:        Add compile flags for building with link time optimization
#-- autodeps:   Automatically add depends/provides
#
OPTIONS=(strip docs !libtool !staticlibs emptydirs zipman purge)

В твоём случае (который, судя по уровню вопросов, равен дефолту) это означает, что makepkg удаляет из пакета статические библиотеки (т. к. линковаться статически в арче не принято).

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 1)

Видимо дело вот в чем: makepkg под конец работы пишет:

==> Tidying install...
  -> Removing libtool files...
  -> Purging unwanted files...
  -> Removing static library files...

Похоже кто-то там считает, что статические архивы никомиу не нужны и делает из них кусок дерьма непотребного.

Дефолт задается конфигом /etc/makepkg.conf:

OPTIONS=(... !staticlibs ...)

Надо смотреть как установить локально на данный PKGBUILD ну или глобально.

Блин, какая-то возня ненужная на ровном месте …

kvpfs_2
() автор топика
Ответ на: комментарий от intelfx

Да ну fltk динамическую линковать, она и так крошечная

PS: Хотя, я погорячился, буду с динамической линковать. Исполняемый файл -rdynamic, сохраняет все символы, выходит жирновато.

kvpfs_2
() автор топика
Последнее исправление: kvpfs_2 (всего исправлений: 1)

PS: оказалось, что без установленных статических либ FLTKConfig.cmake падает с ошибкой (когда конфиг используется в find_package()), т.е. для корректной работы они таки нужны даже без желания их использовать.

Выходит, что скрипт из AUR кривой, нельзя будет нормально слинковаться cmake’ом, только через этот странный костыль fltk-config. Итоговый PKGBUILD

pkgname=my_fltk
pkgver=1.4
pkgrel=1
pkgdesc="my build of fltk library from git"
arch=('x86_64' 'i686')
provides=('fltk')
conflicts=('fltk')
OPTIONS=(!strip docs !libtool staticlibs emptydirs zipman purge !debug lto)
#OPTIONS=(staticlibs)

build() {
  cd $srcdir
  mkdir -p builddir
  cd builddir
  cmake -DCMAKE_BUILD_TYPE='Release' -DFLTK_OPTION_STD=ON -DFLTK_BACKEND_WAYLAND=OFF -DFLTK_BUILD_FLUID=OFF -DFLTK_BUILD_SHARED_LIBS=ON -DFLTK_BUILD_TEST=OFF -DCMAKE_INSTALL_PREFIX=/usr ..
  make
}

package() {
  cd $srcdir/builddir
  make DESTDIR="$pkgdir" install
}

Нахожу дефолтные настройки makepkg странными, т.к. когда-то прочел один из основных принципов арч-пакетов - оставь все, как есть, как задумал автор, без всякого там …-dev …-doc. Ладно, в общем мелочь, fltk из репозитория статические архивы в себе содержит, и не в обрубленном состоянии, а полноценные.

kvpfs_2
() автор топика
Ответ на: комментарий от dataman

Это другое, ведь для их компиляции обычно нужно передать доп флаги во время конфигурирования. Впрочем пакет может их включать, это норм. Но вот что точно вызывает вопросы - удалять из пакета то, что идет туда дефолтно, автор так задумал.

kvpfs_2
() автор топика
Ответ на: комментарий от kvpfs_2

Да ну fltk динамическую линковать, она и так крошечная

Угу, вот только когда так начинает думать каждый автор каждого приложения — получается винда, еле влезающая в 50 гигабайт.

intelfx ★★★★★
()
Ответ на: комментарий от kvpfs_2

автор так задумал

Авторы библиотек и приложений, как показывает практика, в большинстве своём тупорылые ламеры ни хрена не понимают в release engineering.

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

intelfx ★★★★★
()
Ответ на: комментарий от intelfx

Ахахах))

https://ibb.co/7vJmZwf

Написал адекватный коммент. Удалил.

Написал адекватный коммент с тупой припиской. Удалил.

Написал коммент, состоящий только из тупизны.

Идеально, я считаю.

wandrien ★★
()
Ответ на: комментарий от intelfx

В целом мысль верная, но 565 Кб на тестовый хеллоу ворлд бинарь со статической fltk? Ну такой себе аргумент. Ну и стат архивы тоже не без плюсов, хотя бы тоже lto.

В моем случае причина другая - бинарь цепляет на себя плагины, даёт для них интерфейс, значит -rdynamic. А раз так, то время его сборке линкер не может выкинуть ненужные символы, они торчат наружу, значит усложняется/замедляется поиск интерфейса плагинами в таблице экспорта. В общем это показалось мне весомым аргументом. А если fltk динамическая, то в link map’e она будет стоять позже и поиск символов в ней происходить вообще не будет, должно работать быстрее.

kvpfs_2
() автор топика