2013-01-22 30 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已經消失。