2013-08-02 77 views
1

我想在Makefile中获取文件名的基名;但它总是失败:basename命令不起作用。 这里是我的代码:Makefile中的Bash命令

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; 

如果我们可以创建列表中的每个文件的基本名称的值的变量,那将是完美的。 谢谢。

回答

3

$(basename ...)是一个make功能。它不能在shell变量上运行,因为它们比make命令晚。你可以使用shell替换$(...),但你必须加倍美元符号,所以makefile不会将其解释为函数。

+0

感谢您的回答。 请注意,我需要更改基本文件名称。例如, 需要将a.xlib更改为a-un.xlib; 当我看了一下shell替换,它没有这样的功能。我可以问你更多意见吗? – user2646171

+0

您绝对可以在shell中进行这种替换,但除非您需要基于shell结果进行转换决策,否则您应该可以直接在make中完成所有操作,然后在翻译的结果上运行shell命令。充分解释你的投入,产出和目标可能会有所帮助。 –

+0

我修改了上面的代码;那是我需要的。 – user2646171

2

看看下列选项之一,你想要做什么:

make allsh/allmake V=
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; 

运行看命令正在运行。

+0

'@'禁止回显命令。这些命令以任何方式运行。 '@'只是控制你是否看到命令本身(不是它们的输出)。这对大多数人来说可能是明显的。这个评论是其余的(像我一样)。 – jfs

0

如果你想要做的是获得基名,我很惊讶,basename不起作用。 (什么版本制作您使用的是?)请注意,这是一个制作功能,如此这般规则:

list = a.xlib b.lib 
BASES = $(basename $(list)) 

您可以与其他各项职能做(注意冒号):

list := a.xlib b.lib 
list := $(patsubst %.lib,%,$(list)) 
list := $(patsubst %.xlib,%,$(list)) 

如果你真的想要做的是移动的文件,并修改×程序库文件的名称(a-un.xlib =>.../a.xlib),还有一个更简单的方法:

targets := $(addprefix ../../dist/lib/,$(list)) 

all: $(targets) 

../../dist/lib/%.lib: %.lib 
    mv $< [email protected] 

../../dist/lib/%.xlib: %-un.xlib 
    mv $< [email protected]