1

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;

リスト内の各ファイルのベース名の値で変数を作成できれば、それは完璧です。ありがとう。

4

3 に答える 3

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=て、実行中のコマンドを確認します。

于 2013-08-06T14:47:03.563 に答える
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 $< $@
于 2013-08-06T15:16:48.093 に答える