我有一组示例,我想确保它们无法编译。使用 *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++-compile 失败被视为正确的行为。 - Makefile 中的 Shell-for-loops 并不是最好的主意。有没有更好的办法?我想不出一个,因为我预计编译会失败,所以我没有正确的目标,对吧?
高级和可选:
- 如果我能设法让上面的失败检查正常工作,我可以尝试第二遍编译,这次使用额外的
-DEXCLUDE_FAIL
,它会取出我的示例中有问题的行,然后代码应该可以编译。有什么想法吗? - 或者应该为此编写一个 Python 脚本...? ;-)
编辑:
我认为我的“高级和可选”现在给了我一个很好的主意。我可以再次使用 makes 依赖项检查。这里只是一个粗略的草图:
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
如何使失败的测试工作......非常重要,但可行。我认为这可以做到,对吗?
最佳答案
- 适合我。你在
echo
中得到了什么? - 您需要否定
if
中的条件。现在,当文件无法编译时它会退出,而 AFAIU 您需要相反的方法。 - 为什么这不是个好主意?但是您可以编写一个脚本来调用
$(CXX)
并返回正确的错误代码(如果未编译则为 0)。然后你可能有这个脚本的正常目标。我不太了解 GNU make 的细节,也许内置的东西是可能的。
高级和可选:
1. 让我们先让它工作:)
2. 我个人不使用 python,因此这里没有必要 =:P
关于testing - Gnu Makefile,编译应该失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5309108/