Makefile基礎學習(一)——從依賴到僞目標

一、初識Makefile

make是一種用於項目編譯的應用程序,本質是一種腳本。而Makefile則是對make腳本的規則描述。
僅僅是寫腳本編譯項目的話shell腳本也是可以做的,用make的原因在於,make可以解析源文件之間的依賴,根據依賴關係自動維護編譯工作。執行宿主操作系統中的各種命令。
Makefile是一個描述文件,定義一系列的規則來指定源文件之間的調用先後順序。有自己特定的語法規則,可以定義函數及函數調用。可以集成各種系統命令。Makefile用於指導make程序如何完成工作。

Makefile示例:

sayhello:
    echo "hello world!"

其中sayhello稱爲目標,下方的 echo “hello world!” 是實現目標的命令。其中echo前面是TAB製表符,而不能是空格。
對於文件名,可以叫Makefile或makefile,也可以自定義名稱。對於是否自定義Makefile文件名的區別在於使用方式不同。

採用默認名稱makefile或Makefile:有兩種方法,我們的Makefile文件名爲Makefile

make -f 文件名 目標名

make -f Makefile sayhello

或者

make 目標名

make -f make.txt sayhello  

如果不指定目標名字,則默認執行最前面的目標。

二、Makefile基本結構與依賴

Makefile由一個個規則組成,一個規則的結構大致如下:

targets : prerequisites
    commands

targets可以有多個目標,目標之間空格隔開,prerequisites可以包含多個依賴項,依賴項之間空格隔開。

其中 target 爲我們要構建的目標,prerequisite爲構建目標的依賴項。command爲構建目標所需的命令。

舉例子來說明,有兩個c語言程序文件,func.c和main.c:

func.c文件

//func.c
#include <stdio.h>
void func()
{
    printf("hello world!\n");
}

main.c文件

//main.c
extern void func();
int main()
{
    func();
    return 0;
}

Makefile文件:

all main : main.o func.o
    gcc main.o func.o -o main 

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

func.o : func.c
    gcc -o func.o -c func.c

目標依賴規則:

  • 當目標不存在時,執行對應命令。
  • 當依賴在時間上比目標更新時,執行對應命令。
  • 當依賴關係連續存在時,要依次向上回溯每個目標。

上面那個Makefile中,all和main都是目標。all是沒有規則的終極目標,他可以用作生成多個目標。把main和all寫在一起的話,make就會檢查main的依賴,如果main是最新的就不會執行編譯。

上述Makefile文件,執行make all或 make 命令的時候,先檢查,main是否存在,如果不存在則檢查main的依賴項,main.o和func.o這兩個目標,依次向上檢查,生成目標。
如果目標存在,但依賴項比目標時間要新,則也要向上檢查,生成目標。

三、僞目標的引入

Makefile中的目標指什麼?

  • Makefile中目標一般對應着一個文件
  • make比較目標文件和依賴之間的新舊關係,如果依賴新則執行命令
  • make以文件處理作爲第一優先級

爲什麼需要引入僞目標?

一個場景是,Makefile文件中有一個名爲clean的目標。對應的命令是清除相應目標文件。如果當前工作目錄下沒有名爲clean的文件,這樣是沒問題的。但是如果當前目錄下存在名爲clean的文件,那麼make每次檢查這個目標的時候就會發現這個文件已經存在了,clean是最新的,導致clean目標對應的清除命令不會執行。

僞目標的用法?

先定義,再使用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章