自动工具之外的Libtool:如何使用DESTDIR?

时间:2018-10-30 21:19:14

标签: makefile libtool

我正在使用libtool(版本2.4.6)创建一个简单的共享库 在GNU / Linux下。

在我的特定情况下,可移植性并不像简单性那么重要:我不 想要使用整个Autotools套件,也不要使用CMake。我只想要一个简单 可以编译共享库并正确安装的Makefile。

我有几个变量定义,它们遵循 conventions of 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.
----------------------------------------------------------------------

我想应该收到此通知,因为我是在 常规库路径。顺便说一句,我会收到相同的消息 基于Autotools的项目,我应该在以下任意路径中设置--prefix吗? ./configure

但是有些奇怪的事情:

  1. 如果我以root用户身份运行make install(当然,在容器内),而没有 定义DESTDIR时,我得到相同的消息。这不觉得 正确:这次我不值得。

  2. 无论是否有DESTDIR,对ldconfig的调用都不会 在这一点上的意义。当我不以超级用户身份运行它时,应该 也无效,但是程序成功了。

在libtool文档中,我发现了一个 reference to the -inst-prefix-dir option, 应该可以让我有一种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

我一定做错了,但我无法发现。有提示吗?

0 个答案:

没有答案