【发布时间】:2011-03-15 08:24:35
【问题描述】:
我有一组示例,我想确保它们无法编译。使用 *GNU Makefile 的最佳方法是什么?
test_nocompile: $(NOCOMPILE_CPP)
for cpp in $(NOCOMPILE_CPP) ; do \
echo === $$cpp === ; \
if $(CXX) $(CXXFLAGS) -c -o fail.o $$cpp ; then echo ok ; else exit 1; fi ; \
done
如你所见,我在这里有几个困难:
- 访问 shell-for 变量
cpp:$cpp、\$cpp和$$cpp都不起作用。 - 即使使用我的
if,在第一次 g++ 编译失败后 make 也会停止。但这正是我想要的。我希望 g++-compile 失败被认为是正确的行为。 - Makefile 中的 Shell-for-loop 并不是最好的主意。有没有更好的办法?我想不出一个,因为我预计编译会失败,所以我没有正确的目标,对吧?
高级和可选:
- 如果我能设法让上面的 fail-check 工作,我可以尝试第二次编译,这次加上一个额外的
-DEXCLUDE_FAIL,它从我的示例中删除了有问题的行,然后代码应该编译。有什么想法吗? - 或者应该为此编写一个 Python 脚本...? ;-)
编辑:
我认为我的“高级和可选”现在给了我一个非常好的主意。我可以再次使用进行依赖性检查。这里只是一个粗略的草图:
NOCOMPILE_CPP := $(wildcard nocompile/ *.cpp)
NOCOMPILE_XFAILS := $(addsuffix .xfail,$(basename $(NOCOMPILE_CPP)))
%.xfail: %.cpp
if $(CXX) $(CXXFLAGS) -o $@ $< ; then exit 1 ; else echo OK ; fi
$(CXX) $(CXXFLAGS) -DEXCLUDE_FAILCODE -o $@ $<
test_nocompile: $(NOCOMPILE_XFAILS)
这很优雅吗?然后我只需要弄清楚-DEXCLUDE_FAILCODE 是如何使失败的测试工作的……这不是微不足道的,而是可行的。我觉得这样可以吧?
【问题讨论】:
标签: testing shell makefile gnu-make