TAG

首都機能移轉 (2) 歌詞 (2) 靠北文 (40) 戲言 (30) 糟糕 (7) ACG (23) Assembly (2) Boost (2) C (31) C++ (69) CMake (4) CSIE (67) Debian (34) Design_Pattern (2) Django (1) Eclipse (1) en_US (13) FFmpeg (3) FoolproofProject (26) FreeBSD (2) Git (4) GNU_Linux (65) IDE (5) Java (11) JavaScript (19) KDE (15) Khopper (16) KomiX (3) Kubuntu (18) Life (1) Lighttpd (2) Mac_OS_X (2) Opera (1) PHP (2) PicKing (2) Programing (21) Prolog (1) Python (7) QSnapshot (2) Qt (30) Qt_Jambi (1) Regular_Expression (1) Shell_Script (7) Talk (98) VirtualBox (7) Visual_Studio (13) Windows (18) zh_TW (36)

2007年8月20日 星期一

如何寫作makefile

在Unix系統上編譯tarball時,通常需要三步驟:
./configure
make
make install
這中間的make指令便是利用makefile來處理編譯步驟。
Makefile的概念非常像是批次檔,但是它有更強大的能力。
make會查閱每一步驟所需要的檔案,如果沒有便執行指令以產生該檔案,如果已經是最新狀態,就直接跳到下個步驟。撰寫者只要了解原始碼的編譯步驟,就可以依序寫好指令,如此只要有Makefile,不管是誰只要鍵入make就可以成功編譯出檔案。
以最簡單的單一檔案來說,編譯指令應該如下:
gcc helloworld.c -o helloworld
這樣會把helloworld.c編譯為helloworld這個執行檔。
而若要寫為makefile,可以這麼寫:
all: helloworld
	gcc helloworld.c -o helloworld
檔名存為Makefile或是makefile都可以[?],這就是最簡單的makefile。
上面的意義為,要完成all這個目標,需要helloworld這個檔案,如果找不到它,就執行gcc helloworld.c -o helloworld這個指令。
注意,all是個關鍵字,良好的makefile都要有一個all,因為這是預設執行目標。
且一定要用tab縮排,否則它不會認目標底下的指令。換行符號也請用Unix的換行符。
若是要編譯多個檔案呢?比方說現在有三個檔案:application.c, interface.h, implementation.c,application.c引用了interface.h的函式,而implementation.c則是interface.h的實作。
先來看一下平常編譯該怎麼編:
gcc -c application.c
gcc -c implementation.c
gcc implementation.o application.o -o result
這樣編譯出來的result就是可執行檔。
所以來整理一下:result檔需要implementation.o和application.o這兩個檔案,而這兩個檔案分別需要implementation.c和application.c,如此一來就會變成:
all: result
result: implementation.o application.o
	gcc implementation.o application.o -o result
implementation.o: implementation.c
	gcc -c implementation.c
application.o: application.c
	gcc -c application.c
意即:欲完成all需要先完成result目標,欲完成result需要先完成implementation.o和application.o這兩個目標,而要達成implementation.o和application.o則分別需要implementation.c和application.c這兩個檔案。
你也可以選擇只執行其中一個目標,像是make application.o就只會產生application.o檔。
總而言之,makefile的基本型式是:
target: required file or target
	commands to complete this target
底下不限定有多少行指令,只要有用tab縮排即可。
而且目標也不一定要有前置目標,如果執行的目標沒有前置目標的話,代表目標底下的命令一定會執行。
如果你覺得太長,想省略一點,也可以用萬用符號[?]
all: result
result: *.o
	gcc *.o -o result
*.o: *.c
	gcc -c *.c
這個版本可以跟上面的版本達到相同的效果,不過當然有點危險就是了。
當然不只能用來編譯,也許你會希望能夠有清掉過程檔的功能:
all: result clean
result: *.o
	gcc *.o -o result
*.o: *.c
	gcc -c *.c
clean:
	rm -f *.o
這樣在下完make之後會立刻把所有的.o檔清除,或是也可以用make clean除掉。
也許你在編譯完成之後都會執行一次該程式來測試,那麼也可以這麼寫:
all: result clean
result: *.o
	gcc *.o -o result
*.o: *.c
	gcc -c *.c
clean:
	rm -f *.o
test: result input.txt
	./result <input.txt
如此只要輸入make test就會自動執行測試。
當找不到input.txt時,make會自動停止並回報錯誤,因為文件中找不到如何生成input.txt的資訊。
儘管make沒有明定什麼目標該做什麼事,但是在約定成俗的目標上,請按照慣例:
make all要用來生成所有程式。
make install要用來安裝程式。
make clean要用來清除暫時檔。
其他經常用的目標也請不要逆天。
當然這只是最最簡單的makefile,其他如關鍵字聲明之類的,可以去翻make的文件;而automake這套程式可以幫助你生成大型專案的makefile,不過我笨,不會用(汗)。

2007年8月17日 星期五

定Interface果然很不簡單

最近弄個Library就改了好幾次interface...實在是太不健康了
這也證明我的OOP功力不夠
看來還要多練練怎麼定制一個好的API

