2019/3/27

How Make do parallel build?

最近才知道 Make 有 "-j4" 這種可以做平行編譯的指令。再驚訝之餘,問題就來了,平常 compile 時都是一個個 source 在做,到底這個指令下去後,Make 是怎麼做的呢?想了解這後面的原理,感覺很厲害。

翻開 GNU Make manual,5.4 Parallel Execution 中說 make 就是知道如何平行的執行 makefile 中的 "recipe"
GNU make knows how to execute several recipes at once. Normally, make will execute only one recipe at a time, waiting for it to finish before executing the next. However, the ‘-j’ or ‘--jobs’ option tells make to execute many recipes simultaneously.

光這樣子看還是不太清楚這是在說什麼,從這個文章(https://www.cmcrossroads.com/article/pitfalls-and-benefits-gnu-make-parallelization)看就比較清楚,就是說 Make 可以同時執行多個彼此間沒有相依關係的動作。

Make 的基本形式中,"recipe" 是我們實際要讓 Make 做的動作。通常一個 target 的動作是有先後關係的,不過因為一般 makefile 中存在不只一個 target,不同 target 間就不一定有相依關係,這時 Make 就可以同時去執行這些不相依的 target 裡的動作。
target … : prerequisitesrecipe
        …
        …