makefile: использование for и ifneq - PullRequest
0 голосов
/ 07 января 2012

У меня есть цель в моем make-файле с именем "cambios", которая заставляет cvs коммитить каждый файл проекта (по отдельности) и показывает последнюю ревизию.

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

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

Спасибо!

Ответы [ 2 ]

0 голосов
/ 08 января 2012

Хорошо, я нашел способ, которым это работает:

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 голосов
/ 07 января 2012

Вы забыли избежать долларов, являющихся частью подстановки команд Bash, и Make пытается выполнить расширение переменной: $(cvs commit ...), $(echo $(A) ...).

Также нельзя назначить переменную Make внутри рецепта. A = $(cvs commit ...) недопустимо, оно не будет считаться ни назначением, ни Bash. Попробуйте запустить make с --warn-undefined-variables, думаю, это скажет много интересных деталей.

Наконец, ifneq условный является частью языка Make, и он интерпретируется на самой ранней стадии чтения Makefile. Таким образом, вы не должны делать отступы ifneq и endif с вкладками. Как Make читает главу Makefile дает хорошее объяснение.

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

...