我有一系列的例子,我希望确保它们无法编译。使用*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
,make在第一个g++编译失败后就停止了。但这正是我想要的。我希望g++编译失败被视为正确的行为。 - 在Makefile中使用shell-for循环不是最好的选择。有更好的方法吗?我想不出来,因为我预计编译会失败,所以没有正确的目标,对吧?
高级和可选:
- 如果我能成功实现上面的失败检查,我可以尝试进行第二次编译,这次使用额外的
-DEXCLUDE_FAIL
,将示例中的有问题行排除掉,然后代码应该可以编译。有什么想法吗? - 还是应该写一个Python脚本...? ;-)
编辑:
我认为我的“高级和可选”给了我一个非常好的想法。我可以再次使用make的依赖检查。以下是一个简略的草图:
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
可以做到... 不是很容易,但可行。我认为这样可以实现,对吧?
-DEXCLUDE_FAIL
,在脚本中很容易实现。首先检查它是否编译通过,如果没有则退出。然后使用定义检查编译。脚本的返回代码应该是此命令的返回代码,这就是你需要的。 - user332325$(NOCOMPILE_CPP:.cpp=.xfail)
?你也可以考虑使用! $(CXX)
,它会否定结果并在需要时自动退出→无需if。 - user332325$(:.x=.y)
应该也可以工作,对吧。!
在 Makefiles 中是否像在 shell 中一样工作。我会试一下。