如何检测是否需要共享库符号链接?
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-out
或 subst
从库名中减去版本。另外,可以提取后缀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
感谢大家对 suffix
和 basename
函数的指点。
我在我的库创建规则中添加了以下变体:
ifneq ($(suffix $@),so)
ln -sf $@ $(basename $@)
endif
(这是我真正需要的。因为它没有回答我的 初始 问题,所以我改写了它。)
我有多个项目共享的 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-out
或 subst
从库名中减去版本。另外,可以提取后缀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
感谢大家对 suffix
和 basename
函数的指点。
我在我的库创建规则中添加了以下变体:
ifneq ($(suffix $@),so)
ln -sf $@ $(basename $@)
endif
(这是我真正需要的。因为它没有回答我的 初始 问题,所以我改写了它。)