Libtool вне автоинструментов: как мне DESTDIR? - PullRequest
0 голосов
/ 31 октября 2018

Я использую libtool (версия 2.4.6) для создания простой общей библиотеки под GNU / Linux.

В моем конкретном случае портативность не так важна, как простота: я не хочу использовать весь набор Autotools, ни CMake. Я просто хочу простой Makefile, который может скомпилировать разделяемую библиотеку и правильно установить ее.

У меня есть пара определений переменных, которые следуют условные обозначения GNU Make

prefix ?= /usr/local
exec_prefix ?= $(prefix)
libdir ?= $(exec_prefix)/lib

Я хочу поддержать цель install и считаю, что это должно быть примерно как это:

LIBTOOL_LIB := libxyz.la

install: target = $(abspath $(DESTDIR))
install: all
    mkdir -p $(target)/$(libdir)
    libtool --mode=install install $(LIBTOOL_LIB) $(target)/$(libdir)
    libtool --mode=finish $(target)/$(libdir)

Если я запускаю make install DESTDIR=./test, я получаю следующее сообщение:

mkdir -p /yadayada/src/test//usr/local/lib
libtool --mode=install install libtrullallero.la /yadayada/src/test//usr/local/lib
libtool: install: install .libs/libtrullallero.so.0.0.0 /yadayada/src.so.0.0.0
libtool: install: (cd /yadayada/src.so.0; }; })
libtool: install: (cd /yadayada/src.so; }; })
libtool: install: install .libs/libtrullallero.lai /yadayada/src.la
libtool: install: install .libs/libtrullallero.a /yadayada/src.a
libtool: install: chmod 644 /yadayada/src.a
libtool: install: ranlib /yadayada/src.a
libtool: warning: remember to run 'libtool --finish /usr/local/lib'
libtool --mode=finish /yadayada/src/test//usr/local/lib
libtool: finish: PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/sbin" ldconfig -n /yadayada/src/test//usr/local/lib
----------------------------------------------------------------------
Libraries have been installed in:
   /yadayada/src/test//usr/local/lib

If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the '-LLIBDIR'
flag during linking and do at least one of the following:
   - add LIBDIR to the 'LD_LIBRARY_PATH' environment variable
     during execution
   - add LIBDIR to the 'LD_RUN_PATH' environment variable
     during linking
   - use the '-Wl,-rpath -Wl,LIBDIR' linker flag
   - have your system administrator add LIBDIR to '/etc/ld.so.conf'

See any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.
----------------------------------------------------------------------

Полагаю, я заслуживаю этого уведомления, поскольку я устанавливаю вне обычный путь к библиотеке. Это, кстати, то же самое сообщение, которое я получил бы в Проект на основе автоинструментов, должен ли я установить --prefix по какому-либо произвольному пути в ./configure.

Однако есть некоторые странные вещи:

  1. Если я запускаю make install от имени пользователя root (конечно, внутри контейнера), без определяя DESTDIR, я получаю такое же сообщение. Это не чувствуется правильно: на этот раз я этого не заслужил.

  2. С или без DESTDIR, звонок на ldconfig делает по моему мнению нет смысл в этом пункте. И когда я не запускаю его как root, это должно быть также неэффективно, но программа завершается успешно.

Скрываясь в документации по libtool, я нашел ссылка на опцию -inst-prefix-dir , что должно позволить мне иметь DESTDIR -подобное поведение.

Возможно, именно это я и делаю неправильно. Однако ведет себя странно!

Для начала, похоже, что это работает, только если указано в конце --mode=install строка. На самом деле, если я сделаю это:

install: target = $(abspath $(DESTDIR))
install: all
    mkdir -p $(target)/$(libdir)
    libtool --mode=install install -inst-prefix-dir $(target) $(LIBTOOL_LIB) $(target)/$(libdir)
    libtool --mode=finish $(target)/$(libdir)

… Я явно получаю грязную командную строку:

libtool: install: install -inst-prefix-dir /yadayada/libtrullallero/test/usr/local/lib/-inst-prefix-dir
install: invalid option -- 'i'

Если я перейду -inst-prefix-dir в конец строки, я просто получу еще один неправильный вызов install:

mkdir -p /yadayada/src/libtrullallero/test//usr/local/lib
libtool --mode=install install libtrullallero.la /yadayada/src/libtrullallero/test
libtool: install: install .libs/libtrullallero.so.0.0.0 /yadayada/src/libtrullallero/test/libtrullallero.so.0.0.0
libtool: install: (cd /yadayada/src/libtrullallero/test && { ln -s -f libtrullallero.so.0.0.0 libtrullallero.so.0 || { rm -f libtrullallero.so.0 && ln -s libtrullallero.so.0.0.0 libtrullallero.so.0; }; })
libtool: install: (cd /yadayada/src/libtrullallero/test && { ln -s -f libtrullallero.so.0.0.0 libtrullallero.so || { rm -f libtrullallero.so && ln -s libtrullallero.so.0.0.0 libtrullallero.so; }; })
libtool: install: install .libs/libtrullallero.lai /yadayada/src/libtrullallero/test/libtrullallero.la
libtool: install: install /yadayada/src/libtrullallero/test/lib
install: omitting directory '/yadayada/src/libtrullallero/test//usr/local/lib'
Makefile:22: recipe for target 'install' failed
make: *** [install] Error 1

Должно быть, я что-то делаю не так, но не могу этого заметить. Любой намек?

...