2012-01-07 68 views
0

我在我的makefile文件中有一個名爲「cambios」的目標,它在項目的每個文件上(單獨)提交cvs提交併顯示最後一個修訂。makefile:使用for和ifneq

現在,我有一個auxiliar shellscript這樣做,但我想知道如何在makefile中做到這一點。我創建了沒有auxiliar shellscript的目標cambios2,但它有一些語法問題。

生成文件:

(...) 
TODO= makefile cambiosaux.sh lib/libreria.cc include/libreria.h src/principal.cc 
(...) 

cambios: 
    @./cambiosaux.sh "$(TODO)" 

cambios2: 
    @for dir in $(TODO); do \ 
     A = $(cvs commit -m "Incorporando cambios automáticamente." $$dir) \ 
     ifneq ($(A),) 
      echo $dir ; \ 
      echo "Última revisión:"$(echo $(A) | sed 's/.*new revision: //' | sed 's/;.*//') ; \ 
     endif ; \            
    done 

cambiosaux.sh:

for dir in $1 
do 
    A=$(cvs commit -m "Incorporando cambios automáticamente." $dir) 
    if [ "$A" != "" ]; then 
     echo $dir 
     echo "Última revisión:"$(echo $A | sed 's/.*new revision: //' | sed 's/;.*//') 
    fi 
done 

有在客觀cambios2一些語法問題,但我真的很新做的makefile,我真的不知道如何解決這個問題。

謝謝!

+0

。 Makefile規則*的命令*爲sh。只需將aux.sh的內容複製到MF中即可。 – 2012-01-07 09:43:16

+0

我試過了,但它不工作,因爲它的語法不一樣... – Motumbo 2012-01-07 10:23:08

回答

0

好吧,我發現它的工作方式:你想得太多了

CVS: $(TODO) 
    @for dir in $?; do \ 
    echo $$dir ; \ 
     echo "Última revisión:" $$(cvs commit -m "Incorporando cambios automáticamente." $$dir | grep "new revision" | sed 's/.*new revision: //' | sed 's/;.*//') ; \ 
    done 

cambios: CVS 
0

您忘記轉義美元是Bash命令替換的一部分,並且Make嘗試執行可變擴展:$(cvs commit ...)$(echo $(A) ...)

此外,您不能在配方中分配一個Make變量。 A = $(cvs commit ...)是非法的,它不會被視爲轉讓或Bash。嘗試運行make--warn-undefined-variables,我想它會說很多有趣的細節。

最後ifneq有條件是Make語言的一部分,它在閱讀Makefile的最初階段被解釋。因此,您不得使用製表符縮進ifneqendifHow Make reads a Makefile一章給出了很好的解釋。最後,我建議你保留一個單獨的sh,並從你的Makefile中調用它。混合兩種不同語言的代碼是不好的做法。