Makefile 当它不';你不需要做什么吗?

Makefile 当它不';你不需要做什么吗?,makefile,dependencies,gnu-make,Makefile,Dependencies,Gnu Make,我如何阻止make说make:all'什么都不做。或make:'file'是最新的?我希望我的构建在不做任何事情的时候保持沉默——还有一些地方调用了echo来跟踪构建进度,所以这个消息只是把事情弄得一团糟。我现在是这样沉默的: all: dependency1 dependency2 @: 有些事告诉我一定有更好的办法。有什么想法吗 编辑: 然而,当确实需要构建某些东西时,我想让commandecho继续工作。我希望看到的一个很好的例子是--无打印目录,但我找不到任何其他标志来关闭所选

我如何阻止make说
make:all'什么都不做。
make:'file'是最新的
?我希望我的构建在不做任何事情的时候保持沉默——还有一些地方调用了
echo
来跟踪构建进度,所以这个消息只是把事情弄得一团糟。我现在是这样沉默的:

all: dependency1 dependency2
    @:
有些事告诉我一定有更好的办法。有什么想法吗

编辑:

然而,当确实需要构建某些东西时,我想让commandecho继续工作。我希望看到的一个很好的例子是
--无打印目录
,但我找不到任何其他标志来关闭所选邮件。

您可以尝试

$ make -q || make

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

也许
make-s

引用旧的make(1)手册页的bug部分:有些事情你无法让make闭嘴。同时,-s或--silent选项可能会有所帮助。

make 2>&1 | egrep-v“无事可做|最新”
因此,在网上阅读几天后,似乎没有比我现在做的更好的方法了。一些人推荐了以下几点:

all: dependency1 dependency2 | silent

silent:
    @:

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

您可以通过设置MAKEFLAGS,在makefile本身中设置要生成的
-s
命令行参数。除非明确地打印,否则不会打印任何内容,因此我使用以下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+=-s
PROJECT=progname
CC=g++
SDIR=src
ODIR=obj
BDIR=bin
IDIR=包括
OBJS=$(patsubst$(SDIR)/%.cc,$(ODIR)/%.o,$(通配符$(SDIR)/*.cc))
.虚伪:一切都是清白的
全部:$(巴西存托凭证)/$(项目)
调试:CFLAGS+=-g-Wall-Wextra
调试:全部
$(巴西存托凭证)/$(项目):$(巴西存托凭证)
@mkdir-p$(巴西第纳尔)
@回音链接$<
@$(CC)-o$@$(OBJS)-I$(IDIR)
$(ODIR)/%.o:$(SDIR)/%.cc
@mkdir-p$(ODIR)

@echo“编译$Wow。这很简单;该选项在手册页中没有被描述为这样做,这是肯定的。不幸的是,我将不得不不使用这种方法。在调试构建系统时,关闭标志是一件非常痛苦的事情,但删除一行中的@很容易。历史原因…(阅读:垃圾构建系统)。我认为这将使已经不是很好的系统变得更好;当然,我目前使用的解决方案侵入性更小。空构建当前需要大约90秒,因此加倍这可能不会得到其他开发人员的好评。如果您正在递归调用make来构建子系统,那么这是一个不错的选择。这是如何实现的以一种比我现在做的更好的方式?我想大多数人会认为这更糟糕;因为我不能再将错误转储到日志文件中了。好吧,如果
bash
有办法将
stderr
馈送到另一个进程的
stdin
中,我会建议这样做。但是你要求消除两条消息,并且至少这样做了出于日志目的拆分
stderr
stdout
的成本,这是您没有提到要保留的功能。就我个人而言,当我记录
生成
的输出时,我会先合并
stdout
stderr
,这样我在读取文件时就知道在哪一步发生了哪些错误,所以我不知道不管怎么说,这看起来像是一个真正的损失。如果你想成为完美主义者,你要么必须修补
make
以添加一个标志来删除这两条消息,要么编写一个非平凡的包装程序(用Perl、Python、C等语言)它产生了
make
进程,过滤它的
stderr
,并将
stdout
原封不动地传递出去。我建议的答案似乎是最简单的方法。很抱歉,这对你来说不够好。对于我们的构建系统,我从来没有找到比你使用的更好的方法。@Nathan,事情看起来就是这样的。如果您可以更改makefile的内部,但不能更改调用它的命令行,那么从“target:@$(make)-s realTarget”中再次运行make如何“。我已经测试过了,它可以正常工作。@Beta,这很像系统现在的工作方式。不过,我确实不想使用
-s
,因为它会在需要发生某些事情的地方使构建静音。-s不会使echo命令静音。我使用的是GNUMake 3.81。
@:
本身运行得很好。用于显示示例使用对话框。