让我们说一些"输入" -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 $@ $<
答案 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
但是,我会认真考虑构建树的任何合理重构 这会让我避免像这样刺痛的代码。