Makefile 过滤器只是……不起作用?

Makefile filter-out just... isn't working?

好的,我将包含一些关于我正在努力完成的事情的背景故事,请随时跳到最后以获取演示我正在谈论的内容的示例。

目前,我正在尝试围绕我的代码建立一个测试框架,尽可能减少对实际代码库的影响(我现在正在考虑其他几个框架,并希望尽可能轻松地进行切换)。我目前使用的方法是 link 我项目的所有目标文件和我的测试代码,这样我就不必 #include 源文件或使用其他 hack。

由于显而易见的原因,这种方法会导致 main 函数出现问题;我目前的计划是不 link 我的项目中定义 main 的目标文件。这会阻止我对其进行测试,但它真的很简单,任何问题都会非常明显,所以我可以接受。 (我想说这种方法胜过在 main.o 中使用符号 table 的替代方案,这是我目前能想到的唯一替代方案。)

到目前为止的问题是,我似乎无法 make 从我 link 在一起的目标文件列表中实际过滤掉 main.o,请参阅下面。


我所说的承诺演示:

MAIN_PROG_OBJ_DIR ::= build/test/release/main-prog-obj
# In the actual Makefile, this is generated as usual
MAIN_PROG_OBJS ::= build/test/release/main-prog-obj/state.o build/test/release/main-prog-obj/main.o build/test/release/main-prog-obj/util.o build/test/release/main-prog-obj/process_args.o

MAIN_O ::= $(MAIN_PROG_OBJ_DIR)"/main.o"
OBJS_FOR_BUILD ::= $(filter-out $(MAIN_O),$(MAIN_PROG_OBJS))

.PHONY: test
test:
        @echo should be removed [$(MAIN_O)]
        @echo OBJS_FOR_BUILD [$(OBJS_FOR_BUILD)]

在我的系统上,运行 这与 make -f testmk test 产量:

should be removed [build/test/release/main-prog-obj/main.o]
OBJS_FOR_BUILD [build/test/release/main-prog-obj/state.o build/test/release/main-prog-obj/main.o build/test/release/main-prog-obj/util.o build/test/release/main-prog-obj/process_args.o]

显然我误解了 $(filter-out does/what 它的语法,那么我该如何完成我想做的事情呢?

谢谢!

这是一个引用问题,make 按字面解释 "main.o",因此不会从列表中过滤掉 main.o。混淆来自这样一个事实,即当我回显 "main.o" 时,shell 解析了引号并只是将 main.o 传递给内置回显。