Makefile - 通用目标

3
我想知道是否可以让一个Makefile接受一个未知目标的命令,直接运行它。
例如,我有一个脚本(我无法更改),会像这样向我的应用程序Docker容器发送命令: docker run -it my_app:latest "env FOO=bar bundle exec rails c" 这将被翻译为: make "env FOO=bar bundle exec rails c"
生成:Makefile:7: *** 缺少目标模式。Stop. 这是我首次捕捉未知目标的尝试:
.DEFAULT_GOAL: passthrough

passthrough:
    @echo $(MAKECMDGOALS) # always empty
    @echo ${ARGS} # always empty

能否在docker run命令的参数中捕获整个传递给Makefile的字符串,并直接运行它?


1
那个错误信息并不意味着你给了make一个“未知的目标”。它意味着Makefile文件已经损坏;具体来说,它包含了一个格式不正确的静态模式规则。 - Mike Kinghan
你说得对,我实际上复制了错误的错误消息。除此之外,makefile 运行良好,只是我仍在努力学习如何创建 catch-all。 - doremi
1个回答

3
我知道现在已经晚了一年半,但是既然我有这个问题并且有合理的解决方案——我猜其他人将来也会遇到同样的问题。
通过一个Makefile和像这样的.DEFAULT目标:
docker_cmd = docker run --rm -it bash -c

.DEFAULT:
        @$(docker_cmd) "$@"


您可以使用单个“目标”调用make,该目标将原样传递给$@
$ make 'env FOO=bar /usr/bin/uptime'
 21:06:15 up 24 days,  9:26,  load average: 0.54, 0.46, 0.52

重点在于这里make命令的参数是一个被适当引用的单一参数 - 否则,make会按照其惯例将参数解释为要调用的目标列表,而这将导致完全不同的结果。
$ make env FOO=bar /usr/bin/uptime                                                                                                                  
HOSTNAME=434c34a12b25
PWD=/
_BASH_GPG_KEY=7C0135FB088AAF6C66C650B9BB5869F064EA74AB
HOME=/root
_BASH_VERSION=5.0
_BASH_PATCH_LEVEL=0
_BASH_LATEST_PATCH=0
TERM=xterm
SHLVL=0
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
_=/usr/bin/env
make: '/usr/bin/uptime' is up to date.

$ make badcmd env FOO=bar /usr/bin/uptime                                                                                                          
bash: badcmd: command not found
make: *** [Makefile:90: badcmd] Error 127

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接