Linux項目自動化構(gòu)建工具-make/Makefile

  1. 背景

linux項目中,make和makefile是自動化構(gòu)建工具的核心,它們使得編譯和管理大型項目變得更加高效和便捷。本文將通過實例和圖示詳細介紹make和makefile的使用方法。

Linux項目自動化構(gòu)建工具-make/MakefileLinux項目自動化構(gòu)建工具-make/Makefile


  1. make和Makefile的演示

make是一個自動化構(gòu)建工具,它通過讀取Makefile來執(zhí)行編譯命令。Makefile是一個文本文件,包含了項目構(gòu)建的規(guī)則和依賴關(guān)系。以下是make和Makefile的一個基本示例:

CC=gcc CFLAGS=-I. DEPS = hellomake.h <p>%.o: %.c $(DEPS) $(CC) -c -o $@ $< $(CFLAGS)</p><p>hellomake: hellomake.o hellofunc.o  $(CC) -o hellomake hellomake.o hellofunc.o

Linux項目自動化構(gòu)建工具-make/Makefile


  1. 依賴關(guān)系和依賴方法

Makefile中的依賴關(guān)系定義了目標文件和源文件之間的關(guān)系。當(dāng)源文件發(fā)生變化時,make會根據(jù)這些依賴關(guān)系重新編譯必要的文件。以下是一個依賴關(guān)系的示例:

main.o: main.c gcc -c main.c

Linux項目自動化構(gòu)建工具-make/Makefile


  1. Makefile的語法

Makefile的語法包括目標、依賴和命令三部分。目標是需要構(gòu)建的文件,依賴是目標文件所依賴的文件,命令是構(gòu)建目標文件的具體操作。以下是一個簡單的Makefile語法示例:

target: dependencies command

Linux項目自動化構(gòu)建工具-make/Makefile

那么,make和Makefile是如何判斷可執(zhí)行程序是否為最新版本的呢?

make通過比較目標文件(如可執(zhí)行程序)和其依賴文件(如源文件)的修改時間來判斷是否需要重新編譯。如果依賴文件的修改時間比目標文件晚,則make會認為目標文件需要更新。

源文件的修改時間和可執(zhí)行程序的最近修改時間通常不會完全一致,因為可執(zhí)行程序的修改時間是在編譯完成后更新的,而源文件的修改時間是在文件內(nèi)容改變時更新的。

當(dāng)多個源文件編譯形成可執(zhí)行程序時,如果只修改了一兩個文件,make會根據(jù)依賴關(guān)系只重新編譯這些修改過的文件,而不是全部重新編譯。


  1. 認識一下時間

在文件系統(tǒng)中,文件的時間屬性包括修改時間(Modify)、變更時間(Change)和訪問時間(Access)。這些時間屬性在make的決策過程中起著重要作用。

Linux項目自動化構(gòu)建工具-make/Makefile

5.1 Modify和Change兩個時間有什么區(qū)別

Modify時間(修改時間)是指文件內(nèi)容最后一次被修改的時間,而Change時間(變更時間)是指文件屬性(如權(quán)限、所有者等)最后一次被修改的時間。通過命令ll可以查看這些時間屬性。

Linux項目自動化構(gòu)建工具-make/Makefile

5.2 文件的Access時間(訪問文件時間)特殊的時間更新策略

Access時間(訪問時間)是指文件最后一次被讀取的時間。某些文件系統(tǒng)會采用特殊的時間更新策略,如延遲更新Access時間,以減少磁盤I/O操作。

Linux項目自動化構(gòu)建工具-make/Makefile

5.3 關(guān)于可執(zhí)行程序的文件時間和源文件的文件時間該對比哪個文件時間比較合適呢?

在make的決策過程中,通常比較Modify時間(修改時間)更為合適,因為它反映了文件內(nèi)容的實際變化情況。

Linux項目自動化構(gòu)建工具-make/MakefileLinux項目自動化構(gòu)建工具-make/Makefile


  1. 補充語法

Makefile的語法還包括變量定義、條件判斷、循環(huán)等高級功能。以下是一些常見的Makefile語法示例:

# 變量定義 CC=gcc</p><h1>條件判斷</h1><p>ifeq ($(CC),gcc) libs=$(libs_for_gcc) else libs=$(libs_for_icc) endif</p><h1>循環(huán)</h1><p>sources = file1.c file2.c file3.c objects = $(sources:.c=.o)</p><p>$(objects): %.o: %.c $(CC) -c $< -o $@

Linux項目自動化構(gòu)建工具-make/MakefileLinux項目自動化構(gòu)建工具-make/MakefileLinux項目自動化構(gòu)建工具-make/MakefileLinux項目自動化構(gòu)建工具-make/Makefile

慣用做法

在編寫Makefile時,有一些常見的慣用做法,如使用通配符、自動變量、偽目標等,以提高Makefile的靈活性和可讀性。

Linux項目自動化構(gòu)建工具-make/MakefileLinux項目自動化構(gòu)建工具-make/MakefileLinux項目自動化構(gòu)建工具-make/Makefile

關(guān)于make和Makefile的語法推導(dǎo)

Makefile的語法推導(dǎo)是指通過分析Makefile的結(jié)構(gòu)和規(guī)則,理解其執(zhí)行邏輯和依賴關(guān)系,從而優(yōu)化Makefile的編寫和維護。

Linux項目自動化構(gòu)建工具-make/Makefile

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點贊10 分享