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
传递给内置回显。
好的,我将包含一些关于我正在努力完成的事情的背景故事,请随时跳到最后以获取演示我正在谈论的内容的示例。
目前,我正在尝试围绕我的代码建立一个测试框架,尽可能减少对实际代码库的影响(我现在正在考虑其他几个框架,并希望尽可能轻松地进行切换)。我目前使用的方法是 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
传递给内置回显。