Makefile檔案是什麼?

rockygao發表於2022-03-27

初次接觸Makefile還是在跟朋友一起寫Go專案的時候,他給我們介紹的,第一感覺聽說,感覺挺好用,作為一個碼農,對於未知的技術,應該保持好奇心,管它三七二十一,先了解了解,用起來再說

下面引用了一堆官方介紹:

很多 Linux(Unix) 做開發的初學者不瞭解 Makefile 是什麼,甚至大部分 Windows 開發工程師對 Makefile 都特別陌生。這個其實很正常,如果你是在 Windows 下作開發的話不需要去考慮這個問題,因為 Windows 下的整合開發環境(IDE)已經內建了 Makefile,或者說會自動生成 Makefile,我們不用去手動編寫。

Linux 中卻不能這樣,需要我們去手動的完成這項工作。Linux 下可以學習的開發語言有很多,常見的有 C/C++語言、python、java 等等。如果你想要在 Linux(Unix) 下做開發的話,不瞭解 Makefile 是一件非常失敗的事情,甚至說你就成為不了一個合格的 Linux 開發工程師。不懂 Makefile,就操作不了多檔案程式設計,就完成不了相對於大的工程專案的操作。如果你想在 Linux(Unix) 環境下做開發的話,Makefile 是必須掌握的一項技能。

那麼,究竟什麼是 Makefile 呢?

Makefile 可以簡單的認為是一個工程檔案的編譯規則,描述了整個工程的編譯和連結等規則。其中包含了那些檔案需要編譯,那些檔案不需要編譯,那些檔案需要先編譯,那些檔案需要後編譯,那些檔案需要重建等等。編譯整個工程需要涉及到的,在 Makefile 中都可以進行描述。換句話說,Makefile 可以使得我們的專案工程的編譯變得自動化,不需要每次都手動輸入一堆原始檔和引數。

複製了一堆了,總結一下:

make介紹

make是一個構建自動化工具,會在當前目錄下尋找Makefile或makefile檔案。如果存在相應的檔案,它就會依據其中定義好的規則完成構建任務。

Makefile介紹

我們可以把Makefile簡單理解為它定義了一個專案檔案的編譯規則。藉助Makefile我們在編譯過程中不再需要每次手動輸入編譯的命令和編譯的引數,可以極大簡化專案編譯過程。同時使用Makefile也可以在專案中確定具體的編譯規則和流程,很多開源專案中都會定義Makefile檔案。

廢話不多說了,趕緊為Go專案編寫Makefile

規則概述

Makefile由多條規則組成,每條規則主要由兩個部分組成,分別是依賴的關係和執行的命令。

其結構如下所示:

[target] ... : [prerequisites] ...
<tab>[command]
    ...
    ...

其中:

  • targets:規則的目標
  • prerequisites:可選的要生成 targets 需要的檔案或者是目標。
  • command:make 需要執行的命令(任意的 shell 命令)。可以有多條命令,每一條命令佔一行。
build:
    CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o xx

示例

.PHONY: all build run gotool clean help

BINARY="myapp"

all: gotool build

build:
    CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o ${BINARY}

run:
    @go run ./

gotool:
    go fmt ./
    go vet ./

clean:
    @if [ -f ${BINARY} ] ; then rm ${BINARY} ; fi

help:
    @echo "make - 格式化 Go 程式碼, 並編譯生成二進位制檔案"
    @echo "make build - 編譯 Go 程式碼, 生成二進位制檔案"
    @echo "make run - 直接執行 Go 程式碼"
    @echo "make clean - 移除二進位制檔案和 vim swap files"
    @echo "make gotool - 執行 Go 工具 'fmt' and 'vet'"

或者

.PHONY:clean
clean:
    rm -rf *.o test

.PHONY:run
run:
    @go run ./
  • BINARY=”myapp”是定義變數。

  • .PHONY用來定義偽目標。不建立目標檔案,而是去執行這個目標下面的命令。

  • @符號就是代表執行此命令但是不用輸出該命令

  • clean命令可以看出可以支援shell命令

最近用的kratos微服務框架等也都在使用這個,先用起來在慢慢研究吧~

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章