Файлы цикла Makefile с шаблоном

В bash я могу сделать это:

for name in sqls/*.{schema,migration}.sql; do
    echo $name; # some operation on the file name
done

Результат будет примерно таким:

sqls/0001.schema.sql
sqls/0002.schema.sql
sqls/0003.migration.sql
sqls/0004.schema.sql
sqls/0006.schema.sql
sqls/0007.schema.sql

Однако, если я помещу тот же цикл в Makefile:

names:
    for name in sqls/*.{schema,migration}.sql; do echo $name; done

Результат будет следующим:

sqls/*.{schema,migration}.sql

Как я могу сделать то же самое в Makefile?

0
19.02.2019, 11:26
2 ответа

Вы должны понимать, что {...} является конструкцией bash, в то время как файлы Makefile обычно запускают sh, который не поддерживает функцию расширения скобок.

Однако еще не все потеряно; если вы используете GNU Make, вы можете указать Make использовать bash, поместив эту маленькую строчку SHELL: = bash в самый верх вашего Makefile.

4
28.01.2020, 02:34

Вам нужно:

names:
    for name in sqls/*.{schema,migration}.sql; do\
        echo $${name};\ # some operation on the file name
    done

Как объясняется в документах , в этом разница между доступом к переменным GNUMake и bash . Вот простой пример использования обоих:

LIST = one two three
all:
        for i in $(LIST); do \
            echo $$i; \
        done

Здесь i— переменная bash, а LIST— переменная GNUMake.

Короче , если вам нужен bash для получения знака доллара $, поместите двойной знак доллара $$в ваш make-файл. (Обратите внимание, что использование {}или ()эквивалентно в make-файлах или bash .)

9
28.01.2020, 02:34

Теги

Похожие вопросы