为什么在 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 中:
- 这会正确展开所有文件:
$(shell find ./protos -name '*.proto')
- 但是,这不是:
./protos/**/*.proto
我的问题是 为什么通过 ./protos/**/*.proto
扩展文件对 Make 不起作用?
因为 make 调用 /bin/sh
作为它的 shell,而 /bin/sh
是一个 POSIX shell,它不支持 **
作为一个通配操作。
使用 **
表示“搜索所有子目录”是非标准的,一些 shell 的额外功能,如 bash 等
我最近写了一个 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 中:
- 这会正确展开所有文件:
$(shell find ./protos -name '*.proto')
- 但是,这不是:
./protos/**/*.proto
我的问题是 为什么通过 ./protos/**/*.proto
扩展文件对 Make 不起作用?
因为 make 调用 /bin/sh
作为它的 shell,而 /bin/sh
是一个 POSIX shell,它不支持 **
作为一个通配操作。
使用 **
表示“搜索所有子目录”是非标准的,一些 shell 的额外功能,如 bash 等