我可以让gnu make向stdout而不是stderr写警告吗?

时间:2017-07-20 17:43:16

标签: tfsbuild gnu-make

我正在从Microsoft Team Foundation Server启动一个版本,如果有任何内容写入stderr,它可以选择使构建失败。 make向stderr写入警告,即使实际上成功,也会使构建失败。

我浏览了make --help的输出,但没有发现任何有效的结果:我是否可以阻止编译器警告被写入stderr,但仍然让make通过编写其他排序来使构建失败对stderr的事情?

2 个答案:

答案 0 :(得分:1)

它不是GNU make的一部分,因为在GNU上,你可以运行make as

make 2>&1

并获得所需的效果:2>&1指令只是将标准错误(2)重定向到标准输出(1)。是否适用于TFS取决于它如何调用GNU make。如果默认shell不支持此类重定向,则可能必须添加bash的显式调用,如下所示:

bash -c "make 2>&1"

答案 1 :(得分:0)

所以你想要捕获 make 的stderr,而不是 make 在配方中运行的任何程序的stderr?

这将在一个体面的gnu环境中工作(例如,cygwin)。

  1. 指定使的描述符3处于其当前的stderr
  2. make 的stderr重定向到其stdout
  3. 将配方使用的shell替换为将配方的stderr重定向到配方描述符3的脚本(即 make 的原始stderr)
  4. 概念证明:

    using System;
    using Android.OS;
    using Android.App;
    using Android.Views;
    using Android.Widget;
    using Android.Net.Wifi;
    using Android.Content;
    using Java.Util;
    using Java.Net;
    
    namespace checks
    {
    [Activity(Label = "checks", MainLauncher = true, Icon = "@drawable/icon")]
    public class MainActivity : Activity
    {
        protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);
            SetContentView (Resource.Layout.Main);
    
            Button dataButton = FindViewById<Button>(Resource.Id.connectionDataButton);
            dataButton.Click += (object sender, EventArgs e) =>
            {            
                WifiManager wifiManager = (WifiManager)GetSystemService(Context.WifiService);
                var d = wifiManager.DhcpInfo;
                Console.WriteLine("My IP IS: {0}",d.IpAddress);
            };
    
        }
    }
    }
    

    替换shell(在文件.PHONY: t t: $(warning We want this to go to make's stdout) echo "We want this to go to make's stderr" >&2 中说):

    SH

    调用:

    #!/bin/bash
    exec 2>&3
    exec bash -"$@"
    

    要查看发生的情况,请在文件中收集fds 1,2和3,然后查看文件。

    $ make SHELL=./SH 3>&2 2>&1
    

    所以,$ (make SHELL=./SH 3>&2 2>&1) 1>1 2>2 3>3 $ head 1 2 3 ==> 1 <== Makefile:3: We want this to go to make's stdout echo "We want this to go to make's stderr" >&2 ==> 2 <== We want this to go to make's stderr ==> 3 <== 去了stdout,任何食谱的stderr仍然去了stderr。啧。