2012-10-28 96 views
2

我有一個印象,我可以在GNU makefile中調用bash函數,但似乎是錯誤的。下面是一個簡單的測試,我有這個函數:無法在makefile中調用bash函數

>type lsc 
lsc is a function 
lsc() 
{ 
    ls --color=auto --color=tty 
} 

這裏是我的Makefile:

>cat Makefile 
all: 
    lsc 

這是我得到的運行make:

>make 
lsc 
make: lsc: Command not found 
make: *** [all] Error 127 

我的印象錯誤?或者是否有任何env設置問題?我可以在命令行運行「lsc」。

+0

另一條信息:當我嘗試重現此,我將命令添加'型lsc'的規則,並給出正確的答案 - 但命令'lsc'仍然失敗LS。 – Beta

回答

1

你用「export -f」導出了你的函數嗎?

bash是你Makefile的shell,還是sh?

+0

是的,我試過「出口-f」,沒有幫助。不確定你的第二個問題是什麼意思,我的shell是bash,我運行make。 –

+0

您是否設置了SHELL變量?看到這裏:http://www.gnu.org/software/make/manual/html_node/Choosing-the-Shell.html#Choosing-the-Shell「如果這個變量沒有在你的makefile中設置,程序/ bin/sh用作殼。「 – Sebastian

3

您不能在Makefile中調用bash函數或別名,只能調用二進制文件和腳本。但是你可以做什麼,在呼喚一個交互式bash和指示它調用你的函數或別名:

all: 
    bash -i -c lsc 

如果lsc.bashrc定義,例如。

3

使用$*在bash腳本:

functions.sh

_my_function() { 
    echo $1 
} 

# Allows to call a function based on arguments passed to the script 
$* 

的Makefile

test: 
    ./functions.sh _my_function "hello!" 

運行例如:

$ make test 
./functions.sh _my_function "hello!" 
hello! 
0

您可以導入所有shell腳本函數從shell文件,如果使用這個從問題How do I write the 'cd' command in a makefile?

.ONESHELL: my_target 

my_target: dependency 
    . ./shell_script.sh 
    my_imported_shell_function "String Parameter" 

如果你願意,你也可以甚至不使用.ONESHELL的事情,做這一切在一個線只需使用一個冒號;之後進口的shell腳本:

my_target: dependency 
    . ./shell_script.sh; my_imported_shell_function "String Parameter"