【问题标题】:Makefile forward the target name to docker run commandMakefile 将目标名称转发给 docker run 命令
【发布时间】:2021-12-04 08:40:57
【问题描述】:

我正在尝试编写一个简单的 Makefile,它将调用它的目标转发到 docker run 命令。有一个构建 docker 文件的依赖项,并且此依赖项创建一个虚拟 .docker-build 文件以确保 docker 映像的构建只运行一次(不确定我是否在此处遵循规范/转换...)

问题是,如果用户键入 make 而没有任何目标名称,那么 $@ 等于文字“Makefile”,我想在调用 docker run 命令时将其更改为“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 还有比这更多的吗?如果这确实是整个 Makefile,那么 shell 脚本(docker run --rm image-name make "${1:-all}")会更好吗?

标签: docker makefile


【解决方案1】:

原因是……

  • 有一个文件名为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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    • 2021-08-03
    • 1970-01-01
    相关资源
    最近更新 更多