почему находит работу внутри makefile, а не glob **/*.proto для компилятора protoc

Недавно я написал инструкцию Makefile для компиляции файлов .proto и столкнулся со странным поведением.

Эта команда работает при запуске в моей собственной оболочке, но внутри цели 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?


person Joe B    schedule 29.01.2021    source источник


Ответы (1)


Потому что make вызывает /bin/sh в качестве своей оболочки, а /bin/sh — это оболочка POSIX, которая не поддерживает ** в качестве операции подстановки.

Использование ** для поиска во всех подкаталогах нестандартно, это дополнительная функция некоторых оболочек, таких как bash и т. д.

person MadScientist    schedule 29.01.2021