Makefile 将目标名称转发给 docker 运行 命令

Makefile forward the target name to docker run command

我正在尝试编写一个简单的 Makefile,将调用它的目标转发给 docker 运行 命令。有一个构建 docker 文件的依赖项,此依赖项创建一个虚拟的 .docker-build 文件以确保 docker 图像的构建仅 运行s 一次(不是确定我是否关注 norm/conversion 此处 ...)

问题是如果用户键入 make 没有任何目标名称,那么 $@ 等于文字“Makefile”,我想在调用 [=20 时将其更改为“all” =] 运行 命令。但由于某种原因它不起作用,代码总是转到 else 块。

NAME=program1
.PHONY: all
.docker-build:
    docker build . -t ${NAME}
    echo "" > .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

原因是...

  • 有一个名为 Makefile
  • 的文件

您不能使用现有文件名作为目标。试试这个

touch clean
make clean
make all

您的 Makefile 有一个名为 clean 的目标,但可能无法正常工作。目标 all 定义为 .PHONY 目标,因此有效。

如果你真的想按照你的意愿工作,试试这个:

NAME=program1
.PHONY: all Makefile
.docker-build:
    docker build . -t ${NAME}
    echo "" > .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