0

一些编译器允许您将警告设置为错误,这样您就永远不会留下任何编译器警告,因为如果您这样做,代码将无法构建。这是一件好事。

不幸的是,一些编译器没有警告作为错误的标志。

我需要编写一个提供该功能的 shell 脚本或包装器。

大概它解析编译控制台输出并在有任何编译器警告(或错误)时返回失败,否则返回成功。“失败”也意味着(我认为)不应该产生目标代码。

什么是您可以编写的最短、最简单的 UNIX/Linux shell 脚本,它满足上述显式要求,以及以下隐含要求,否则其行为就像编译器一样: - 接受所有标志、选项、参数 - 支持 stdout 和 stderr 的重定向- 按照指示生成目标代码和链接

关键词:优雅,满足所有要求。

额外的功劳:易于合并到 GNU make 文件中。

谢谢你的帮助。

===线索===这个解决不同问题的方法,使用shell函数(?),将文本附加到 bash 中的stderr重定向,可能会出现。想知道如何邀请litb的朋友“非常了解 bash”来解决我的问题?

===回答状态===

感谢查理马丁的简短回答,但不幸的是,这就是我开始的。不久前,我使用它,将其发布以供办公室使用,并在几个小时内向我指出了它最严重的缺点:它将通过编译而没有警告,但只有错误。这真的很糟糕,因为那时我们正在交付编译器肯定不会工作的目标代码。简单的解决方案也不满足列出的其他要求。

感谢Adam Rosenfield的速记,以及Chris Dodd将 pipefail 引入解决方案。Chris 的回答看起来最接近,因为我认为 pipefail 应该确保如果编译实际上因错误而失败,我们将得到应有的失败。克里斯,管道故障是否适用于所有外壳?对上面列出的其他隐含要求有什么想法吗?

4

5 回答 5

1

用交换 stdout 和 stderr 流的“make”函数替换 make 命令怎么样:

# cf. http://codesnippets.joyent.com/posts/show/8769
unset -f make
function make() { 
   command make "${@}" 3>&2 2>&1 1>&3 3>&- | tee /dev/stderr | \
        grep -E -i --line-buffered 'error|warning' | \
        head -n 1 > stderr_make.log && { echo; return 1; }
   return 0 
}
于 2010-07-29T13:32:16.387 回答
0

这应该可以解决问题:

$ if compile-command |& tee /dev/tty | grep -q 'Warning'; then false; else true; fi

|&构造是简写2>&1 |(即,它同时重定向stdout和重定向stderr到管道中)。放入tee /dev/tty管道可确保您仍能在控制台上看到编译器的输出,如果未发现任何警告,则将其管道grep -q 'Warning'化将使退出状态为 1,如果发现任何警告,则退出状态为 0。最后,将其包装在 an 中会if ...; then false; else true; fi反转退出状态,因此如果未找到警告(成功),则退出状态为 0,如果发现任何警告(失败),则退出状态为 1。

于 2009-04-20T21:51:06.867 回答
0

嗯。

$ (编译命令 2>&1 | grep '警告') && 退出 1

这不是很有帮助,但您指定了“最短”。当然,必须修改“警告”字符串以匹配编译器。

更好的版本是通过 grep 管道输出,查找警告并设置标志,然后如果设置了标志,则打印有关发现警告的消息并退出,返回代码设置为 0 以外的值。

于 2009-04-20T14:58:36.687 回答
0

只要您使用 bash,例如:

set -o pipefail; compile-command 2>&1 | if grep -q -i warning; then exit 1; fi

应该做的伎俩

于 2009-04-20T22:08:19.463 回答
0

这是另一个版本的“make”函数(用于 Bash),它也可以记录标准输出:

# cf. http://wiki.bash-hackers.org/howto/redirection_tutorial
unset -f make
function make() {    # logs stdout & stderr
  { 
     { 
        command make "${@}" 3>&- | 
           tee stdout_make.log 2>&3 3>&- 
     } 2>&1 >&4 4>&- | 
        grep -E -i --line-buffered 'error|warning' 2>&3 3>&- | 
           head -n 1 > stderr_make.log && 
              { echo; cat stderr_make.log; echo; return 1; }
  } 3>&2 4>&1 

  return 0 
}
于 2010-07-30T09:37:56.557 回答