Существует три ситуации, в которых полезно использовать двойное двоеточие:
- Переключение между правилами компиляции, в зависимости от того, какое условие является более новым, чем цель.Следующий пример основан на «Примере 19-3. Правила двойного двоеточия» из http://books.gigatux.nl/mirror/cinanutshell/0596006977/cinanut-CHP-19-SECT-3.html
Образец .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.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.cfg из a.cfg1):
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!