我想知道是否有可能让Makefile
对未知目标发出命令并直接运行它。
例如,我有一个脚本(我无法更改),它向我的应用程序Docker容器发出命令,如下所示:
docker run -it my_app:latest "env FOO=bar bundle exec rails c"
这被翻译成: 制作“env FOO = bar bundle exec rails c”
生成:Makefile:7: *** missing target pattern. Stop.
这是我首次捕捉未知目标的尝试:
.DEFAULT_GOAL: passthrough
passthrough:
@echo $(MAKECMDGOALS) # always empty
@echo ${ARGS} # always empty
是否可以捕获在docker run参数中传递给Makefile的整个字符串并直接运行它?
答案 0 :(得分:0)
我意识到这已经迟了一年半,但是由于我有这个问题并且有合理的理由-我猜想其他人可能会下线。
带有一个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