2012-01-07 1 views
0

У меня есть цель в моем make-файле под названием «cambios», который делает cvs-фиксацию для каждого файла проекта (отдельно) и показывает последнюю ревизию.makefile: using for и ifneq

Теперь у меня есть вспомогательный shellscript, который это делает, но я хотел бы знать, как я могу это сделать в make-файле. Я создал объектный cambios2, который делает то же самое без вспомогательного shellscript, но имеет некоторые проблемы с синтаксисом.

Makefile:

(...) 
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, но я действительно новый делать мейкфайлы, и я действительно не знаю, как решить эти проблемы.

Спасибо!

+0

Вы слишком много думать. Команды для правила Makefile * являются * в sh. Просто скопируйте содержимое aux.sh в MF. –

+0

Я пробовал, но это не работает, потому что это не тот же синтаксис ... – Motumbo

ответ

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. Таким образом, вы не должны отступать ifneq и endif с вкладками. How Make reads a Makefile глава дает хорошее объяснение.

В заключение я бы рекомендовал оставить отдельный sh как есть и просто вызывать его из вашего файла Makefile. Не рекомендуется смешивать код на двух разных языках.