【发布时间】:2022-10-05 02:29:02
【问题描述】:
我有一个程序,为实验目的而设置,可以构建不同的变体,由预处理器开关控制。目前,我的 makefile 已设置为生成二进制文件build/[flags],其中flags 是要构建的不同变体的字母编码。
build/[flags]:
linker commands
build/[flags]_objects/[filename].o: [filename].cpp
compiler commands
我使用二次扩展来解决所有这些问题,i.p.,解码标志字符串并将其转换为编译器的命令行开关。这有点难以维护,我想知道是否有更好的替代方法。
编辑。我承认我不是很清楚。这是一个例子。我的程序应该在有和没有-DFLAG 的情况下编译。对于没有标志的版本,我的二进制文件将被称为d(与默认值一样),对于带有标志的版本,我的二进制文件将被称为f。我的makefile大致是这样的:
.SECONDEXPANSION:
# Used for using $% in secondary expansion
PERCENT=%
# Decode the flag in the target name
decode_flag=$(if $(findstring f,$(1)),-DFLAG,)
# Build the executable
build/%.out: $$(patsubst $$(PERCENT).cpp,build/$$*/$$(PERCENT).o,$$(SRC))
$(CXX) $(LDFLAGS) -o $@ $^
# Build the object files; the objects for binary build/x* in build/x/
build/%.o: $$(*F).cpp
@mkdir -p $(@D)
$(CXX) -c $(CXXFLAGS) $(call decode_flag, $(*D)) -o $@ $<
我没有指定CXX、CXXFLAGS、LDFLAGS和SRC;它们具有通常的含义。
我想你会承认所有这些patsubst-stuff 很难阅读。实际上,decode_flag 稍微复杂一些,但原理保持不变。
【问题讨论】:
-
你能提供一个你尝试二次扩展的例子吗?此外,包括您如何阅读/解码标志。
-
@HardcoreHenry 添加
-
类似问题的解决方案stackoverflow.com/a/35893827/412080
标签: makefile