Testing Gnu Makefile,编译应该失败

Testing Gnu Makefile,编译应该失败,testing,shell,makefile,gnu-make,Testing,Shell,Makefile,Gnu Make,我有一组示例,我想确保它们无法编译。使用*GNU Makefile实现这一点的最佳方法是什么 正如你所看到的,我在这里有几个困难: 访问变量cpp:$cpp,\$cpp和$$cpp的shell都不起作用 即使是我的ifmake也会在第一次g++编译失败后停止。但这正是我想要的。我希望g++编译失败被认为是正确的行为 在makefile中使用Shell for循环不是最好的主意。有更好的办法吗?我想不出一个,因为我预计编译会失败,所以我没有一个正确的目标,对吗 高级和可选: 如果我能设法让上

我有一组示例,我想确保它们无法编译。使用*GNU Makefile实现这一点的最佳方法是什么

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

  • 访问变量
    cpp
    $cpp
    \$cpp
    $$cpp
    的shell都不起作用
  • 即使是我的
    if
    make也会在第一次g++编译失败后停止。但这正是我想要的。我希望g++编译失败被认为是正确的行为
  • 在makefile中使用Shell for循环不是最好的主意。有更好的办法吗?我想不出一个,因为我预计编译会失败,所以我没有一个正确的目标,对吗
高级和可选:

  • 如果我能设法让上面的失败检查起作用,我可以尝试第二次编译,这次使用一个额外的
    -DEXCLUDE\u 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)
NOCOMPILE\u CPP:=$(通配符NOCOMPILE/*.CPP)
NOCOMPILE\u XFAILS:=$(addsuffix.xfail,$(basename$(NOCOMPILE\u CPP)))
%.xfail:%.cpp
如果$(CXX)$(CXXFLAGS)-o$@$<;然后退出1;否则回声正常;fi
$(CXX)$(CXXFLAGS)-DEXCLUDE\u故障代码-o$@$<
测试文件:$(非文件文件文件)
这是优雅的吗?然后我只需要找出
-DEXCLUDE\u FAILCODE
如何使失败的测试工作。。。。不平凡,但可行。我认为这可以做到,对吗

  • 对我有用。你在回声中得到了什么
  • 如果then,则需要否定
    中的条件。现在,当文件未编译时,它将退出,并且您需要相反的结果
  • 为什么这不是个好主意?但是您可以编写一个脚本来调用
    $(CXX)
    ,并返回一个正确的错误代码(如果没有编译,则返回0)。然后,您可以使用此脚本设置正常目标。我对GNU制造的细节不是很在行,可能是内置的东西
  • 高级和可选:
    1.让我们先让它工作起来:)

    2.就我个人而言,我不使用python,因此这里没有必要=:P

    Ahhh!是的,我以前纠正错了。当然,这是假设。Prrrrr。。。我想用“高级选项”我可以让目标检查再次工作。。。等等,我会编辑这个问题…@towi:但是对于
    -DEXCLUDE\u FAIL
    这个问题很容易在脚本中完成。首先检查它是否未编译,如果未编译则退出。然后用define检查编译。脚本的返回码应该是这个命令的返回码,这就是您需要的。@towi:为什么不
    $(NOCOMPILE\u CPP:.CPP=.xfail)
    ?你也可以考虑<代码>!(CXX)
    ,它将否定结果,并在需要时自动退出→ 不需要if.1)
    $(:.x=.y)
    也应该可以工作,对吧。2) 我不确定是否
    在Makefiles中的工作方式与在shell中的工作方式相同。我会尝试一下。@towi:因为这些操作是在shell中执行的,所以它们确实是:)
    
     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)