【发布时间】:2014-07-16 03:31:07
【问题描述】:
对于我的一个项目,我会自动生成 makefile 并包含它们,如下所示:
all:
@echo 'SUCCESS is $(SUCCESS)'
clean:
rm depend.mk
depend.mk:
@echo 'Creating $@'
@echo 'SUCCESS := 1' > $@
.PHONY: all clean
include depend.mk
这可行,但包含行会生成警告消息:
$ make
Makefile:13: depend.mk: No such file or directory
Creating depend.mk
SUCCESS is 1
我想使第一条警告行静音,说depend.mk 不存在。我知道它不存在,因为我编写了一条规则来生成它,所以警告是不必要的(除非当然没有规则)。我不想让忽略包含文件不存在且没有规则的错误,因此在 include 前加上 - 以忽略错误对我不起作用。我想要类似于 bash 的管道 stderr 到 /dev/null 的约定,比如some_cmd 2>/dev/null,但要包含在 make 中。
上面的示例是这种情况的一个非常简化的示例。在我的实际项目中,包含了很多自动生成的 makefile(通过 clang 的自动依赖生成),这意味着新运行的 make 将在我的屏幕上显示这些警告消息。
这样的事情可能吗,还是我只需要处理烦人的警告消息?
【问题讨论】:
-
clang自动依赖文件有具体的规则吗?它们不是作为编译的副作用生成的吗?
-
@EtanReisner 它们是类似于
$(BUILDROOT)/%.d: $(CURTOP)/%.c的模式规则,其中配方是$(CPP) $(CPPFLAGS) -MM -MG -MT $@ -MT $(basename $@).o -MF $@ $<,因此可以在构建任何东西之前生成它们。 -
你需要在构建任何东西之前生成它们吗?这不是在浪费时间吗?如果需要编译 c 文件,并且 clang 可以同时吐出目标文件和
.d文件,那为什么还要分两遍来做呢? -
@EtanReisner 现在想想,这确实很有意义。我以前认为它们必须事先生成,否则
include会失败,但我想-include没有害处,因此只有在之前构建过它们时才会包含它们。毕竟这些规则仅用于确定是否需要重新构建文件。在这种情况下,我是否应该将规则从%.o: %.c修改为%.o %.d: %.c,因为配方会创建两个文件?或者这会导致在解析 Makefile 时生成所有目标文件(因为include运行配方)? -
阅读this page 了解有关此想法的详细信息(不是我的想法或网站)。特别是“高级自动依赖”部分。