2013-01-22 31 views
2

工作我掏出刚才说事行:管不生成文件

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到了所有的文件(实际上忽略了阶段之间......)

回答

8

$需要被引述$$,例如,

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作为变量1在制作方面,但目前还没有这样的变量的值,所以就变成了空白。

可以在制作的输出看到这种呼应它运行的命令,从原来的Makefile:

$ 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已经消失。