Переменная в верхнем регистре в makefile

#bash #makefile

#bash #makefile

Вопрос:

Я использую makefile для развертывания статического содержимого в корзине s3 с помощью командной строки Amazon. Я хочу добавить переменную для выбора целевого назначения, поэтому мне не нужно повторять один и тот же сценарий в разных глаголах make.

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

 S3_NAME_DEV = com-mydomain-application-dev
S3_NAME_LIVE = com-mydomain-application
deploy:
    # e.g. make deploy t=LIVE
    aws s3 sync dist/ s3://$(S3_NAME_${t})
  

Я попытался добавить две каретки (которые поддерживаются в bash 4 и которые я использую) $(S3_NAME_${t^^}) , но не работает:/. Вот результат, когда я это делаю $ make deploy t=live (переменная просто исчезает).

 $ make deploy t=live
# e.g. make deploy t=LIVE
aws s3 sync dist/ s3://
  

Я подумал, что было бы полезно указать, как может выглядеть команда aws (чтобы незнание интерфейса командной строки AWS не сбивало вас с толку).

 aws s3 sync dist/ s3://com-mydomain-application
  

В оболочке, которую я вызываю make , я могу сделать это успешно:

 $ t=live
$ echo ${t^^}
LIVE
  

Любая помощь была бы весьма признательна.

Бонусные баллы: установка значения по умолчанию

Обновить:

Таким образом, make не наследует bash, который выполняет его, как я предполагал. Если я @echo "my version is: $$BASH_VERSION" в файле make, я получаю версию 3.2 (OS X по умолчанию). Довольно хороший шанс, что исправление этого решит проблему.

Комментарии:

1. @Sundeep Извините, что я не включил это; я отредактировал сообщение.

2. без проблем, сработает ли это, если вы дадите все заглавные буквы?

3.@Sundeep как только я включу ^^ is, он выдаст пустое значение либо с t=live помощью or t=LIVE . Если я удалю ^^ $ make deploy t=LIVE , будет работать снова.

4. хорошо, ты можешь попробовать $(S3_NAME_"${t^^}") ?

5. @Sundeep попробовал. К сожалению, тот же результат.

Ответ №1:

Я попытался добавить две каретки (которые поддерживаются в bash 4 и которые я использую) $(S3_NAME_${t^^}) , но не работает.

Это связано с тем, что $(S3_NAME_...) часть расширяется с помощью make, тогда как вы ожидаете ${t^^} , что часть будет расширена bash , но bash не задействована при make расширении переменных.

Преобразуйте t в верхний регистр в начале вашего makefile:

 override t := $(shell X="${t}"; echo $${X^^})
  

Без override этого потребуется новое имя переменной:

 u := $(shell X="${t}"; echo $${X^^})
# use ${u} instead of ${t}
  

Комментарии:

1. Это работает, хотя сценарий make, похоже, не имеет контекста ранее выполненных строк, поэтому я должен делать все это встроенным, т. Е. aws s3 sync dist/ s3://S3_NAME_$(shell X="${t}"; echo $${X^^}) . Я прав, что это так

2. @freebie сценарий make, похоже, не имеет контекста ранее выполненных строк — этого не должно быть. Если вы вызываете другие файлы makefile, убедитесь, что вы export используете переменную, например export u := ... , и используйте ${u} вместо ${t} .

3. Я попытался поместить export перед присваиванием переменной, но, похоже, это не сработало. Извините за мой телефон, поэтому у меня нет ошибки. Этот ответ правильный, хотя и решил мою проблему. Я предполагаю, что область действия переменных make — это другая проблема. Спасибо