使用GNU Autotools製作Makefile

2021-09-24 23:48:04 字數 3506 閱讀 7509

最近用了一些開源軟體,它們都有統一的安裝方法,非常方便:

./configure

make

make install

於是我也鳥槍換炮,給自己的原始碼用上了automake和autoconf。下面這張流程圖顯示了製作makefile的全過程:

autoconf工具的作用是檢查工程依賴的庫檔案和標頭檔案,同時也是automake的基礎。

首先用autoscan工具掃瞄原始碼,它會產生乙個configure.scan模板,在此基礎上我們進行修改得到configure.ca(推薦)或者configure.in(圖中是這個),這個檔案是configure的關鍵,裡面記錄了工程依賴的標頭檔案和庫檔案。下面是乙個例子:

# -*- autoconf -*- 

# process this file with autoconf to produce a configure script.

ac_prereq([2.68])

ac_init([destor_server], [1.0], [[email protected]])

am_init_automake([destor_server], [1.0]) "如要使用automake,這一句是必須的

# checks for programs.

ac_prog_cc

cflags="-g -o2"

# checks for libraries.

ac_check_lib([pthread],[pthread_create]) "檢查依賴庫檔案,在此新增依賴的庫

ac_check_lib([glib], [g_hash_table_new],[found_glib=yes],[found_glib=no])

if test "$found_glib" = "no"; then

ac_msg_error([*** working glib library not found ***])

fiac_check_lib([crypto],[sha_update],[found_crypto=yes],[found_crypto=no])

if test "$found_crypto" = "no"; then

ac_msg_error([*** working crypto library not found ***])

fiac_prog_ranlib

# checks for header files.

ac_check_headers([arpa/inet.h fcntl.h stdint.h stdlib.h string.h sys/socket.h sys/time.h unistd.h])

ac_check_headers([glib.h]) "檢查依賴的標頭檔案

if test "$found_glib_h" = "no"; then

ac_msg_error([*** working glib.h header not found ***])

fiac_check_headers([openssl/sha.h], [found_sha_h=yes],[found_sha_h=no])

if test "$found_sha_h" = "no"; then

ac_msg_error([*** working sha.h header not found ***])

fi# checks for typedefs, structures, and compiler characteristics.

ac_c_inline

ac_type_int32_t

ac_type_int64_t

ac_type_off_t

ac_type_size_t

ac_type_uint32_t

ac_type_uint64_t

ac_type_uint8_t

# checks for library functions.

ac_func_malloc

ac_output(makefile   

src/makefile

src/tools/makefile

src/index/makefile

src/job/makefile

src/storage/makefile) "需要產生makefile的位置

每個configure.ac都以ac_init開始,以ac_output結束,中間則新增需要檢查的資訊,注意不要輕易改變檢查的順序。其中最重要的幾行都用注釋標註了。現在我們擁有了乙個configure.in,接著用aclocal工具產生aclocal.m4,最後執行autoconf就得到了configure指令碼。

automake工具的輸入包括前文的configure.in和需要我們自己編寫的makefile.am,makefile.am的編寫比makefile要容易多了。下面是個例子。

bin_programs=destor_server

destor_server_sources=

destor_server_ldadd=src/libserver.a src/index/libindex.a src/storage/libstorage.a src/tools/libtools.a src/job/libjob.a

subdirs=src src/index src/job src/storage src/tools

libs=-lpthread -lcrypto -lglib

bin_programs表示我們要得到乙個可安裝(make install)的可執行檔案,它會把可執行檔案安裝到指定目錄下;如果不需要安裝,就使用noinst_programs,destor_server是可執行檔名。destor_server_sources表示其依賴的原始碼檔案,因為此目錄下沒有原始碼,我們就空著。destor_server_ldadd表示其依賴的庫檔案,後面都是工程內在各個目錄鏈結得到的庫檔案,每個目錄下都需要乙個makefile.am。subdirs表示執行此makefile前必須先完成這幾個子目錄的makefile。libs是工程依賴的庫。

子目錄內的makefile.am大同小異,這是src目錄的例子:

noinst_libraries=libserver.a

libserver_a_sources=dedup.c cfl_dedup.c server.c backup_server.c restore_server.c statistic.c jcr.c

其中noinst_libraries表示我們要得到乙個不安裝的庫檔案,libserer.a是它的名字;而libserver_a_sources是其依賴的原始碼檔案。其餘子目錄也都是這種結構,只需調整一下原始碼檔案和庫檔名稱。

建好所有makefile.am後,執行automake --add-missing得到makefile.in模板,configure將會根據這個模板產生最終的makefile。在執行automake之前,要在工程目錄下先建立news、readme、changelog、authors檔案。

大功告成!

GNU autotools 安裝和使用

2.安裝 m4 1.4.11.tar.gz autoconf 2.63.tar.gz automake 1.9.1.tar.gz 3.autotools五工具 4.autotools使用流程 第一步 手工編寫makefile.am這個檔案 第二步 在源 目錄樹的最高層執行autoscan。然後手動修...

學習GNU autotools的好資料

收集一些gnu方面的學習資料方便查詢幫助 gnu autoconf,automake and libtool automake autoconf gnu document 使用autotools生成makefile檔案入門 makefile學習與高階之makefile.am和 m 的意思 gnu a...

使用16進製制顏色值

通常情況下我們是直接使用類似於 ee1289這樣的 來直接表示rgb顏色的 uicolor colorwithred 0xee 255.0 green 0x12 255.0 blue 0x89 255.0 alpha 1 這樣呼叫真是太繁瑣了,所以封裝了乙個小方法來直接呼叫 獲取顏色 uicolor...