2007年8月15日 星期三

RubyText (library) 2.3.1 released

Downdoad:

License:

LGPL

Release Note:

  • 2.2.0:
    • Interface changed: 所有功能歸類至RubyText底下:
      • RubyText.generate( string ):創造<ruby>標籤
      • RubyText.restore( string ):移除<ruby>標籤
      • RubyText.clear( string ):移除注音文字
  • 2.2.1:
    • Core improved: 改變尋找子字串方式,現在所有功能都不再依賴其他函式庫。
  • 2.2.2:
    • Bugfix: 修正有可能對非字串元素做處理的問題。
    • Bugfix: 修正此函式庫不使用在網頁上時的通用性問題。
    • Core improved: 改進尋找子字串方式。
  • 2.3.0:
    • Interface changed: 所有正則表達式濾鏡獨立到RubyText.Filter底下,再以語系分類:
      • RubyText.Utility:通用性濾鏡
        • RubyText.Utility.RubyTag:取出<ruby><rb><rp><rt>及其結尾標籤
      • RubyText.Japanese:日文專用濾鏡
        • RubyText.Japanese.KanjiWithHiragana:取出標示平假名的漢字組,格式為「漢字(ひらがな)」
        • RubyText.Japanese.HiraganaRT:取出在半形括號內的平假名,格式為「(ひらがな)」
  • 2.3.1:
    • Bugfix: 修正在IE中運行不正常問題

2007年8月13日 星期一

IE socks...

之前就為了IE一個調CSS調到快瘋掉
沒想到剛才改JavaScript又給我碰到一件鳥事...

由於測試時不管怎麼按IE都沒反應
還以為我有什麼地方寫錯了
結果竟然是IE不支援application/javascript這個MIME type
非得用過時的text/javascript才能執行....

某個角度來說,IE還真是讓我大開眼界....

2007年8月12日 星期日

やっちゃたぜ!

昨天又不小心把伺服器玩爆了....
才剛回來又出包,真茶包的咧!

好吧,反正硬碟有分好,/var和/home應該都沒事
回去再重灌吧....

2007年8月11日 星期六

Ruby Tag Auto Creator 2.1.0.0 released!

Link:

Ruby Tag Auto Creator 2.1.0.0

Release Note:


Library:

  • 更改genRubyTag(), delRubyTag(), delRubyText()的行為,使它們在找不到目標時回傳null,而不會彈出任何信息。
  • 變更rubytext.css的載入方式,rubytext.js不再負責CSS的路徑。請在要使用的網頁的<head>裡加入:
    <link rel="alternate stylesheet" id="RubyText" type="text/css" href="YOUR rubytext.css PATH" />
    <script type="text/javascript" src="YOUR rubytext.js PATH"></script>
    紅標的地方是一定要遵守的,另外,CSS的載入也必須在JavaScript之前。

Page interface:

  • 將所有網頁元件純粹化。
  • 版面設計更動,特別感謝魏藥的大力協助與測試。

Caution:

Safari 2由於其本身若干BUG,如有必要請使用Safari 3 beta以得到最佳效果。

我說你們啊....

要轉載別人空間的東西也給我打一下招呼吧?
一聲不響地就貼別人的連結,想貼的給我自己找空間!
或是我也可以考慮ban掉大陸的IP...

2007年8月9日 星期四

刪除所有子目錄底下的同類檔案

今天在寫Java的makefile的時候,在clean這個項目上遇到了困難。
主要是Java的package一定要用子目錄裝,但是rm -rf *.class這個指令只會把當前目錄的*.class檔刪除而已。

經過一陣子的google之後,發現原來要這麼使:
find . -name "*.class" | xargs rm -f
雖然也可以用find自己的參數-exec,寫成這樣:
find . -name "*.class" -exec rm -f {} \;
不過前者明顯好看很多,而且據說效能也比較好[?]

2007年8月1日 星期三

Ruby text auto creater 2.0.0.0 released

這是啥鬼?
其實就是我將近半年前做的東西
Ruby Tag Auto Creator 2.0.0.0

Release Note:

  1. 真正處理ruby text的部分與網頁分離,函式庫己獨立。
  2. 以CSS實作ruby text呈現,並因應browser不同動態載入CSS;Opera目前未實作、Konqueror無法實作。
  3. 主頁介面更動
  4. 版號系統變更:LibraryMainVersion.LibraryMinorVersion.LibraryPatchVersion.PageChangeVersion

Function Library
Ruby text CSS

API:

Rubytext.Version:

Library的版本。

Rubytext.URL:

rubytext.css的URL,請照實填寫。

genRubyTag( string ):

對string加入ruby tag並回傳。
若是無法處理,彈出警告視窗且不做任何更動,回傳string。

delRubyTag( string ):

將string中已加入的ruby tag刪除後回傳。
若是無法處理,彈出警告視窗且不做任何更動,回傳string。

delRubyText( string ):

刪除string中的ruby text(半形括弧中的假名)並回傳。
若是無法處理,彈出警告視窗且不做任何更動,回傳string。