Make-файл перенаправляет целевое имя в команду запуска docker

#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