2013-08-02 109 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]