идиоматический Makefile и командные аргументы - PullRequest
1 голос
/ 20 марта 2019

Контекст

У меня есть Makefile для запуска службы docker

RUN = docker-compose run $(ARGS) --rm serivce

.PHONY: shell
shell:
    ${RUN} /bin/sh

.PHONY: server
server:
    $(eval ARGS=--service-ports) ${RUN}

Проблема

server задаче требуются дополнительные аргументы (--service-ports), установленные для запуска контейнера. Простое кодирование аргументов в RUN не сработает, потому что shell также опубликует порт и завершится ошибкой (при работающем server).

Вопрос

Какой идиоматический способ указать аргументы ARGS в зависимости от контекста?

$(eval ARGS=--service-ports) работает, но есть ли "правильный путь"?

Ответы [ 2 ]

3 голосов
/ 20 марта 2019

eval определенно не прав.Что делать, если кто-то запускает make server shell?Теперь у shell будет установлен этот аргумент, потому что eval сбрасывает его глобально.

Есть ли причина, по которой вы не можете просто написать:

server:
         $(RUN) --service-ports

?В общем, если вам нужна переменная, настроенная для каждой цели, у вас есть два варианта:

Вы можете использовать переменные, ориентированные на цель :

server: ARGS = --service-ports
server:
         $(RUN)

Или выможно использовать рекурсивно раскрытые переменные :

server_ARGS = --service-ports

RUN = docker-compose run $($@_ARGS) --rm service

server:
         $(RUN)
0 голосов
/ 20 марта 2019

Я думаю, вы можете просто разделить ваши переменные на несколько частей:

COMMAND = docker-compose run --rm $(ARGS)
CONTAINER = service

.PHONY: shell
shell:
    ${COMMAND} ${CONTAINER} /bin/sh

.PHONY: server
server:
    ${COMMAND} --service-ports ${CONTAINER}
...