【问题标题】:How do I shut up make when it doesn't need to do anything?当它不需要做任何事情时,我如何闭嘴?
【发布时间】:2023-03-12 07:47:01
【问题描述】:

我如何停止说make: Nothing to be done for 'all'.make: 'file' is up to date?我希望我的构建在它不做任何事情时保持沉默 - 还有其他地方调用 echo 来跟踪构建进度,所以这条消息只是把事情弄得乱七八糟。我目前正在像这样使其静音:

all: dependency1 dependency2
    @:

有些事情告诉我一定有更好的方法。有什么想法吗?

编辑:

我希望命令 echo 在它确实需要构建某些东西时保持工作。我希望的一个很好的例子是--no-print-directory,但我找不到任何其他标志来关闭选定的消息。

【问题讨论】:

  • 对于我们的构建系统,我从未找到比您使用的更好的方法。
  • @Nathan,事情就是这样发展的。
  • 如果您可以更改 makefile 的内部结构,但不能更改调用它的命令行,那么从内部再次运行 make 怎么样:“target: @$(MAKE) -s realTarget”。我已经对此进行了测试,并且可以正常工作。
  • @Beta,这很像系统现在的工作方式。不过,我确实想远离-s,因为它会使确实需要发生某些事情的构建保持沉默。
  • -s 不会使 echo 命令静音。我正在使用 GNUMake 3.81。

标签: makefile dependencies gnu-make


【解决方案1】:

您可以通过设置 MAKEFLAGS 将 -s 命令行参数设置为 makefile 本身。除非您明确打印,否则不会打印任何内容,因此我使用以下 makefile 来回显调用的命令。

MAKEFLAGS += -s

PROJECT = progname
CC = g++
SDIR = src
ODIR = obj
BDIR = bin
IDIR = include
OBJS = $(patsubst $(SDIR)/%.cc,$(ODIR)/%.o,$(wildcard $(SDIR)/*.cc))

.PHONY: all debug clean

all: $(BDIR)/$(PROJECT)

debug: CFLAGS += -g -Wall -Wextra
debug: all

$(BDIR)/$(PROJECT): $(OBJS)
    @mkdir -p $(BDIR)
    @echo LINKING $<
    @$(CC) -o $@ $(OBJS) -I$(IDIR)

$(ODIR)/%.o: $(SDIR)/%.cc
    @mkdir -p $(ODIR)
    @echo "COMPILING $<"
    @$(CC) -o $@ -c $< $(CFLAGS)

clean:
    @echo "CLEAN"
    @rm -rf $(BDIR) $(ODIR)

删除 MAKEFLAGS 变量将打印所有调用的命令。 Makefile 编译任何源文件(扩展名为 .cc)到 src 目录和头文件到 include 目录的 c++ 项目。

【讨论】:

    【解决方案2】:

    因此,在网上阅读了几天后,似乎没有比我正在做的更好的方法了。有些人推荐了以下内容:

    all: dependency1 dependency2 | silent
    
    silent:
        @:
    

    也就是说,仅仅依赖于silent 目标就足以让事情平静下来。由于我没有提出任何其他可行的解决方案,所以我将使用现有的解决方案。

    【讨论】:

    • @: 本身工作得很好。用它来显示一个示例使用对话框。
    【解决方案3】:

    make 2&gt;&amp;1 | egrep -v 'Nothing to be done|up to date'

    【讨论】:

    • 认真的吗?这怎么比我已经在做的更好?我认为大多数人会认为情况更糟。因为我不能再将错误转储到日志文件了。
    • 好吧,如果bash 有办法将stderr 提供给另一个进程的stdin,我会建议这样做。但是您要求删除两条消息,这样做的代价是为了记录目的而拆分 stderrstdout,这是您没有提到想要保留的功能。就个人而言,当我记录make的输出时,我首先合并stdoutstderr,所以我有一些想法,在读取文件时,哪个错误发生在哪个步骤,所以看起来不像是真正的损失无论如何。
    • 如果你想成为完美主义者,你要么必须修补 make 以添加标志以删除这两条消息,要么编写一个重要的包装程序(在 Perl、Python , C, 不管) 生成make 进程,过滤它的stderr,并通过stdout 不变。我建议的答案似乎是最简单的方法。对不起,这对你来说不够好。
    【解决方案4】:

    你可以试试……

    $ make -q || make
    

    这样做的好处是在无事可做时不打印任何内容,但 make 在确实需要继续时会产生正常输出...

    【讨论】:

    • 我认为这将使已经不是很好的系统变得更好;当然,我目前使用的解决方案侵入性较小。一个空构建目前大约需要 90 秒,因此其他开发人员可能不会接受翻倍的时间。
    • 如果您要递归调用 make 来构建子系统,这是一个不错的选择
    【解决方案5】:

    引用旧的 make(1) 手册页中的错误部分(从记忆中):有些事情你不能让 make 闭嘴。同时,-s 或 --silent 选项可能会有所帮助。

    【讨论】:

      【解决方案6】:

      也许make -s

      【讨论】:

      • 哇。那很简单;该选项在手册页中没有被描述为这样做,这是肯定的。
      • 很遗憾,我不得不不使用这种方法。在调试构建系统时,关闭一个标志是一件很痛苦的事情,但很容易删除一行上的@。历史原因...(阅读:垃圾构建系统)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-10
      • 2019-08-11
      • 1970-01-01
      • 2022-06-16
      • 1970-01-01
      • 2020-05-10
      • 2020-10-14
      相关资源
      最近更新 更多