gnu make中的'make depends`魔术?

时间:2015-03-07 20:50:09

标签: makefile gnu-make

我有一个简单的脚本(depends.sh),它生成依赖文件,并从依赖文件中进行了一些更改。

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

该脚本是从Makefile调用的,这是摘录它。

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

# implicit rules

%.d: %.c
    ./depends.sh $(CC) `dirname $*.c` $(CFLAGS) $*.c > $@

-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 个答案:

答案 0 :(得分:1)

最后两行来自内置规则,如果您使用" -p"制造的选择。这看起来像

%.sh:

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

它会触发,因为您的脚本名为&#34; depends.sh&#34;。运行其他两行是因为make需要$(DEPS)数据。