tags: linux

Makefile是甚麼?

  • Makefile是make命令的規則配置檔案
  • 大致上說make是GNU中維護和組織程式用的

[name=Josh Ku]GNU(GNU’s Not Unix)是一個類Unix系統,目標是建立一套完全自由的作業系統(open source) Linux出現之後,與GNU結合成GNU/Linux

使用make的好處:

  • 簡化編譯時所需下達的指令
  • 可以將程式分成好幾個模組,在根據(target),規則(rule)去修改,可省去大量重複編譯的時間
  • 若在編譯完成後,修改了某個原始檔案,則make僅會針對被修改的檔案進行編譯,其他的文件不會被更動。
  • 最後可以依照相依性來更新執行檔。

使用方式:

  • 在makefile中 #代表註解
  • 需要再命令行的第一個字元
  • target 與相依檔案之間以 : 隔開

變數的使用方法

與bash shell script的語法有點不相同需要注意

  • 變數與變數內容以『=』隔開,同時兩邊可以有空格
  • 變數左邊不可以有
  • 變數與變數內容在『=』兩邊不能具有『:』
  • 運用變數時,以${變數}或$(變數)使用
  • 在指令模式也可以給予變數

變數基本賦值方法

name=Josh

Makefile 規則如下:

<target>: <prerequisites>
[tab] <commands>
  • target 目標
  • prerequisites 前置條件
  • tab command 必須由tab隔開
  • commands 只能有一行的shell

.PHONY 用法:

當我們設定的target和當前目錄下的檔名一樣的話,target會被忽略,所以我們把target都用做phony target

.PHONY: build start push

[name=Josh Ku] 表示,build start push 這3個target 不檢查當前目錄下的檔案,直接執行命令‧

範例:

NAME=JoshKU
VERSION= 1.0.0
.PHONY: build start push

build: build-version

build-version:
    docker build -t {NAME}:${VERSION} .
tag-latest:
    docker tag ${NAME}:${VERSION} ${NAME}:latest

start:
    docekr run -it --rm ${NAME}:${VERSION} /bin/bash


push: build-version tag-latest
    docker push ${NAME}:${VERSION}; docker push ${NAME}:latest

建構一個版本的映像

make build

建構完畢,執行一下映像,看內容是正確

make start

最後推送到docker倉庫

make push