Makefile的編寫

Makefile 的規則
target ... : prerequisites ...
command
tcp

target 也就是一個目標文件,能夠是 Object File,也能夠是執行文件。還能夠是一個標籤。ui

prerequisites 就是要生成那個 target 所須要的文件或是目標 。spa

command 也就是 make 須要執行的命令。(任意的 Shell 命令) 。code

這是一個文件的依賴關係,也就是說,target 這一個或多個的目標文件依賴於prerequisites 中的文件其生成規則定義在 command 中。說白一點就是說,prerequisites中若是有一個以上的文件比 target 文件要新的話,command 所定義的命令就會被執行。這就是 Makefile 的規則。也就是 Makefile 中最核心的內容。 blog

 

make是如何工做的get

在默認的方式下,也就是咱們只輸入make命令。那麼,it

  1. make會在當前目錄下找名字叫「Makefile」或「makefile」的文件。
  2. 若是找到,它會找文件中的第一個目標文件(target),在上面的例子中,他會找到「edit」這個文件,並把這個文件做爲最終的目標文件。
  3. 若是edit文件不存在,或是edit所依賴的後面的 .o 文件的文件修改時間要比edit這個文件新,那麼,他就會執行後面所定義的命令來生成edit這個文件。
  4. 若是edit所依賴的.o文件也不存在,那麼make會在當前文件中找目標爲.o文件的依賴性,若是找到則再根據那一個規則生成.o文件。(這有點像一個堆棧的過程)
  5. 固然,你的C文件和H文件是存在的啦,因而make會生成 .o 文件,而後再用 .o 文件生成make的終極任務,也就是執行文件edit了

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}
相關文章
相關標籤/搜索