2014-09-25 104 views
0

我想寫一個GNU make調用函數(下面的例子),它有多個shell命令來執行,這樣它可以用不同的參數調用。GNU使多個參數和多個命令的調用函數

shell_commands = $(shell echo $(1); ls -ltr $(2)) 

try: 
    $(call shell_commands,$(FILE1),$(FILE2)) 

1)超出了用多個命令編寫調用函數的正確方法嗎?用分號分隔它們?爲了使它可讀,我編寫了我的目標,如下所示。有沒有類似的方式來編寫一個調用函數?

shell_commands: 
    echo $(1) 
    ls -ltr $(2) 

2)我執行make -B try時出現此錯誤。它看起來像試圖執行/ home/user/file1。但爲什麼?

make: execvp: /home/user/file1: Permission denied 
make: *** [try] Error 127 

3)是否可以將可變數量的參數傳遞給一個調用函數?就像傳入第二個參數而不是第一個參數一樣。

$(call shell_commands,,$(FILE2)) 

我嘗試谷歌搜索,搜索所以,並在gnu.org上看,但我沒有得到任何解決方案。將欣賞任何答案或指向任何資源的文檔調用具有多個可選參數和命令的函數。

回答

2

問題1:不,這是不對的。 shell make函數不應該在配方中使用:配方已經在shell中運行,那麼爲什麼要運行另一個shell呢?這只是混亂。其次,通常建議在配方中的多個命令之間使用&&,這樣如果第一個命令失敗,整個命令將立即失敗,而不是繼續並且可能成功。當然,這也不總是正確的,這取決於你想要做什麼。

問題2:發生這種情況是因爲shell make函數就像在shell中反引號:它擴展到它運行的shell命令輸出的輸出。你的shell命令,使運行是:

echo $(1); ls -ltr $(2) 

(其中一個假設,$1擴展到/home/user/file1)的輸出字符串/home/user/file1。展開後,該字符串被替換爲配方,並嘗試運行該配方,從而得到您在上面看到的錯誤。

你要這個,最有可能的:

shell_commands = echo $(1) && ls -ltr $(2) 

try: 
     $(call shell_commands,$(FILE1),$(FILE2)) 

現在調用擴展到實際的文本,而不是化妝的外殼函數的調用,然後該文本運行的配方。

問題3:當然,只使用空參數意味着變量$1(在本例中)展開爲空字符串。

+0

謝謝!基本上,我想重用通用功能。想通了,我可以通過使用變量 - 在一個公共文件中設置默認值並將其覆蓋在主make文件中。 – Wilderness 2014-09-28 18:14:15