从使用make变量的shell函数返回



我有以下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,我也愿意。

  1. 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之前将其展开)。

  2. 最好不要使用@沉默您的配方,特别是在调试Makefile时。更喜欢等效的make选项或特殊目标(-s.SILENT使用GNU make)。

  3. 你可能应该引用你的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}"

相关内容

  • 没有找到相关文章

最新更新