3

我已经删除了重要的行:

SHELL := /bin/bash

leaks: build_eagle_test
    grep EagleMemory_Allocate -r eagle | perl -nle 'm/"(.*)"/; print $1' | sort | uniq > leaks.alloc.tmp
    grep "EagleMemory_Mock(" -r eagle_test | perl -nle 'm/"(.*)"/; print $1' | sort | uniq > leaks.alloc_test.tmp

当我在 bash 中运行这些行时没问题。但是从 make 文件中它只将管道输入grep到输出文件中(实际上忽略了中间的阶段......)

4

1 回答 1

10

$需要引用为,$$例如,

SHELL := /bin/bash

leaks:
    grep EagleMemory_Allocate -r eagle | perl -nle 'm/"(.*)"/; print $$1' | sort | uniq > leaks.alloc.tmp
    grep "EagleMemory_Mock(" -r eagle_test | perl -nle 'm/"(.*)"/; print $$1' | sort | uniq > leaks.alloc_test.tmp

问题是 Make 对 bash 语法一无所知,并且忽略'"了命令行上的所有引用。它将 解释$1为 Make 上下文中变量的值1——但没有这样的变量,所以它变成了空白。

当它回显从原始 Makefile 运行的命令时,您可以在 Make 的输出中看到这一点:

$ make
grep EagleMemory_Allocate -r eagle | perl -nle 'm/"(.*)"/; print ' | sort | uniq > leaks.alloc.tmp
grep "EagleMemory_Mock(" -r eagle_test | perl -nle 'm/"(.*)"/; print ' | sort | uniq > leaks.alloc_test.tmp

注意$1消失了。

于 2013-01-22T03:05:36.183 回答