#docker #makefile
#докер #сделать файл
Вопрос:
Я пытаюсь написать простой файл Makefile, который перенаправляет цель, с которой он был вызван, в команду docker run. Существует зависимость, которая создает файл docker, и эта зависимость создает фиктивный файл .docker-сборки, чтобы убедиться, что сборка образа docker выполняется только один раз (не уверен, что я следую норме/преобразованию здесь …)
Проблема в том, что если пользователь вводит make
без какого-либо целевого имени, то $@
оно равно буквальному «Makefile», и я хочу изменить его на «все» при вызове команды запуска docker. Но по какой-то причине это не работает, и код всегда переходит в другой блок.
NAME=program1 .PHONY: all .docker-build: docker build . -t ${NAME} echo "" gt; .docker-build clean: docker stop $(docker ps -aq) docker image rm -f ${NAME} rm -r .docker-build %: .docker-build ifeq ($($@),"Makefile") docker run ${NAME} make all else docker run ${NAME} make $@ endif
Комментарии:
1. Есть ли что-то большее в файле Makefile, чем это? Если это буквально весь файл Makefile, будет ли сценарий оболочки (который
docker run --rm image-name make "${1:-all}"
) лучше соответствовать?
Ответ №1:
Причина в том…
- Существует файл с именем
Makefile
Вы не можете использовать существующее имя файла в качестве целевого. Попробуйте это
touch clean make clean make all
У вас Makefile
есть цель с именем clean
, но она может не сработать. Цель all
определена как .PHONY
цель, так что это работает.
Если вы действительно хотите работать так, как намереваетесь, попробуйте это:
NAME=program1 .PHONY: all Makefile .docker-build: docker build . -t ${NAME} echo "" gt; .docker-build clean: docker stop $(docker ps -aq) docker image rm -f ${NAME} rm -r .docker-build %: .docker-build docker run ${NAME} make $@ Makefile: docker run ${NAME} make all