顯示具有 makefile 標籤的文章。 顯示所有文章
顯示具有 makefile 標籤的文章。 顯示所有文章

2013年8月23日 星期五

makefile note3

關於makefile的變數assign的方式,目前看到的大概有三種,詳細資料請看 這個

第一種 simple expand variable,是使用 := 這樣的operator
舉個例子

who := mark
act :=  $(who) say
who := alice
echo $(act)

將會是 mark say,:=這種assgn的operator,如同字面上所言簡單的擴展,他一遇到該行就直接擴展並不會去查他最後是什麼樣子,如果你想要結果是 alice say的話那麼就是要使用第二種方式。

第二種 recursive expand,是使用= 這樣的operator

who = mark
act = $(who) say
who = alice
echo $(act)

這樣一來結果就會是alice say

第三種是conditional variable assginment operator,是使用?=這樣的operator
who = mark
act = $(who) say
who ?= alice
echo $(act)
嘿嘿結果是 mark say喔~ 這個operator的作用是他會檢查該變數是否有值,有值的話就不會做assign的動作

關於make,基本上似乎看官方文件就很OK了,遇到不會的符號查查官方文件大概就有解,我是看gnu make的官方文件,畢竟mingw-make我找不到相關的文件,我想大概是mingw-make就是gnu make來的吧,所以兩者差異應該不大才是。

2013年8月19日 星期一

makefile note 2

關於make的target和prerequisites是用dependency graph來做記錄的,所以像這樣的寫法

a: b.c c.c
a: d.c e.c
其實同等於
a: b.c c.c d.c e.c

他只是持續的修改dependency graph而已,但是如果是用double colon(例:a::b.c c.c)事情就會變得不一樣了,它會分別建立dependency graph,而不會append原來的。


上次說到target可以為檔名也可以不是對吧,不是檔名的target,在術語上名為phony target,其實如同字面上的意思,phony -> fake,假的target,為什麼叫做假的target? 因為這個target並非用來產生檔案的,他只是純粹執行一些shell指令,像是這樣

clean:
    rm -f *.o

如此這類的,但是呢! 當你要用來做這種事情的時候,請記得多加這一行 .phony: clean
會需要多加這行的原因是 make它是無法辨別target是要用來產生檔案或是純粹執行指令,所以要加.phony的宣告,讓make知道它是always out of date,舉個例子吧,如果今天你沒有加這行會發生什麼事呢?

當你同目錄下沒有檔案叫做clean的話那一切就會正常,always out of date,但~~~是~有的話呢!,此時你的target就會被認為是要產生檔案用的,由於clean的rule並沒有任何prerequisites所以always up to date,所以就不會被執行了。

另外make是支援自定義變數的,例如: 你宣告了 compile = g++ , 那麼當你要使用這變數時要用錢字號來取得,$(compile)這樣,make有所謂的 auto variable,詳情請見 這個
目前對這個沒太多研究,我想這個的目的大概是減少code的量,畢竟一直重複打同樣的字是一件很煩的事,像機器人的做的事就交給機器人來做吧 :)

2013年8月17日 星期六

makefile note

我一直以來其實都不怎麼想用makefile來進行編譯的工作 :( 因為實在是有太多好用的IDE了!哈哈,只是我最近常常用sublime text做為我的coding環境,但是只用它來寫python和網頁語言而已。

最近突然想到乾脆比較簡單的C++也在這環境寫好了:) 因此決定來親自碰一下這東西好了,這樣一來我只要自己寫一個subilme build的檔案,就可以按下ctrl+B進行編譯了。


如上所示!OK

 makefile的規則包括三個部份如下
  1. target
  2. prerequisite
  3. commands
target: prerequisite
[tab] commands  # [tab]表示字元\t而已

target:簡單說就是你所要建置的目標,不一定要為檔名
prerequisite:建置目標前,所需要的先決條件
commands:就是shell commands!! 記得開頭得有tab才行

ex:
cc.exe: cc.o
[tab] mingw32-g++ cc.o -o cc.exe 
cc.o: cc.cpp
[tab] mingw32-g++ cc.cpp -std=c++11 -c

然後當我在cmd中輸入mingw32-make,由於我沒給任何argument所以他會以預設得來執行,但是預設的是什麼呢? 答案就是開頭最前面的target。接下來make的分析規則大概是這樣的,先看target和prerequisite去找檔案,如果prerequisite有相關的rule存在那麼就會以他為優先去執行,另外如果prerequisite比target還要新(意思是像是進行修改),那麼就會rebuild該target。

所以,以範例為例一開始碰到cc.exe: cc.o,很好發現了cc.o有相關的rule,那就是cc.o: cc.cpp......那串,所以就會變成先優先執行這條 ,執行完後就會產生cc.o檔,然後就回去執行剛剛那條rule,最後就產生cc.exe這樣。

make是還有更多的用法的,目前這篇僅記錄最基本的法則和用法,不過印象中make不同的版本似乎會有他們獨特的用法就是了,我也不知道會不會用到那麼多 :)