1

Я поддерживаю локально скомпилированную версию gpg. Предполагается, что конечным результатом будет отдельный набор пакетов, находящихся в /opt/local (со стандартным деревом в этом базовом каталоге: usr/bin для двоичных файлов, usr/lib для библиотек и т.д.).

Как часть процесса установки, я

  • настроить, скомпилировать и установить libgpg-error во временную директорию с
LDFLAGS="-L/opt/local/usr/lib" CFLAGS="-I/opt/local/usr/include" ./configure --prefix=/usr

MAKEFLAGS="-j4" DESTDIR=~/Downloads/tmp/libgpg-error make install
  • создать пакет Slackware из этого каталога и установить его в /opt/local , что приведет к вышеупомянутой структуре дерева каталогов с исполняемыми файлами в /opt/local/bin и т. д.

  • сконфигурируйте, скомпилируйте и установите libgcrypt во временный каталог, как и ранее, на этот раз, учитывая, что это зависит от ранее установленной libgpg-error (отсюда и дополнительная опция, переданная в ./configure)

LDFLAGS="-L/opt/local/usr/lib" CFLAGS="-I/opt/local/usr/include" ./configure --prefix=/usr --with-libgpg-error-prefix=/opt/local/usr

MAKEFLAGS="-j4" DESTDIR=~/Downloads/tmp/libgcrypt make install

Поскольку libgcrypt зависит от libgpg-error , при выполнении шага make install для первого из них создается файл .la

~/Downloads/tmp/libgcrypt/usr/lib/libgcrypt.la

содержащий следующую строку зависимости:

# Libraries that this one depends upon.
dependency_libs=' -L/opt/local/usr/lib /usr/lib/libgpg-error.la'

Проблема:

Теперь, когда я компилирую и пытаюсь установить ntbtls , который знает обо всех вышеперечисленных пакетах, он

  • читает /opt/local/usr/lib/libgcrypt.la
  • видит зависимость от /usr/lib/libgpg-error.la , и
  • пытается прочитать этот файл, который не существует, что приводит к ошибке.

Все проходит нормально, если я изменю эту строку dependency_libs на

# Libraries that this one depends upon.
dependency_libs=' -L/opt/local/usr/lib /opt/local/usr/lib/libgpg-error.la'

Я прибег к тому, чтобы делать это вручную (ну, с помощью небольшого скрипта), но должен быть какой-то способ обойти это через опции, которые я могу передать ./configure . Одна из причин, по которой я думаю, это то, что в исходном каталоге libgcrypt после выполнения команды make install меня есть

  • .lai файл (обратите внимание на i , который читает , как указано выше (неправильное зависимость) и транспортируется в результате .la файл в DESTDIR
  • файл .la который имеет именно ту строку dependency_libs я хочу:
diff <source_dir>/src/.libs/libgcrypt.la <source_dir>/src/.libs/libgcrypt.lai

возвращается

20c20
< dependency_libs=' -L/opt/local/usr/lib /opt/local/usr/lib/libgpg-error.la'
---
> dependency_libs=' -L/opt/local/usr/lib /usr/lib/libgpg-error.la'
31c31
< installed=no
---
> installed=yes

Я не знаком с внутренней работой libtool и не знаю, почему /opt/local теряется где-то во время процесса установки, что приводит к этому различию между двумя файлами (.la vs .lai).

Я вообще не нашел много дискуссий о файлах .lai , не говоря уже о более сложных темах о том, как и когда они производятся, но я хотел бы понять этот процесс в надежде каким-то образом взломать его для этой конкретной цели.

Что я пробовал:

Изменение флагов --prefix или --libdir не очень подходит, потому что они приводят к искаженной структуре каталогов для установленных пакетов в /opt/local .

0