我试图在Makefile中获取文件名的基名;但它总是失败:basename命令不起作用。 这是我的代码:
list = a.xlib b.lib
all:
for each_lib in $(notdir $(list)); \
do \
if [[ $$each_lib == *.xlib ]]; then \
*** Here I need to get the basename of $$each_lib to some variable, say base_lib *** \
cp -p $$base_lib-un.xlib ../../dist/lib/$$each_lib \
else \
cp -p $$each_lib ../../dist/lib/$$each_lib \
fi; \
done;
如果我们可以使用列表中每个文件的basename值创建一个变量,那将是完美的。 感谢。
答案 0 :(得分:3)
$(basename ...)
是一个make函数。它不能对shell变量进行操作,因为它们比make命令扩展得晚。您可以使用shell $(...)
替换,但是您必须将美元符号加倍,因此makefile不会将其解释为函数。
答案 1 :(得分:2)
查看以下选项之一是否符合您的要求:
list = a.xlib b.lib
libs = $(filter-out %.xlib,$(list))
xlibs = $(filter %.xlib,$(list))
V ?= @
allsh:
$(V)for each_lib in $(notdir $(libs)); do \
echo cp -p $$each_lib ../../dist/lib/$$each_lib; \
done;
$(V)for each_lib in $(notdir $(xlibs)); do \
base_lib="$$(basename $$each_lib .xlib)"; \
echo cp -p $$base_lib-un.xlib ../../dist/lib/$$each_lib; \
done;
xlibsstripped = $(patsubst %.xlib,%,$(xlibs))
allmake:
$(V)for each_lib in $(notdir $(libs)); do \
echo cp -p $$each_lib ../../dist/lib/$$each_lib; \
done;
$(V)for each_lib in $(notdir $(xlibsstripped)); do \
echo cp -p $$each_lib-un.xlib ../../dist/lib/$$each_lib.xlib; \
done;
使用make allsh/allmake V=
运行以查看正在运行的命令。
答案 2 :(得分:0)
如果您想要做的是获取基本名称,我很惊讶basename
不起作用。 (您使用的是什么版本的Make?)请注意,它是一个Make函数,因此它在之外
list = a.xlib b.lib
BASES = $(basename $(list))
您可以使用其他Make功能(注意冒号):
list := a.xlib b.lib
list := $(patsubst %.lib,%,$(list))
list := $(patsubst %.xlib,%,$(list))
如果你真正想做的是移动文件并修改xlib文件的名称(a-un.xlib
=> .../a.xlib
),那么有一种更简单的方法:
targets := $(addprefix ../../dist/lib/,$(list))
all: $(targets)
../../dist/lib/%.lib: %.lib
mv $< $@
../../dist/lib/%.xlib: %-un.xlib
mv $< $@