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