user2646171
user2646171

Reputation: 31

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.

Upvotes: 1

Views: 4356

Answers (3)

Beta
Beta

Reputation: 99084

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 $< $@

Upvotes: 0

Etan Reisner
Etan Reisner

Reputation: 80921

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.

Upvotes: 2

choroba
choroba

Reputation: 241748

$(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.

Upvotes: 3

Related Questions