当它不需要做任何事情时如何闭嘴?

时间:2010-02-12 00:07:30

标签: makefile dependencies gnu-make

我如何停止说make: Nothing to be done for 'all'.make: 'file' is up to date?我希望我的构建在没有做任何事情时保持沉默 - 还有其他地方调用echo来跟踪构建进度,所以这条消息只会让事情变得混乱。我目前正在沉默它:

all: dependency1 dependency2
    @:
某事告诉我必须有更好的方法。有什么想法吗?

编辑:

但是,当 需要构建某些内容时,我想保持命令回显工作。我希望的一个很好的例子是--no-print-directory,但我找不到任何其他标志来关闭所选的消息。

6 个答案:

答案 0 :(得分:6)

因此,经过几天的网络阅读后,看起来没有比我正在做的更好的方式了。有些人推荐了以下内容:

all: dependency1 dependency2 | silent

silent:
    @:

也就是说,仅仅取决于silent目标就足以让事情变得安静下来。由于我没有提出任何其他可行的解决方案,我会按照我的方式进行。

答案 1 :(得分:5)

也许make -s

答案 2 :(得分:1)

你可以试试......

$ make -q || make

这样做的好处是,当没有任何事情要做时,什么都不打印,但是当需要继续时,make会产生正常输出......

答案 3 :(得分:1)

从旧的make(1)手册页引用(从内存中),BUGS部分:有些事情是你无法搞定的。同时,-s或--silent选项可能有所帮助。

答案 4 :(得分:0)

您可以通过设置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变量将打印所有被调用的命令。 Makefile编译任何c ++项目,其中源文件(扩展名为.cc)放入src目录,头文件放入include目录。

答案 5 :(得分:-2)

make 2>&1 | egrep -v 'Nothing to be done|up to date'

相关问题