【问题标题】:Creating symlinks when packaging a Library (Debian)?打包库(Debian)时创建符号链接?
【发布时间】:2012-05-10 12:22:11
【问题描述】:

我第一次尝试为 Debian 打包一个小型库。为此,我使用了官方的 Debian 政策手册,但两天后我遇到了一个无法解决的问题。

这是我的包装方式:

  • 创建压缩包(此处为 libvl_1.0.orig.tar.gz)
  • 使用dh_make生成debian目录下的debian conf文件
  • 正确修改控制文件、变更日志和版权。
  • 使用 dpkg-buildpackage 命令构建包。

到这里,没有问题。但由于它是一个库,我需要在安装它时创建一些符号链接,这与库的 SONAME 相关。这里我的库叫做 libvl。例如,我正在构建一个名为 libvl.so.1.0 的文件,因为它是第一个版本。为了做对,我想我应该创建这样的符号链接:

libvl.so -> libvl.so.1 -> libvl.so.1.0

为此,我尝试在使用 make 运行安装过程时创建这些链接。如果您启动“make install”命令,这将起作用。但是当使用 dpkg 安装时,如果创建了链接,则没有,我不知道为什么。我也尝试使用 postinst 脚本,但没有任何结果。这是我的makefile下面:

DESTDIR =
LIBDIR = usr/lib

LIB = libvl.so
MAJOR = 1
MINOR = 0

CC = gcc
CC_FLAGS = -Wall -ansi -Isrc/
LD_FLAGS =
LN = ln -s

SRC = very_long.c

OBJ = $(SRC:.c=.o)

all: libvl

libvl: $(OBJ)
    $(CC) -fPIC -c $(SRC)
    $(CC) -shared -a -o $(LIBDIR)/$(LIB).$(MAJOR).$(MINOR) $(OBJ)

install:
    install -d -m 0755 -o root -g root $(DESTDIR)/$(LIBDIR)
    install -m 0755 -o root -g root $(LIBDIR)/$(LIB).$(MAJOR).$(MINOR) $(DESTDIR)/$(LIBDIR)

    $(LN) /usr/lib/$(LIB).$(MAJOR).$(MINOR) /usr/lib/$(LIB).1
    $(LN) /usr/lib/$(LIB).$(MAJOR) /usr/lib/$(LIB)

clean:
    rm $(OBJ) $(LIBDIR)/$(LIB).1.0

我想问题就在那里。我将不胜感激对此的任何回答或评论:-)

【问题讨论】:

    标签: package shared-libraries debian symlink


    【解决方案1】:

    man dh_link

    我在 github 上有一个示例 gist,它创建了 /bin/hello,并在 /bin/helloworld 处创建了一个指向它的符号链接

    你可以像这样在你的系统上演示它:

    # Create the deb package
    curl -O https://gist.github.com/RichardBronosky/5358867/raw/deb-packaging-example.sh
    bash deb-packaging-example.sh
    
    # Install the deb package
    dpkg --install hello-world*.deb
    
    # Check the scripts
    ls -la /bin/hello*
    /bin/hello
    /bin/helloworld
    

    秘密是由脚本的line 18 (at the time of this writing) 创建的hello-world-0.1/debian/hello-world.links 文件。看看吧……

    https://gist.github.com/RichardBronosky/5358867

    【讨论】:

    • 我不再从事这个项目,但你是对的。谢谢,总有一天它一定会对我有所帮助。
    【解决方案2】:
    $(LN) /usr/lib/$(LIB).$(MAJOR).$(MINOR) /usr/lib/$(LIB).1
    $(LN) /usr/lib/$(LIB).$(MAJOR) /usr/lib/$(LIB)
    

    在上面的代码中,您直接将目标链接到 /usr/lib(即在构建机器上),但这样它就不会成为包的一部分。 相反,您应该在 DESTDIR 的子目录中进行链接,以便最终将符号链接放入打包的子树中。

    【讨论】:

    • 我对这个答案感到困惑,因为它引用了原始帖子中的 $(LN) 。如stackoverflow.com/users/117471/bruno-bronosky 的答案所示,将符号链接放入包中的正确方法是使用pkg.links 文件,而不是ln
    猜你喜欢
    • 2021-02-04
    • 1970-01-01
    • 2014-08-09
    • 2016-02-12
    • 2017-06-10
    • 1970-01-01
    • 1970-01-01
    • 2011-11-23
    • 2012-11-14
    相关资源
    最近更新 更多