Programming Utilities Guide

Internal Rules

The standard set of internal rules used by make are reproduced below.

Suffixes recognized by make are:

.o.c.c~.y.y~.l.l~.s.s~.sh.sh~
.h.h~.f.f~.C.C~.Y.Y~.L.L~

The following are predefined macros:

AR=ar ARFLAGS=-rv AS=as ASFLAGS= BUILD=build CC=cc CFLAGS= -0 C++C=CC C++FLAGS= -0 F77=f77 FFLAGS= -0 GET=get GFLAGS= LEX=lex LFLAGS= LD=ld LDFLAGS= MAKE=make MAKEFLAGS= YACC=yacc YFLAGS= $=$

Special Rules

This section covers special make rules with either single or double suffixes.

markfile.o : markfile 
     A=@; echo "static char _sccsid[]=\042`grep $$A'(#)' \ 
     markfile`\042;" > markfile.c 
     $(CC) -c markfile.c 
     rm -f markfile.c

Single-Suffix Rules

The following are single-suffix rules:

.c:
 	$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< 
.c~:
 	$(GET) $(GFLAGS) $<
 	$(CC) $(CFLAGS) $(LDFLAGS) -o $* $*.c
 	rm -f $*.c 
.s:
 	$(AS) $(AFLAGS) -o $@ $< 
.s~:
 	$(GET) $(GFLAGS) $<
 	$(AS) $(AFLAGS) -o $@ $*.s
 	rm -f $*.s 
.sh:
 	cp $< $@; chmod 0777 $@ 
.sh~:
 $(GET) $(GFLAGS) $<
 	cp $*.sh $*; chmod 0777 $@
 	rm -f $*.sh 
.f:
 	$(F77) $(FFLAGS) $(LDFLAGS) -o $@ $< 
.f~:
 	$(GET) $(GFLAGS) $<
 	$(F77) $(FFLAGS) -o $@ $(LDFLAGS) $*.f
 	rm -f $*.f 
.C~:
 	$(GET) $(GFLAGS) $<
 	$(C++C) $(C++FLAGS) -o $@ $(LDFLAGS) $*.C
 	rm -f $*.C 
.C:
 	$(C++C) $(C++FLAGS) -o $@ $(LDFLAGS) $< 

Double-Suffix Rules

The following are double-suffix rules:

.c~.c.y~.y.l~.l.s~.s.sh~.sh
.h~.h.f~.f.C~.C.Y~.Y.L~.L

$(GET) $(GFLAGS) $< 
.c.a:
 	$(CC) -c $(CFLAGS) $<
 	$(AR) $(ARFLAGS) $@ $*.o
 	rm -f $*.o
c.a~:
 	$(GET) $(GFLAGS) $<
 	$(CC) -c $(CFLAGS) $*.c
 	$(AR) $(ARFLAGS) $@ $*.o
 	rm -f $*.[co] 
.c.o:
 	$(CC) $(CFLAGS) -c $<
.c~.o:
 	$(GET) $(GFLAGS) $<
 	$(CC) $(CFLAGS) -c $*.c
 	rm -f $*.c 
.y.c:
	$(YACC) $(YFLAGS) $<
 	mv y.tab.c $@ 
.y~.c:
	$(GET) $(GFLAGS) $<
 	$(YACC) $(YFLAGS) $*.y
 	mv y.tab.c $*.c
 	rm -f $*.y 
.y.o:
 	$(YACC) $(YFLAGS) $<
 	$(CC) $(CFLAGS) -c y.tab.c
 	rm -f y.tab.c
 	mv y.tab.o $@ 
.y~.o:
 	$(GET) $(GFLAGS) $<
 	$(YACC) $(YFLAGS) $*.y
 	$(CC) $(CFLAGS) -c y.tab.c
 	rm -f y.tab.c $*.y
 	mv y.tab.o $*.o 
.l.c:
 	$(LEX) $(LFLAGS) $<
 	mv lex.yy.c $@ 
.l~.c:
 	$(GET) $(GFLAGS) $<
 	$(LEX) $(LFLAGS) $*.l
 	mv lex.yy.c $@
 	rm -f $*.l 
.l.o:
 	$(LEX) $(LFLAGS) $<
 	$(CC) $(CFLAGS) -c lex.yy.c
 	rm -f lex.yy.c
 	mv lex.yy.o $@ 
.l~.o:
 	$(GET) $(GFLAGS) $<
 	$(LEX) $(LFLAGS) $*.l
 	$(CC) $(CFLAGS) -c lex.yy.c
 	rm -f lex.yy.c $*.l
 	mv lex.yy.o $@ 
.s.a:
 	$(AS) $(ASFLAGS) -o $*.o $*.s
 	$(AR) $(ARFLAGS) $@ $*.o 
.s~.a:
 	$(GET) $(GFLAGS) $<
 	$(AS) $(ASFLAGS) -o $*.o $*.s
 	$(AR) $(ARFLAGS) $@ $*.o
 	rm -f $*.[so] 
.s.o:
 	$(AS) $(ASFLAGS) -o $@ $< 
.s~.o:
 	$(GET) $(GFLAGS) $<
 	$(AS) $(ASFLAGS) -o $*.o $*.s
 	rm -f $*.s 
.f.a:
 	$(F77) $(FFLAGS) -c $*.f
 	$(AR) $(ARFLAGS) $@ $*.o
 	rm -f $*.o 
.f~.a:
 	$(GET) $(GFLAGS) $<
 	$(F77) $(FFLAGS) -c $*.f
 	$(AR) $(ARFLAGS) $@ $*.o
 	rm -f $*.[fo] 
.f.o:
 	$(F77) $(FFLAGS) -c $*.f 
.f~.o:
 	$(GET) $(GFLAGS) $<
 	$(F77) $(FFLAGS) -c $*.f
 	rm -f $*.f 
.C.a:
 	$(C++C) $(C++FLAGS) -c $<
 	$(AR) $(ARFLAGS) $@ $*.o
 	rm -f $*.o 
.C~.a:
 	$(GET) $(GFLAGS) $<
 	$(C++C) $(C++FLAGS) -c $*.C
 	$(AR) $(ARFLAGS) $@ $*.o
 	rm -f $*.[Co] 
.C.o:
 	$(C++C) $(C++FLAGS) -c $< 
.C~.o:
 	$(GET) $(GFLAGS) $<
 	$(C++C) $(C++FLAGS) -c $*.C
 	rm -f $*.C 
.Y.C:
 	$(YACC) $(YFLAGS) $<
 	mv y.tab.c $@ 
.Y~.C:
 	$(GET) $(GFLAGS) $<
 	$(YACC) $(YFLAGS) $*.Y
 	mv y.tab.c $*.C
 	rm -f $*.Y 
.Y.o
 	$(YACC) $(YFLAGS) $<
 	$(C++C) $(C++FLAGS) -c y.tab.c
 	rm -f y.tab.c
 	mv y.tab.o $@ 
.Y~.o:
 	$(GET) $(GFLAGS) $<
 	$(YACC) $(YFLAGS) $*.Y
 	$(C++C) $(C++FLAGS) -c y.tab.c
 	rm -f y.tab.c $*.Y
 	mv y.tab.o $*.o 
.L.C:
 	$(LEX) $(LFLAGS) $<
 	mv lex.yy.c $@ 
.L~.C:
 	$(GET) $(GFLAGS) $<
 	$(LEX) $(LFLAGS) $*.L
 	mv lex.yy.c $@
 	rm -f $*.L 
.L.o:
 	$(LEX) $(LFLAGS) $<
 	$(C++C) $(C++FLAGS) -c lex.yy.c
 	rm -f lex.yy.c
 	mv lex.yy.o $@ 
.L~.o:
 	$(GET) $(GFLAGS) $<
 	$(LEX) $(LFLAGS) $*.L
 	$(C++C) $(C++FLAGS) -c lex.yy.c
 	rm -f lex.yy.c $*.L
 	mv lex.yy.o $@