【问题标题】:Makefile for different variants of program用于不同程序变体的 Makefile
【发布时间】: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 $@ $<

我没有指定CXXCXXFLAGSLDFLAGSSRC;它们具有通常的含义。

我想你会承认所有这些patsubst-stuff 很难阅读。实际上,decode_flag 稍微复杂一些,但原理保持不变。

【问题讨论】:

  • 你能提供一个你尝试二次扩展的例子吗?此外,包括您如何阅读/解码标志。
  • @HardcoreHenry 添加
  • 类似问题的解决方案stackoverflow.com/a/35893827/412080

标签: makefile


【解决方案1】:

我不确定你所拥有的一些东西的目的,但听起来你只是想做一个 for/eval 循环。

POSSIBLE_FLAGS := "d f"

CFLAGS_d = ""
CFLAGS_f = "-DFLAG"

SRC := ...

#
# flag_rules:
#   $1 - flag
#
define flag_rules

OBJS_$1 := $$(patsubst %.cpp,build_$1/%.o,$$(SRC))

# Build the executable
build_$1/%.out: $$(OBJS_$1)
    $$(CXX) $$(LDFLAGS) -o $$@ $$^

# Build the object files 
build_$1/%.o: %.cpp
    @mkdir -p $$(@D)
    $$(CXX) -c $$(CXXFLAGS) $$(CFLAGS_$1) -o $$@ $$<

endef

$(foreach flag,$(POSSIBLE_FLAGS), 
   $(eval $(call flag_rules,$(flag))))

(免责声明——我实际上并没有运行它,所以我可能错过了一些东西)

注意不要在$(call ...) 语句内的$(flag) 周围放置空格。我稍微改变了你的约定——一个特定标志的所有输出都出现在一个名为build_$(flag)的目录中。除此之外,名称看起来相同。有了这个,你可以做make build_f/blah

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多