禁止从尚未构建的包含中发出警告而不抑制错误

时间:2017-05-11 15:55:25

标签: makefile gnu-make

如果我有一个makefile

include foo
foo: Makefile
    @echo 'bar::' > foo
    @echo "\t@echo 'bar'" >> foo
bar::
    @echo 'baz'

然后当我运行make bar时,我得到了

Makefile:1: foo: No such file or directory
bar
baz

我想压制这个警告。如果我有一个makefile

-include foo
foo: Makefile
    @echo 'bar::' > foo
    @echo "\t@echo 'bar'" >> foo
bar::
    @echo 'baz'

然后我按预期得到了

bar
baz

但是,如果我有一个makefile

-include foo
bar::
    @echo 'baz'

我运行make bar,然后我

baz

虽然我想要得到像

这样的东西
Makefile:1: foo: No such file or directory
make: *** No rule to make target 'foo'.  Stop.

或至少

make: *** No rule to make target 'foo'.  Stop.

如何在不抑制错误的情况下抑制警告,以便在无法创建文件/目标不存在但在成功创建时没有喷射时出现故障?

1 个答案:

答案 0 :(得分:1)

我发现了一个非常棘手的解决方案,其中涉及手动发出错误消息:

-include foo

ifeq (,$(filter-out foo,$(MAKECMDGOALS)))
ifeq (,$(wildcard foo))
$(shell $(MAKE) foo)
ifeq (,$(wildcard foo))
$(error No rule to make target 'foo')
endif
endif
endif

foo: Makefile
    @echo 'bar::' > foo
    @echo "\t@echo 'bar'" >> foo

bar::
    @echo 'baz'

也许一个稍微有点hacky的解决方案是:

ifeq (,$(filter-out foo,$(MAKECMDGOALS)))
ifeq (,$(wildcard foo))
$(shell $(MAKE) foo)
endif
include foo
else
-include foo
endif

foo: Makefile
    @echo 'bar::' > foo
    @echo "\t@echo 'bar'" >> foo

bar::
    @echo 'baz'