Я поддерживаю локально скомпилированную версию 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 .
