2017年12月1日 星期五

Make

Makefile 是一個歷史非常攸久的腳本程式,網路上的資源早就多到看都看不完,但每次要找相關的東西的時候還是常常找不到,所以用這篇來整理、筆記一下吧。

介紹

Makefile是一個在殼層環境(shell, ex: bash, tcsh,...)執行的程式,主要是被拿來做編譯程式碼使用,例如用Dev C++的開發環境來寫C語言,就可能會看到有個檔案叫"makefile" (介紹網址),用來幫你編譯出最終的程式。

運作概念

makefile運作(設計)的概念與一般程式、腳本程式(shell script, ex: tcsh, bash)不同,一般程式語言的執行流程多是從頭到尾,從上到下,從腳本的第一行執行到最後一行,而程式流程裡就會由流程控制的if, switch, while, for loop來控制程式碼如何執行,並透過函式(function)、任務(task)等功能來重複執行某些需要重複執行的工作。
例如流程是
==>  a產生b, a+b產生c,c*a產生d,而d是最終需要的東西。
簡單流程就會寫成:
#1 b = a
#2 c = a+b
#3 d = c*a
#4 output d

思考邏緝就是上述 ==>所寫的那樣。但makefile的邏輯是反過來看的,寫makefile注重的是"最終要的是什麼",也就是任務目標,知道任務目標後再來找尋"需要哪些東西"。
所以makefile流程會是
==> 最終要產生d,所以需要c和a,因為需要c,所以需要 a和b。所以會寫成
#1 d:   c   a
#2  target = depend1 * depend2
#3 c:   a   b
#4  target = depend1 + depend2

第一行指的是說要產生d,需要c和a,d就是目標(target);d的相依物(dependency),也就是指產生d所必要的材料,就是c和 a,然後透過第二行的步驟產生d。而第三、四行功能也類似,只是產生target所做的運算不同。
所以寫makefile基本上是以"目標"為出發點來寫的。這樣有個好處是,假如我要的最終目標是c而不是d,使用make file的話,腳本完全不用修改,只要告訴makefile說"我要的最終目標是c"那它就會去找a和b,來output c,而不像一般腳本語言的思考方式,要修改程式把最終要輸出的東西改成c。


功能整理

規則

target [target2 ... ]  : [dependency1 ... 2 ... 3 ...]   # ('#'為註解,中括號代表裡面的項目為選擇性)
(tab開頭代表指令)[@,-]command1

基本特殊變數



巨集指令


glob目標



網路資源:


2020 Pi錢包三倍券加碼回饋機制決策分析

 Pi錢包說 “ 三倍券 ” 中的 2000 元每次消費的都會獲得 p 幣加碼回饋的抽獎機會 試問消費策略?消費越多次越佳或越少次越佳?