automake中Makefile.am和configure.ac的格式及編譯過程

(一)寫Makefile.am

當寫完代碼之後,在代碼所在的目錄src中,編寫Makefile.am文件,其內容如下:

bin_PROGRAMS = ap_collector ap_server
#Add extra debug info for gdb
AM_CFLAGS = -ggdb
ACLOCAL_AMFLAGS = -I m4
# libnfdump sources
ipmap = ip_map.c ip_map.h
getregion = get_region.c get_region.h
pbkafka = pb_kafka.c pb_kafka.h
protobuf = proto/sflow.pb-c.c proto/sflow.pb-c.h
filelist = file_list.c file_list.h
redisclient = redis_client.c redis_client.h
parsefile = parse_file.c parse_file.h
getconfig = parse_config.c parse_config.h

ap_collector_SOURCES = $(ipmap) $(getregion) $(filelist) $(parsefile) $(redisclient) $(getconfig)
ap_collector_LDADD = -lhiredis -lmysqlclient

ap_server_SOURCES = region_aggr.c $(ipmap) $(pbkafka) $(protobuf) $(getconfig)
ap_server_LDADD = -lhiredis -lrdkafka -lprotobuf-c

其中,bin_PROGRAMS爲要生成的可執行文件名,可以爲多個。

AM_CFLAGS = -ggdb爲開啓調試。

ACLOCAL_AMFLAGS = -I m4,當使用libtoolize生成config.guess, config.sub, ltmain.sh, ltconfig時需要設置這個位置。

接下來定義源碼。每個二進制文件都有相應的源碼和所需的靜態鏈接庫。

在源碼的父目錄中,編輯Makefile.am,添加含有Makefile.am的子目錄:

ACLOCAL_AMFLAGS = -I m4
SUBDIRS = . src

(二)autoscan

在工作目錄中執行autoscan,會生成configurae.scan。修改configure.scan內容之後,命名爲configure.ac。

#                                               -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.

AC_PREREQ([2.69])
#AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS])
AC_INIT([analysis_region, 1.0.1, [email protected])
#AC_CONFIG_SRCDIR([src/pb_kafka.h])
#AC_CONFIG_HEADERS([config.h])
AM_INIT_AUTOMAKE([subdir-objects])
AC_CONFIG_MACRO_DIR([m4])

# Checks for programs.
AC_PROG_CC
AM_PROG_CC_C_O
AC_PROG_LIBTOOL
AC_SUBST(LIBTOOL_DEPS)
AC_PROG_GREP
AC_PROG_NM
AC_PROG_SED

# Checks for libraries.
# FIXME: Replace `main' with a function in `-lhiredis':
AC_CHECK_LIB([hiredis], [main])
# FIXME: Replace `main' with a function in `-lmysqlclient':
AC_CHECK_LIB([mysqlclient], [main])
# FIXME: Replace `main' with a function in `-lrdkafka':
AC_CHECK_LIB([rdkafka], [main])

# Checks for header files.
AC_CHECK_HEADERS([arpa/inet.h fcntl.h netinet/in.h stdint.h stdlib.h string.h sys/socket.h sys/time.h syslog.h unistd.h])

# Checks for typedefs, structures, and compiler characteristics.
AC_C_INLINE
AC_TYPE_INT64_T
AC_TYPE_SIZE_T
AC_CHECK_HEADER_STDBOOL
AC_TYPE_UINT16_T
AC_TYPE_UINT32_T
AC_TYPE_UINT8_T

# Checks for library functions.
AC_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK
AC_FUNC_MALLOC
AC_FUNC_MKTIME
AC_FUNC_MMAP
AC_FUNC_REALLOC
AC_CHECK_FUNCS([gettimeofday memset strchr strdup strerror strndup])

AC_CONFIG_FILES([Makefile
                 src/Makefile])
#AC_OUTPUT(Makefile src/Makefile)
AC_OUTPUT()

如上,增加一下3行內容:

AM_INIT_AUTOMAKE([subdir-objects])   #多層目錄的automake
AC_CONFIG_MACRO_DIR([m4]) #用於libtoolize

AM_PROG_CC_C_O   #子目錄的編譯

至此,configure.ac就完成了

(三)執行libtoolize

生成config.guess, config.sub, ltmain.sh, ltconfig

(四)執行aclocal

生成aclocal.m4

(五)執行autoconf

生成configure文件

(六)執行automake --add-missing

生成Makefile.in文件

(七)執行./configure --prefix=`pwd`

生成Makefile文件

(八)執行make && make install

將可執行二進制文件安裝到當前目錄的./bin/下


至此,使用autoconf和automake編譯完成,最終目錄下的文件如下圖所示:



附學習過程中參考的一篇關於autotool介紹的博客,寫得不錯:https://my.oschina.net/qihh/blog/66113

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章