我有一个make目标,它首先调用生成报告的CAE工具。完成此操作后,目标调用一个python脚本,该脚本将CAE报告的内容(或者更具体地说,报告的一些grep'ed行)作为参数。
最小的例子是
target1:
date > ./bar.txt
echo $(shell cat ./bar.txt)
问题是,make在调用第一个命令和bar.txt更新之前展开了$(shell cat ./bar.txt)
。因此,对于这个最小的示例,echo在更新之前打印bar.txt的内容(上次目标运行的日期)。
(我知道我可以用另一种方式写这个例子,不需要变量和shell函数调用,这只是为了展示我调用一个工具的问题,这个工具从shell调用中获取参数。所以实际上我想这样做:
target1:
cae_tool_call
report_eval.py -text "$(shell cat $(generated_report) | grep 'foo')"
cae_tool_call生成generated_report。这个text参数;如果不显式调用shell函数,则不会解析参数。)
我已经尝试了实际的shell变量(而不是make变量),双转义,直接vs延迟变量,但还没有工作的解决方案。什么好主意吗?
#######################################
编辑显示一些意外的行为:
我有这个python脚本argument_example。py
import argparse
def main():
parser = argparse.ArgumentParser()
parser.add_argument("-r", "--reporttext", help="text string", required=True)
args=parser.parse_args()
if args.reporttext:
print(args.reporttext)
main()
它只打印参数-r给出的文本。
我有两个make目标:
####################################
#this does not work
REPORTNAME := ./bar.txt
variable_report:
date > $REPORTNAME
python3 ./argument_example.py --reporttext "`(cat $REPORTNAME)`"
####################################
#this works
static_report:
date > ./bar.txt
python3 ./argument_example.py --reporttext "`(cat ./bar.txt)`"
调用variable_report时,python脚本打印过时的bar.txt内容。调用static_report时,python脚本打印更新后的内容。
make recipes已经是shell脚本了。不要在配方中使用shell
make函数。在第一个简单示例中使用:
target1:
date > bar.txt
cat bar.txt
在你的其他例子中使用:
generated_report := name-of-generated-report
target1:
cae_tool_call
report_eval.py -text "`cat $(generated_report) | grep 'foo'`"
或者更好:
generated_report := name-of-generated-report
target1:
cae_tool_call
report_eval.py -text "`grep 'foo' $(generated_report)`"