GNU make:使用转换目标生成规则(无eval)

时间:2016-07-20 14:32:00

标签: gnu-make

例如,来自变量:

files = dirx/a.cc diry/b.cc dirz/b.cc

我想有效地制定这些规则:(不依赖于定义/评估)

a_a.o: dirx/a.cc
b_b.o: diry/b.cc
c_c.o: dirz/c.cc

1 个答案:

答案 0 :(得分:0)

问题似乎不太可能,但这个makefile可以满足您的需求:

<强>生成文件

VPATH := dirx:diry:dirz
SRCS := a.cc b.cc c.cc
OBJS := $(foreach src,$(SRCS),$(basename $(src))_$(basename $(src)).o)

.PHONY: all clean

.SECONDEXPANSION:
%.o: $$(basename $$(subst _,.,$$*)).cc
    $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $<

all: $(OBJS)

clean:
    rm -f $(OBJS)

根据您的示例设置目录和文件:

$ ls -R
.:
dirx  diry  dirz  Makefile

./dirx:
a.cc

./diry:
b.cc

./dirz:
c.cc

它的运行方式如下:

$ make
g++   -c -o a_a.o dirx/a.cc
g++   -c -o b_b.o diry/b.cc
g++   -c -o c_c.o dirz/c.cc

婴儿床: -