在生成文件中没有先决条件的隐式规则



目录结构:

src
├── Makefile
├── grpc
│   ├── grpc_demo5_client.go
└── └── grpc_demo5_server.go

制作文件:

groc/test: groc/grpc_demo5_client.go
groc/%:
echo $@ " - " $^

输出结果:

echo groc/grpc_demo5_client.go " - " 
groc/grpc_demo5_client.go  - 
echo groc/test " - " groc/grpc_demo5_client.go
groc/test  -  groc/grpc_demo5_client.go

文档

隐式规则可以应用于与其模式匹配的任何目标, 但它仅适用于目标没有另行指定的配方, 并且只有在可以找到先决条件时。

我认为文件groc/grpc_demo5_client.go不是目标.
我的问题是为什么echo groc/grpc_demo5_client.go " - "groc/grpc_demo5_client.go -出现在输出结果中?

更多文档来自与您的文档相同的来源:

When a target is a file, it needs to be recompiled or relinked if any of its
prerequisites change. In addition, any prerequisites that are themselves automatically
generated should be updated first.

由于groc/test依赖于groc/grpc_demo5_client.gogroc/grpc_demo5_client.go成为必须自己生成的目标。如果没有这种递归行为,make就不会那么有用。

在更多的文档中,它说:

If none of the explicit rules for a target has a recipe, then make searches for
an applicable implicit rule to find one 

您的第一条规则没有配方,因此第二条规则中的配方用于groc/grpc_demo5_client.go

但也许你的问题是你的 Makefile 中有错别字,groc应该grpc。尝试:

grpc/test: grpc/grpc_demo5_client.go
grpc/%:
echo $@ " - " $^