2011-03-15 27 views
1

我有一个例子集合,我想确保它们编译失败。使用* GNU Makefile的最佳方法是什么?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 

正如你所看到的,我有几个困难,在这里:

  • 访问壳变量cpp$cpp\$cpp$$cpp都不起作用。
  • 即使使用我的if,在第一次g ++编译失败后make也会停止。但那正是我想要的。我不想g ++ - 编译被认为是正确的行为。
  • Makefiles中的Shell for for循环不是最好的主意。有没有更好的办法?我想不出来,因为我预计编译失败,我没有一个正确的目标,对吧?

高级可选:

  • 如果我能管理有故障检查以上的工作,我可以尝试编译第二遍,这一次额外的-DEXCLUDE_FAIL,其取出我的例子中的违规行,然后代码应该编译。任何想法?
  • 或者应该为此写一个Python脚本...? ;-)

编辑:

我想我的“高级可选”给了我一个非常好的主意,现在。我可以再次使用依赖检查。这里只是一个粗略的草图:

NOCOMPILE_CPP := $(wildcard nocompile/ *.cpp) 
NOCOMPILE_XFAILS := $(addsuffix .xfail,$(basename $(NOCOMPILE_CPP))) 

%.xfail: %.cpp 
    if $(CXX) $(CXXFLAGS) -o [email protected] $< ; then exit 1 ; else echo OK ; fi 
    $(CXX) $(CXXFLAGS) -DEXCLUDE_FAILCODE -o [email protected] $< 

test_nocompile: $(NOCOMPILE_XFAILS) 

这是优雅吗?那么我只需要研究-DEXCLUDE_FAILCODE如何使失败的测试工作....非平凡,但可行。我认为这可以做到,对吧?

回答

1
  1. 适合我。你在echo中得到什么?
  2. 然后您需要否定if中的条件。现在,当文件不能编译时它会退出,而AFAIU则需要相反的结果。
  3. 为什么这不是一个好主意?但是你可以编写一个脚本,调用$(CXX)并返回一个合适的错误代码(如果它没有编译,则返回0)。然后你可以用这个脚本有正常的目标。我对GNU make的细节不太了解,可能是内建的东西。

高级&可选:
1.让我们先来使事情工作:)
2.我个人不使用Python,因此不认为有必要在这里=:P

+0

唉唉!是的,我之前纠错过。当然它的if。 Prrrrr ... *我认为用“高级选项”我可以有再次工作的目标检查* ...等等,我将编辑问题... – towi

+0

@towi:但至于'-DEXCLUDE_FAIL '这很容易在剧本中完成。首先检查它是否不编译,如果是的话退出。然后用define检查编译。脚本的返回码应该是这个命令的返回码,这就是你需要的。 – 2011-03-15 08:56:42

+1

@towi:为什么不是'$(NOCOMPILE_CPP:.cpp = .xfail)'?你也可以考虑'! $(CXX)',它将否定结果并在需要时自动退出→不需要if。 – 2011-03-15 09:07:00