如何检测是否需要共享库符号链接?

How to detect, if a shared library symlink is necessary?

我有多个项目共享的 makefile,它链接共享库。来源——和库名称——由每个项目自己设置 GNUmakefile.

当library-name(${SO})包含版本(如libfoo.so.2)时,我需要创建一个符号链接:

 libfoo.so -> libfoo.so.2

在此示例中删除版本号的优雅方法是什么?

SO_LINK=$(???? ${SO})
...
ifneq(${SO_LINK},${SO})
      ln -sf ${SO} ${SO_LINK}
endif

您可以使用 subst 获取版本,然后使用 filter-outsubst 从库名中减去版本。另外,可以提取后缀SUB=$(suffix $(VAR))

VAR = libfoo.so.2
TTT=libfoo.so

TMPVAR := $(VAR)
SUB=$(subst $(TTT),, $(TMPVAR))
VAR = $(filter-out $(SUB) , $(TMPVAR))

all:
    @echo "VAR is: $(VAR)"

我会重新表述问题,而不是检查最后一个后缀是否为数字,而是检查倒数第二个后缀是否为 so。因此我会使用 $(basename) 删除最后一个后缀并更新条件以检查这个新名称是否以 .so 结尾,即:

$ cat Makefile
SO = libfoo.so.2
SO_LINK = $(basename $(SO))

all:
        touch $(SO)
ifneq ($(filter %.so,$(SO_LINK)),)
        ln -sf $(SO) $(SO_LINK)
endif

输出:

$ make
touch libfoo.so.2
ln -sf libfoo.so.2 libfoo.so

它也可以处理没有数字和其他双重扩展名的库(注意没有ln):

$ make SO=foo.tar.gz
touch foo.tar.gz
$ make SO=libbar.so
touch libbar.so

感谢大家对 suffixbasename 函数的指点。

我在我的库创建规则中添加了以下变体:

ifneq ($(suffix $@),so)
    ln -sf $@ $(basename $@)
endif

(这是我真正需要的。因为它没有回答我的 初始 问题,所以我改写了它。)