Gnu Makefile,编译应该失败

时间:2011-03-15 08:24:35

标签: testing shell makefile gnu-make

我有一些示例,我想确保它们无法编译。使用* 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 ++ - 编译被认为是正确的行为。
  • Makefile中的Shell-for-loops不是最好的主意。有没有更好的办法?我想不到一个,因为我认为编译失败了,我没有正确的目标,对吗?

高级和可选:

  • 如果我能设法让上面的失败检查工作,我可以尝试第二次编译,这次是另外一个-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如何使失败的测试工作....非平凡,但可行。我认为可以做到,对吧?

1 个答案:

答案 0 :(得分:1)

  1. 适合我。你在echo得到什么?
  2. 你需要在if中否定条件。现在,当文件无法编译时退出,而AFAIU则需要相反。
  3. 为什么这不是个好主意?但是你可以编写一个脚本来调用$(CXX)并返回一个正确的错误代码(如果它不编译,则返回0)。然后,您可以使用此脚本获得正常目标。我对GNU make的具体细节不是很了解,可能是内置的东西。
  4. 高级&amp;可选:
    让我们先让事情发挥作用:) 2.我个人不使用python,因此在这里看不到需要=:P