несколько целевых значений переменных - PullRequest
0 голосов
/ 14 мая 2018

После документа управлять значениями переменных, специфичных для цели

prog : CFLAGS = -g
prog : prog.o foo.o bar.o

Я могу установить переменные, специфичные для цели.

Теперь мой вопрос: какустановить несколько целевых переменных.Нужно ли устанавливать их один за другим?

dev_deploy: env = dev
dev_deploy: image = abc
dev_deploy: tag = 1.0.4-dev
dev_deploy:
      docker run -t --rm -e env=$(env) \
         $(image):$(tag) \
         sh -c "test.sh"


prod_deploy: env = prod
prod_deploy: image = abc
prod_deploy: tag = 1.0.3-prod
prod_deploy:
      docker run -t --rm -e env=$(env) \
         $(image):$(tag) \
         sh -c "test.sh"

Есть ли какие-либо способы, которыми я могу установить локальные среды (целевые переменные) простым способом?

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

Прямой ответ на ваш первый вопрос - да, вы должны использовать отдельную целевую строку для каждой целевой переменной и устанавливать их по одному.

Ответ на ваш второй вопрос - да: один описан uzsolt.Это был бы мой рекомендуемый метод.Одно из различий между решением uzsolt и решением для целевой переменной является то, что переменные для конкретной цели наследуются предварительными условиями .Кажется, вам здесь не нужно такое поведение, но если бы вы это сделали, то это решение не сработало бы для вас.

Если вам нужны переменные, специфичные для цели, или если одна строка на присвоение переменной все еще слишком болезненна (дляНапример, у вас их очень много, и вы действительно хотите иметь по одной строке на группу), могут быть варианты, которые сложнее понять, но которые проще использовать позже.

Например, если вы знаете, что ни одна иззначения вашей переменной будут содержать пробелы, тогда вы можете создать пользовательский макрос, который использует eval для установки переменных, специфичных для цели, например:

assign-vars = $(foreach A,$2,$(eval $1: $A))

$(call assign-vars, dev_deploy,   env=devenv  image=abc  tag=1.0.4-dev)
$(call assign-vars, prod_deploy,  env=prod    image=abc  tag=1.0.3-prod)

Примечание: первый аргумент - цель, каждое назначение должно бытьодно слово (без встроенного пробела) и запятых между присваиваниями нет.

0 голосов
/ 14 мая 2018

Я бы сделал это:

dev_deploy_env= devenv
dev_deploy_image=   abc
dev_deploy_tag= 1.0.4-dev

prod_deploy_env=    prod
prod_deploy_image=  abc
prod_deploy_tag=    1.0.3-prod

dev_deploy prod_deploy:
    @echo docker run -t --rm -e env=${${@}_env} \
      ${${@}_image}:${${@}_tag} \
      sh -c "test.sh"

.PHONY: dev_deploy prod_deploy

См. Команды (я использую FreeBSD и на нем команда GNU make имеет значение gmake):

$  gmake prod_deploy 
docker run -t --rm -e env=prod abc:1.0.3-prod sh -c test.sh
$  gmake dev_deploy       
docker run -t --rm -e env=devenv abc:1.0.4-dev sh -c test.sh

КонечноВы должны удалить @echo для запуска команд.

...