Я использую 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
.
Однако есть некоторые странные вещи:
Если я запускаю make install
от имени пользователя root (конечно, внутри контейнера), без
определяя DESTDIR
, я получаю такое же сообщение. Это не чувствуется
правильно: на этот раз я этого не заслужил.
С или без 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
Должно быть, я что-то делаю не так, но не могу этого заметить. Любой намек?