我有以下makefile
.ONESHELL:
p3:
@VAR1=$(shell cat meow) # first file
@echo "$${VAR1}"
@VAR2=$(shell grep -oP "name:s*K.+" file2)
@echo "$${VAR2}"
# @VAR3=$(shell grep -oP "name:s*K.+" $${VAR1})
# @echo "$${VAR3}"
和
echo -e "file2" > meow
echo -e "name: My_Name" > file2
当我运行make p3
,我看到:
$ make p3
file2
My_Name
这很好。然而,我真正想要的并不是硬编码"file2"。在makefile中,但要从'喵'文件的内容中接收它。
当我取消对$${VAR1}
调用行的注释时,程序将无限期挂起。没有办法转义该变量似乎也工作,$VAR1
,$$VAR1
,$(VAR1)
,$$(VAR1)
,${VAR1}
,$${VAR1}
都失败。
我怎么能得到一个返回值从一个shell函数,使用一个make变量?如果这需要define
,我也愿意。
-
make recipes是shell脚本,在make recipe中使用
shell
函数总是错误的。这种行为是不一样的,因为make在将食谱传递给shell之前展开食谱,而不是在shell执行食谱时展开食谱。不要写:VAR2=$(shell grep -oP "name:s*K.+" file2)
写:
VAR2=`grep -oP "name:s*K.+" file2`
或:
VAR2=$$(grep -oP "name:s*K.+" file2)
(需要双
$$
,以避免在将配方传递给shell之前将其展开)。 -
最好不要使用
@
沉默您的配方,特别是在调试Makefile时。更喜欢等效的make选项或特殊目标(-s
和.SILENT
使用GNU make)。 -
你可能应该引用你的shell扩展名(例如,
grep -oP "name:s*K.+" $$VAR1)
中的$${VAR1}
.
因此,对于您的Makefile,您可以尝试以下操作:
.ONESHELL:
# Uncomment the following line when done
#.SILENT:
p3:
VAR1=`cat meow`
echo "$${VAR1}"
VAR2=`grep -oP "name:s*K.+" file2`
echo "$${VAR2}"
VAR3=`grep -oP "name:s*K.+" "$${VAR1}"`
echo "$${VAR3}"