Makefile 的规则
target ... : prerequisites ...
commandtcp
target 也就是一个目标文件,能够是 Object File,也能够是执行文件。还能够是一个标签。ui
prerequisites 就是要生成那个 target 所须要的文件或是目标 。spa
command 也就是 make 须要执行的命令。(任意的 Shell 命令) 。code
这是一个文件的依赖关系,也就是说,target 这一个或多个的目标文件依赖于prerequisites 中的文件,其生成规则定义在 command 中。说白一点就是说,prerequisites中若是有一个以上的文件比 target 文件要新的话,command 所定义的命令就会被执行。这就是 Makefile 的规则。也就是 Makefile 中最核心的内容。 blog
make是如何工做的get
在默认的方式下,也就是咱们只输入make命令。那么,it
GNU的make很强大,它能够自动推导文件以及文件依赖关系后面的命令,因而咱们就不必去在每个[.o]文件后都写上相似的命令,由于,咱们的make会自动识别,并本身推导命令。class
只要make看到一个[.o]文件,它就会自动的把[.c]文件加在依赖关系中,若是make找到一个whatever.o,那么 whatever.c,就会是whatever.o的依赖文件。而且 cc -c whatever.c 也会被推导出来,因而,咱们的makefile 不再用写得这么复杂。cli
Makefile示例file
include ../Make.defines #能够包含其余Makefile PROGS = daytimetcpcli daytimetcpcli1 daytimetcpcli2 daytimetcpcli3 \ daytimetcpsrv daytimetcpsrv1 daytimetcpsrv2 daytimetcpsrv3 \ daytimetcpcliv6 daytimetcpsrvv6 \ byteorder all: ${PROGS} #all的依赖 daytimetcpcli: daytimetcpcli.o ${CC} ${CFLAGS} -o $@ daytimetcpcli.o ${LIBS} #$@为目标(target)名 daytimetcpcli1: daytimetcpcli1.o ${CC} ${CFLAGS} -o $@ daytimetcpcli1.o ${LIBS} daytimetcpcli2: daytimetcpcli2.o ${CC} ${CFLAGS} -o $@ daytimetcpcli2.o ${LIBS} daytimetcpcli3: daytimetcpcli3.o ${CC} ${CFLAGS} -o $@ daytimetcpcli3.o ${LIBS} daytimetcpsrv: daytimetcpsrv.o ${CC} ${CFLAGS} -o $@ daytimetcpsrv.o ${LIBS} daytimetcpsrv1: daytimetcpsrv1.o ${CC} ${CFLAGS} -o $@ daytimetcpsrv1.o ${LIBS} daytimetcpsrv2: daytimetcpsrv2.o ${CC} ${CFLAGS} -o $@ daytimetcpsrv2.o ${LIBS} daytimetcpsrv3: daytimetcpsrv3.o ${CC} ${CFLAGS} -o $@ daytimetcpsrv3.o ${LIBS} daytimetcpcliv6: daytimetcpcliv6.o ${CC} ${CFLAGS} -o $@ daytimetcpcliv6.o ${LIBS} daytimetcpsrvv6: daytimetcpsrvv6.o ${CC} ${CFLAGS} -o $@ daytimetcpsrvv6.o ${LIBS} byteorder: byteorder.o ${CC} ${CFLAGS} -o $@ byteorder.o ${LIBS} clean: rm -f ${PROGS} ${CLEANFILES}