从Makefile中完整库路径的列表构造LDFLAGS

时间:2019-03-27 18:01:18

标签: makefile

我想从具有完整路径的库列表中构建链接器标记LDFLAGS。这就是为什么我被困住的地方。 (库名称是Linux样式,但是我认为这对于解决这个问题并不重要。)

FULL_LIBS = \
    ./path1/libone.a \
    ../../path2/libtwo.a
# etc.    

LIB_DIRS = $(dir $(FULL_LIBS))
LIB_NAMES = $(basename $(notdir $(FULL_LIBS)))
LIB_NAMES_TRIMMED = # zzz trim leading "lib" somehow??? This is what I don't know how to do, or at least the best way

LDFLAGS += \
    $(addprefix -L, $(LIB_DIRS)) \
    $(addprefix -l, $(LIB_NAMES_TRIMMED))

如果期望的结果不明显,则应类似于

LDFLAGS += -L./path1 -L../../path2 -lone -ltwo

不确定我是否需要正则表达式(或sed / awk / grep),因此我将保留该标签({{3} })。

1 个答案:

答案 0 :(得分:1)

您可以使用make(https://www.gnu.org/software/make/manual/html_node/Text-Functions.html#Text-Functions)的文本处理功能:

LIB_NAMES_TRIMMED = $(subst lib,,$(LIB_NAMES))

尽管如果字符串“ lib”出现在库名称的其他位置,则此操作可能会失败。为避免这种情况,我们可以使用2个步骤:

LIB_NAMES_TRIMMED = $(basename $(notdir $(subst /lib,/,$(FULL_LIBS))))

正如Matt所解释的,使用patsubst甚至更简单:

LIB_NAMES_TRIMMED = $(patsubst lib%,%,$(LIB_NAMES))