GNU Makefile编译应该失败

3

我有一系列的例子,我希望确保它们无法编译。使用*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 可以做到... 不是很容易,但可行。我认为这样可以实现,对吧?

1个回答

1
  1. 对我来说可以工作。你在echo中得到了什么?
  2. 你需要否定if中的条件。现在它在文件无法编译时退出,而你需要相反的结果。
  3. 为什么这不是一个好主意?但是你可以编写一个脚本来调用$(CXX)并返回适当的错误代码(如果不编译则为0)。然后你可以使用这个脚本来创建正常的目标。我对GNU make的具体细节不是很熟悉,可能可以使用内置的东西实现。

高级和可选:
1. 让事情先工作起来:)
2. 我个人不使用Python,因此在这里看不到需要 =:P


啊!是的,之前我改错了。当然是 if 语句。嗯......我以为用“高级选项”,我可以让 make 的目标检查再次工作...等等,我会编辑这个问题... - towi
@towi:但是关于-DEXCLUDE_FAIL,在脚本中很容易实现。首先检查它是否编译通过,如果没有则退出。然后使用定义检查编译。脚本的返回代码应该是此命令的返回代码,这就是你需要的。 - user332325
1
@towi:为什么不用$(NOCOMPILE_CPP:.cpp=.xfail)?你也可以考虑使用! $(CXX),它会否定结果并在需要时自动退出→无需if。 - user332325
  1. $(:.x=.y) 应该也可以工作,对吧。
  2. 我不确定 ! 在 Makefiles 中是否像在 shell 中一样工作。我会试一下。
- towi
@towi:由于操作是在shell中执行的,当然会执行 :) - user332325

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接