2012年9月11日 星期二

細說swig產生perl介面步驟

模組 (module)

講到 swig 在 perl 的應用就要先了解 perl 的模組,因為任何引用的行為在 perl 當中都是以模組 (module) 為單位,因此撰寫可重用的程式碼也必需循此一標準。要了解這些概念,我推薦這篇文章: module,package,use , require , BEGIN,END 全部用法攻略 。(這個網站每篇文章都值得細讀,這篇文章應是來自 http://www.tutorialspoint.com/perl/perl_modules.htm ,以駱駝書的5.2節為基礎加以改寫的)。
  1. 要講到 module,就要先講到 package; package 是處理 scope 的問題,而 module 就是單一 scope 的檔案。
  2. 取用module時的指令為 use (和require,但不常用)。要被引用的識別字需加到 @EXPORT 
  3. 最後的程式就是用 h2xs 產生模組目錄,並用 tar 打包上傳。安裝時執行 Makefile.PL 即可
  4. 在實作時,善用 Module::Starter + Module::Install 會節省不少時間。
至此講的是以perl寫模組。那以c寫模組呢?就是在下 h2xs 參數時少個 X ,這樣就出現了個 .xs 檔案可以寫 c 的宣告和定義,然後流程是一樣的。可參考 https://sites.google.com/site/squallpro/%E7%A8%8B%E5%BC%8F%E8%A8%AD%E8%A8%88/perl/c-perl/h2xs 。應用 Module::Starter 則請參考 http://c9s.blogspot.tw/2009/04/modulestarter.html

好,那麼 swig 的角色呢? 請再複習一次


  1. (從 h 檔中)找出所要包裝的函數(和 h 檔)
  2. 建立 i 檔
  3. (從 h 檔中)複製函數宣告到 i 檔中,或使用 %include指令處理整個 h 或 c 檔
  4. 確認語法合於ANSI
  5. 如果不是直接引入 h 檔,請確認宣告的型態順序正確,以使介面可以順利編譯
  6. 將main()函數改名(但函式庫中應該不會有這個函數)
  7. 執行swig並編譯

(可參 http://stuff.mit.edu/afs/athena/astaff/project/svn/src/swig-1.3.25/Examples/perl5/class/index.html 。呼叫上可參此頁中"Key points"那段。)

歸納起來模組在perl中有三種編譯方式;

第一種是原生的呼叫gcc

第二種編譯方式是利用 h2xs (背後其實用了 ExtUtils::MakeMaker 來產生Makefile.PL),在 http://fans.huhoo.net/perlxs/perlxs.doc  有更深入的介紹

perl Makefile.PL
make
make install

上述兩種編譯的方法中,有人討論過與swig的搭配,請見以下兩串討論串,正解在第二串,但整個thread已吵得雞飛狗跳...( 因h2xs預設產生了 Makefile.PL,大家想當然爾認為swig該當如此)據該thread作者所言,在 http://www.swig.org/tutorial.html 上的編譯方式因此而更新;為維持可攜性,第二種編譯方式(使用MakeMaker)仍然是比較多人擁戴的
http://www.perlmonks.org/?node_id=895499
http://www.perlmonks.org/?node_id=895682
第三種是利用 Model::Starter;官方建議的MakeMaker已經有十多年的歷史了,較新的解決方案是 Module::Starter + Module::Install 。可以參考 http://c9s.blogspot.tw/2009/04/modulestarter.html 中的說明。但是沒人討論過與swig的搭配,或許是因為太前衛了 XD

沒有留言:

張貼留言