2015-03-07 2 views
0

У меня есть простой скрипт (depends.sh), который генерирует файл зависимостей и внес некоторые изменения из файла зависимостей.`make зависит от магии в gnu make?

#!/bin/sh 
#echo "## Got: $*" 
CC="$1" 
DIR="$2" 
shift 2 
case "$DIR" in 
    "" | ".") 
    $CC -MM -MG "[email protected]" | sed -e '[email protected]^\(.*\)\.o:@\1.d \1.o:@' 
    ;; 
    *) 
    $CC -MM -MG "[email protected]" | sed -e "[email protected]^\(.*\)\.o:@$DIR/\1.d $DIR/\1.o:@" 
    ;; 
esac 

Сценарий вызывается из Makefile, это отрывок из него.

DEP := $(OBJ:.o=.d) 

# implicit rules 

%.d: %.c 
    ./depends.sh $(CC) `dirname $*.c` $(CFLAGS) $*.c > [email protected] 

-include $(DEP) 

# Actual targets 

depend: $(DEP) 

Что интересно, что make depends выполняет следующие действия:

./depends.sh gcc `dirname src/hellomake.c` -Wall -Wno-unused-function -g -O -Isrc src/hellomake.c > src/hellomake.d 
./depends.sh gcc `dirname src/hellofunc.c` -Wall -Wno-unused-function -g -O -Isrc src/hellofunc.c > src/hellofunc.d 
cat depends.sh >depends 
chmod a+x depends 

Там нет depends цели (только depend цели), но она выполняет зависит цель и даже создает зависит сценарий, и сделать его исполняемым.

Что это за магия?

ответ

1

Последние две строки взяты из встроенного правила, которое вы могли видеть, если вы использовали опцию «-p» make. Это выглядит примерно так:

%.sh: 

%: %.sh 
# commands to execute (built-in): 
    cat $< >[email protected] 
    chmod a+x [email protected] 

Он срабатывает, потому что ваш сценарий имеет имя «зависит.sh». Остальные две строки выполняются, потому что make требует данные $ (DEPS).

Смежные вопросы