为什么在 makefile 中找到工作而不是 glob **/*.proto for protoc 编译器

why does find work inside makefile but not glob **/*.proto for protoc compiler

我最近写了一个 Makefile 指令,用于将 .proto 文件和 运行 编译成奇怪的行为。

当 运行 在我自己的 shell 中时,此命令有效,但在 Makefile 目标中时...

    protoc \
        --proto_path ./protos \
        --go_out ./protos/gen \
        --go_opt paths=source_relative \
        --go-grpc_out ./protos/gen \
        --go-grpc_opt paths=source_relative \
        ./protos/**/*.proto

...它失败了:

Could not make proto path relative: ./protos/**/*.proto: No such file or directory

但是,确实在 Makefile 中起作用:

    protoc \
        --proto_path ./protos \
        --go_out ./protos/gen \
        --go_opt paths=source_relative \
        --go-grpc_out ./protos/gen \
        --go-grpc_opt paths=source_relative \
        $(shell find ./protos -name '*.proto')

唯一的区别是最后一个参数。

具体来说,在 Makefile 中:

我的问题是 为什么通过 ./protos/**/*.proto 扩展文件对 Make 不起作用?

因为 make 调用 /bin/sh 作为它的 shell,而 /bin/sh 是一个 POSIX shell,它不支持 ** 作为一个通配操作。

使用 ** 表示“搜索所有子目录”是非标准的,一些 shell 的额外功能,如 bash 等