【问题标题】:Gnu Makefile, compile should failGnu Makefile,编译应该失败
【发布时间】:2011-03-15 08:24:35
【问题描述】:

我有一组示例,我想确保它们无法编译。使用 *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++-compile 失败被认为是正确的行为。
  • Makefile 中的 Shell-for-loop 并不是最好的主意。有没有更好的办法?我想不出一个,因为我预计编译会失败,所以我没有正确的目标,对吧?

高级和可选:

  • 如果我能设法让上面的 fail-check 工作,我可以尝试第二次编译,这次加上一个额外的-DEXCLUDE_FAIL,它从我的示例中删除了有问题的行,然后代码应该编译。有什么想法吗?
  • 或者应该为此编写一个 Python 脚本...? ;-)

编辑:

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

 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 是如何使失败的测试工作的……这不是微不足道的,而是可行的。我觉得这样可以吧?

【问题讨论】:

    标签: testing shell makefile gnu-make


    【解决方案1】:
    1. 为我工作。你在echo 中得到了什么?
    2. 然后你需要否定if中的条件。现在它会在文件无法编译时退出,而 AFAIU 您需要相反的情况。
    3. 为什么这不是一个好主意?但是您可以编写一个脚本来调用$(CXX) 并返回一个正确的错误代码(如果它不编译则为0)。然后你可能有这个脚本的正常目标。我对 GNU make 的细节不是很了解,可能使用内置的东西是可能的。

    高级和可选:
    1. 让我们先让这件事发挥作用:)
    2.我个人不使用python,因此在这里看不到需要=:P

    【讨论】:

    • 啊!是的,我之前改错了。当然是如果。 Prrrrr... 我认为使用“高级选项”我可以让 make 的目标检查再次工作...等等,我将编辑问题...
    • @towi:但是对于-DEXCLUDE_FAIL,它很容易在脚本中完成。首先检查它是否无法编译,如果可以则退出。然后用define检查编译。脚本的返回码就是这个命令的返回码,就是你需要的。
    • @towi:为什么不$(NOCOMPILE_CPP:.cpp=.xfail)?你也可以考虑! $(CXX),它会否定结果并在你需要的时候自动退出→不需要if。
    • 1) $(:.x=.y) 也应该可以工作,对吧。 2) 我不确定! 在 Makefiles 中是否像在 shell 中那样工作。我会试试看。
    • @towi:由于动作是在 shell 中执行的,所以肯定会:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-11
    • 2022-12-29
    • 2021-10-07
    相关资源
    最近更新 更多