1

我使用以下 Makefile 部分:

.PHONY: all
all: _MyModule.so

_%.so: %.pb.cc %.pb.h
    python setup.py build

%.pb.cc %.pb.h: %.proto
    protoc --cpp_out=. $^  # Generate these two files together

我希望make创建_MyModule.so文件并删除中间体MyModule.pb.ccMyModule.pb.h. 在实践中发生的情况是只有一个文件被删除(.h.cpp)。我还注意到,这取决于它们在_%.so依赖项列表中出现的顺序。

谁能解释这种行为?

我怎样才能优雅地去除所有的中间体?

4

1 回答 1

2

多么奇特。我会冒昧地说这看起来像 GNUMake 中的一个错误。具有多个目标的模式规则具有特殊行为,并且这种行为似乎与中间文件的处理不正确(并且.INTERMEDIATE没有帮助)。

我不会称这是一个优雅的解决方案,但它确实有效:

%.pb.cc: %.pb.h
    @:

%.pb.h: %.proto
    ...

PS原来这是一个已知的错误

于 2012-09-03T15:44:33.560 回答