简体   繁体   中英

Bash command in Makefile

I am trying to get the basename of filenames in Makefile; but it always fails: basename command does not work. Here is my code:

    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;

If we can create a variable with the value of basename of each file in list, that would be perfect. Thanks.

$(basename ...) is a make function. It cannot operate on shell variables, because they are expanded later than make commands. You can use the shells $(...) substitution, but you have to double the dollar sign, so makefile does not interpret it as a function.

See if one of the following options does what you want:

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;

Run with make allsh/allmake V= to see the commands being run.

If what you want to do is get the basenames, I'm surprised that basename doesn't work. (What version of Make are you using?) Note that it is a Make function, so it goes outside the rules:

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

You can do it with other Make functions (note the colons):

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

If what you really want to do is move the files and modify the names of the xlib files ( a-un.xlib => .../a.xlib ), there's an easier way:

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

all: $(targets)

../../dist/lib/%.lib: %.lib
    mv $< $@

../../dist/lib/%.xlib: %-un.xlib
    mv $< $@

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM