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}