双冒号有3种用处:
- 根据哪个先决条件比目标更新,在编译规则之间交替。以下示例基于http://books.gigatux.nl/mirror/cinanutshell/0596006977/cinanut-CHP-19-SECT-3.html 中的“示例 19-3. 双冒号规则”
示例 .c 文件:
c@desk:~/test/circle$ cat circle.c
#include <stdio.h>
int main (void)
{
printf("Example.\n");
return 0;
}
使用的Makefile:
c@desk:~/test/circle$ cat Makefile
# A makefile for "circle" to demonstrate double-colon rules.
CC = gcc
RM = rm -f
CFLAGS = -Wall -std=c99
DBGFLAGS = -ggdb -pg
DEBUGFILE = ./debug
SRC = circle.c
circle :: $(SRC)
$(CC) $(CFLAGS) -o $@ -lm $^
circle :: $(DEBUGFILE)
$(CC) $(CFLAGS) $(DBGFLAGS) -o $@ -lm $(SRC)
.PHONY : clean
clean :
$(RM) circle
结果:
c@desk:~/test/circle$ make circle
gcc -Wall -std=c99 -o circle -lm circle.c
make: *** No rule to make target 'debug', needed by 'circle'. Stop.
c@desk:~/test/circle$ make circle
gcc -Wall -std=c99 -o circle -lm circle.c
gcc -Wall -std=c99 -ggdb -pg -o circle -lm circle.c
c@desk:~/test/circle$ vim circle.c
c@desk:~/test/circle$ make circle
gcc -Wall -std=c99 -o circle -lm circle.c
c@desk:~/test/circle$ vim debug
c@desk:~/test/circle$ make circle
gcc -Wall -std=c99 -ggdb -pg -o circle -lm circle.c
- 制作模式规则终端。
下面的例子说明了这种情况:a.config文件是从a.cfg获取的,而a.cfg又是从a.cfg1获取的(a.cfg是中间文件)。
c@desk:~/test/circle1$ ls
a.cfg1 log.txt Makefile
c@desk:~/test/circle1$ cat Makefile
CP=/bin/cp
%.config:: %.cfg
@echo "$@ from $<"
@$(CP) $< $@
%.cfg: %.cfg1
@echo "$@ from $<"
@$(CP) $< $@
clean:
-$(RM) *.config
结果(由于 %.config 规则是终端,make 禁止从 a.cfg1 创建中间 a.cfg 文件):
c@desk:~/test/circle1$ make a.conf
make: *** No rule to make target 'a.conf'. Stop.
%.config 没有双冒号,结果是:
c@desk:~/test/circle1$ make a.config
a.cfg from a.cfg1
a.config from a.cfg
rm a.cfg
- 制定始终执行的规则(对干净的规则很有用)。规则不能有先决条件!
c@desk:~/test/circle3$ cat Makefile
CP=/bin/cp
a.config::
@echo "Always" >> $@
a.config::
@echo "Always!" >> $@
clean:
-$(RM) *.config
结果:
c@desk:~/test/circle3$ make a.config
c@desk:~/test/circle3$ cat a.config
Always
Always!
c@desk:~/test/circle3$ make a.config
c@desk:~/test/circle3$ cat a.config
Always
Always!
Always
Always!