如何使用gnu-make将文件编译到一个目录路径,该目录路径是在获取输入目录并对其应用多个字符串替换后产生的?

时间:2016-03-25 22:54:22

标签: gnu-make

让我们说一些"输入" -directories中有一些源文件,我想编译并放入不同的"输出" -directories。要计算输出目录,您所要做的就是获取输入目录,并将src替换为obj,将x/y/x替换为u/v/w(双字符串替换)。

例如:

g++ -c src/a/x/y/z/b/c/file1.cpp -o obj/a/u/v/w/b/c/file1.o
g++ -c src/a/x/y/z/b/c/file2.cpp -o obj/a/u/v/w/b/c/file2.o
g++ -c src/b/x/y/z/c/d/file3.cpp -o obj/b/u/v/w/c/d/file3.o

现在问我的问题:

我知道你可以使用%来对" stem"进行单个字符串替换。在GNU Make中,但如果你不得不进行多次替换呢?你会怎么做?

可能的GNU Makefile:

found_files := $(shell find src -type f -name '*.cpp')
all: $(found_files)
obj/%/x/y/z/%.o: src/%/u/v/w/%.cpp   <---- GNU Make will not let me use multiple % here
      $(CXX) -c -o $@ $<

1 个答案:

答案 0 :(得分:1)

正如你所说,你得到的每个模式规则都有一个%-wildcard。在你的 因此,没有模式规则可以表示从.cpp到...的映射 你的.o和你必须明确地为每个配置定义编译配方 .cpp - &gt; {{一对。您可以.o生成所有这些食谱 这样:

<强>生成文件

make

如果我设置了场景的“Hello world”示例,则此makefile会给出:

src2obj = $(subst x/y/z,u/v/w,$(patsubst %.cpp,%.o,$(patsubst src/%,obj/%,$(1))))

define compile =
$(call src2obj,$(1)): $(1)
    g++ $(CPPFLAGS) $(CXXFLAGS) -c -o $$@ $$< 
endef

srcs := $(shell find src -type f -name '*.cpp')
objs := $(foreach src,$(srcs),$(call src2obj,$(src)))

.PHONY: all clean

all: prog

prog: $(objs)
    g++ -o $@ $^ $(LDFLAGS) $(LDLIBS) 

$(foreach src,$(srcs),$(eval $(call compile,$(src))))


clean:
    rm -f $(objs) prog

但是,我会认真考虑构建树的任何合理重构 这会让我避免像这样刺痛的代码。