我试图创建一个makefile脚本,它使用tcpreplay命令和其他工具提取pcap文件中的数据包数量。然后使用附加的gcc标志将数据包数转发到测试文件。
tcpreplay = "/usr/bin/tcpreplay --topspeed --intf1=lo "${PWD}"/to/file.pcap | sed -n 5p | cut -d' ' -f11"
# get number of packet in PCAP
PKT_NUM = `eval ${tcpreplay}`
TEST_CFLAGS = -DPKT_NUM=$(PKT_NUM)
#print VAR cmd
print-% : ; @echo $* = $($*)
在终端中执行时,即使tcpreplay的内容有效,上面的命令也不起作用。我也发现它导致了这一部分:
"${PWD}"/to/file.pcap
与...交换时:
/absolute/path/to/file.pcap
它按预期工作。
那么如何用$ PWD方法修复脚本?
答案 0 :(得分:0)
前两个陈述
tcpreplay="/usr/bin/tcpreplay --topspeed --intf1=lo "${PWD}"/to/file.pcap | sed -n 5p | cut -d' ' -f11"
PKT_NUM=`eval ${tcpreplay}`
看起来非常好,shell应该真正解决$ {PWD}。我猜它会导致一个int分配给PKT_NUM?然而
TEST_CFLAGS=-DPKT_NUM=$(PKT_NUM)
看起来有点奇怪,因为看起来你想要执行int并将它分配给TEST_CFLAGS?
您可以粘贴命令的实际输出吗?我无法重现它,因为我没有" tcpreplay"。
答案 1 :(得分:0)
我不确定我是否理解你要做的事情,但是如果你先把shell的东西拿走,你的Makefile会更清楚。在GNU make中,使用shell函数来评估shell代码。此外,GNU make为您定义了PWD。所以:
tcpreplay = /usr/bin/tcpreplay --topspeed --intf1=lo $(PWD)/to/file.pcap
# get number of packet in PCAP
PKT_NUM = $(shell $(tcprelay) | sed -n 5p | cut -d' ' -f11)
TEST_CFLAGS = -DPKT_NUM=$(PKT_NUM)
如果那不能做你想做的事,你可以在没有shell功能的情况下更好地看到事情:
PKT_NUM = $$( $(tcprelay) | sed -n 5p | cut -d' ' -f11 )
我不了解您使用print-%
规则所做的事情的意图,但也许这会让您前进。