2013年4月22日 星期一

[Linux] Autoconf, Automake

[筆記一下自己學Autoconf, Automake這一類的GNU Build Tool。]
[2013/07/14 更新:把linker 引用libraries的順序寫得更清楚一些。]

身為常常用Linux的程式設計師兼MIS人員來說,在Linux系統上面要編譯程式是很家常便飯的事情。
最常用的指令是./configure; make; make install ,筆者稱之為「大三元」。
只是如果今天角色互換,變成我們來開發程式,並且把程式以開放原始碼的方式發送出去,該怎麼做呢?
其實上述說的大三元指令,是由GNU Build System提供的aclocal, autoconf, automake幫你產生configure script file以及對應的Makefile。
由於筆者做專案需要引用curl這個library。
石頭閒言閒語部落格提供教學雖然基本,但是又不太夠用。以下便筆記一下自己在做該專案的方式,稱不上專業,若有謬誤,敬請多多包涵。

以下分為四個步驟來解說。

一、 先前準備工作
1. 今假設你的專案名稱為project。程式碼資料夾為src
    而且我們寫了一份程式碼,放在src/add.cpp底下。
2. 先準備四個文件:AUTHORS、ChangeLog、NEWS、README
    (1) AUTHORS:寫明作者資訊。
    (2) ChangeLog:程式碼異動記錄。
    (3) NEWS:最新消息
    (4) README:軟體說明與介紹
其它像是INSTALL(軟體安裝文件)以及COPYING(版權聲明),automake時,便會幫我們自動產生。
注意!如果你用的是舊版的Linux系統(例如筆者的CentOS 5),COPYING是用GPL v2,如果是新的Linux系統,COPYING是用GPL v3。
3. 建立doc資料夾。

二、撰寫configure.ac
在產生configure之前,我們必須先準備configure.ac這個檔案。我們將檔案撰寫如下:


三、撰寫對應的Makefile.am
由於我們習慣直接在專案目錄下輸入make。其實仔細去看各個開放原始碼專案,不難發現它們都在專案資料夾底下,放置Makefile。然後再透過該Makefile撰寫的規則,進入src底下各個程式資料夾的Makefile,進行make工作。
因此,為了達成這個目的,我們也需要在專案資料夾與src資料夾各放置一個Makefile。
但是,先前提到,我們會利用automake工具達成自動產生Makefile的工作。
而此工具需要撰寫Makefile.am檔案。所以,我們在這邊就另外寫Makefile.am檔案。

1. 專案資料夾底下的Makefile.am寫法:
2. src資料夾底下的Makefile.am寫法:


請注意,由於我們要用的curl函式庫編譯參數,根據linker order這篇教學指出,gcc library引用原則:「要用到某個library的程式檔,請放在要引用的library前面(舉例來說,libcurl.so會用到libz.so,則必須寫成-lcurl -lz)」。然而,網路上有些教學會跟我們說設定LIBS跟Add_LDFLAGS都一樣,這個在本例子使用automake是嚴重錯誤的!根據我們會自動產出的Makefile,其中一行可能長成這樣子:
$(CXXLINK) $(Add_LDFLAGS) $(Add_OBJECTS) $(Add_LDADD) $(LIBS)
如果我們把上面的src/Makefile.am改寫如下:

Add_LDFLAGS = -L/usr/local/lib -lcurlpp -lcurl -lstdc++ -L/usr/lib -lcurl -ldl -lgssapi_krb5 -lkrb5 -lk5crypto -lkrb5support -lpthread -lkeyutils -lcom_err -lidn -l    ssl -lcrypto -lz -lconfig++

那麼,根據gcc library引用順序原則,-L/usr/local/lib ... 這些指令會放在你的程式碼前面,進而造成make時會有編譯錯誤的問題。

四、產生configure檔案
在進行前三步驟後,我們已經產生了AUTHORS, ChangeLogs, NEWS, README, Makefile.am, src/Makefil.am文件;建立doc資料夾等工作。接著,輸入以下指令來產生configure script:
1. aclocal:產生aclocal.m4 , autom4e.cache。以定義autoconf常用的巨集。
2. autoconf:用來產生configure、config.status文件。
3. automake --add-missing:產生Makefile.in,自動加入某些預設內容如Copy Right等。

根據以上四個步驟,我們已經做出configure script了。接著我們就可以執行configure產生Makefile,以及make編譯程式碼了。

參考資料

  1. Hello Autoconf, the GNU Build System
  2. Autoconf額外檢查函式庫
  3. Using C/C++ libraries with Automake and Autoconf
  4. Using Autotools
  5. GNU: Autoconf
  6. HowTo Autotools - Distributing source code with autoconf and automake
  7. Initializing configure
  8. aclocal
  9. Generated Output Files
  10. An Introduction to GCC - for the GNU compilers gcc and g++: Link order of libraries

沒有留言:

張貼留言