我有一个简单的脚本(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
目标),但它执行依赖目标,甚至创建依赖脚本,并使其可执行。
这背后的魔力是什么?
答案 0 :(得分:1)
最后两行来自内置规则,如果您使用" -p"制造的选择。这看起来像
%.sh:
%: %.sh
# commands to execute (built-in):
cat $< >$@
chmod a+x $@
它会触发,因为您的脚本名为&#34; depends.sh&#34;。运行其他两行是因为make需要$(DEPS)数据。