所必须的软件:autoconf

(generate configuration script [configuration])

automake( aclocal:automatically generate

aclocal.m4 from configure.in)

m4 perl libtool(其中libtool非必须)。

autoconf是一个用于生成可以自动地配置软件源码包,用以适应多种UNIX类系统的shell脚本工具,其中autoconf需要用到

m4,便于生成脚本。automake是一个从Makefile.am文件自动生成Makefile.in的工具。为了生成Makefile.in,

automake还需用到perl,由于automake创建的发布完全遵循GNU标准,所以在创建中不需要perl。libtool是一款方便生成各种

程序库的工具。

生成Makefile的操作过程如下:

1) 运行autoscan命令

2) 将configure.scan 文件重命名为configure.in,并修改configure.in文件

$sudo mv configure.scan configure.in

3)

在project目录下新建Makefile.am文件,并在core和shell目录下也新建makefile.am文件

4) 在project目录下新建NEWS、 README、 ChangeLog 、AUTHORS文件

5) 将/usr/share/automake-1.10/目录下的depcomp和complie文件拷贝到本目录下

6) 运行aclocal命令(configure.in-->aclocal.m4)

7) 运行autoconf命令 (configure.in+aclocal.m4 -->

configuration)

8) 运行automake -a命令

(Makefile.am+configuration.in-->Makefile.in)

9) 运行./confiugre脚本

a4c26d1e5885305701be709a3d33442f.png

a4c26d1e5885305701be709a3d33442f.png

从上图中可以看出,对于用户而言,其中最主要的就是编写configuratio.in

和Makefile.am文件,首先我们来看configuration.in文件,每个configure.scan文件都是以AC_INIT开头,以AC_OUTPUT结束。我们不难从文件中看出confiugre.in文件的一般布局为:测试程序(check

for programs),测试库(libraries),测试头文件(header

file),测试类型定义(typedef),测试结构(constructure),测试编译器特性(compiler

characters),测试库函数(libraries functions);修改后的结果如下:

# -*- Autoconf -*-

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

AC_PREREQ(2.61)

#AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)

AC_INIT(test, 1.0, haizi007418@sina.com)

AC_CONFIG_SRCDIR([src/ModuleA/apple/core/test.c])

AM_CONFIG_HEADER(config.h)

# AM_INIT_AUTOMAKE(AC_PACKAGE_NAME, AC_PACKAGE_VERSION)

AM_INIT_AUTOMAKE(test,1.0)

# Checks for programs.

AC_PROG_CC

# Checks for libraries.

# FIXME: Replace `main' with a function in `-lpthread':

AC_CHECK_LIB([pthread], [pthread_rwlock_init])

AC_PROG_RANLIB #Multithread

# Checks for header files.

# Checks for typedefs, structures, and compiler characteristics.

# Checks for library functions.

# 在AC_OUTPUT输入 要创建的Makefile文件名

AC_OUTPUT([Makefile

src/lib/Makefile

src/ModuleA/apple/core/Makefile

src/ModuleA/apple/shell/Makefile

])

其中要将AC_CONFIG_HEADER([config.h])修改为:AM_CONFIG_HEADER(config.h),

并加入AM_INIT_AUTOMAKE(test,1.0);

a4c26d1e5885305701be709a3d33442f.png

最后,我们来看看Makefile.am文件,它是一种比Makefile更高层次的规则。只需指定要生成什么目标,它由什么源文件生成,要安装到什么目录等构成。表一列出了可执行文件、静态库、头文件和数据文件,四种书写Makefile.am文件个一般格式。

表 1Makefile.am一般格式

a4c26d1e5885305701be709a3d33442f.png

对于可执行文件和静态库类型,如果只想编译,不想安装到系统中,可以用noinst_PROGRAMS代替bin_PROGRAMS,noinst_LIBRARIES代替lib_LIBRARIES。

a4c26d1e5885305701be709a3d33442f.png

在Makefile.am中尽量使用相对路径,系统预定义了两个基本路径:

a4c26d1e5885305701be709a3d33442f.png

在上文中我们提到过安装路径,automake设置了默认的安装路径:

1) 标准安装路径

默认安装路径为:$(prefix) = /usr/local,可以通过./configure

--prefix=的方法来覆盖。

其它的预定义目录还包括:bindir = $(prefix)/bin, libdir = $(prefix)/lib,

datadir = $(prefix)/share, sysconfdir = $(prefix)/etc等等。

2) 定义一个新的安装路径

比如test, 可定义testdir = $(prefix)/test, 然后test_DATA =test1

test2,则test1,test2会作为数据文件安装到$(prefix)/ /test目录下。

我们首先需要在工程顶层目录下创建一个Makefile.am来指明包含的子目录,由于每个源文件都会用到相同的头文件,所以我们在最顶层的Makefile.am中包含了

编译源文件时所用到的头文件,并导出。

SUBDIRS=src/lib src/ModuleA/apple/shell src/ModuleA/apple/core

CURRENTPATH=$(shell /bin/pwd)

INCLUDES=-I$(CURRENTPATH)/src/include -I$(CURRENTPATH)/src/ModuleA/apple/include

export INCLUDES

我们将lib目录下的swap.c文件编译成libswap.a文件(只想编译,而并不想安装),被apple/shell/apple.c文件调用,那么lib目录下的Makefile.am如下所示:

noinst_LIBRARIES=libswap.a

libswap_a_SOURCES=swap.c

INCLUDES=-I$(top_srcdir)/src/includ

如果想安装,那么库将会安装到$(prefix)/lib目录下,可执行文件将会安装到${prefix}/bin,则Makefile.am如下:

bin_LIBRARIES=libswap.a

libswap_a_SOURCES=swap.c

INCLUDES=-I$(top_srcdir)/src/include

# 将swap.h安装到${prefix}/include /swap目录下

swapincludedir=$(includedir)/swap

swapinclude_HEADERS=$(top_srcdir)/src/include/swap.h

接下来,对于可执行文件类型的情况,我们将讨论如何写Makefile.am?对于编译apple/core目录下的文件,我们写成的Makefile.am如下所示:

noinst_PROGRAMS=test

test_SOURCES=test.c

# test.c文件在链接时,需要apple.o和

libswap.a文件

test_LDADD=$(top_srcdir)/src/ModuleA/apple/shell/apple.o $(top_srcdir)/src/lib/libswap.a

# Linux下的信号量/读写锁文件进行编译,需要在编译选项中指明-

D_GNU_SOURCE

test_LDFLAGS=-D_GNU_SOURCE

# test_LDFLAGS只是链接时的选项,编译时同样需要指明该选项,所以需要

DEFS来指明编译选项

# DEFS已经有初始值,所以这里用+=的形式指明。

DEFS+=-D_GNU_SOURCE

# 如果你的程序还包含其他的库,除了用AC_CHECK_LIB宏来指明外,还可以用LIBS来指明

#LIBS=-lpthread

终结

对于一个已有configure.in and Makefile.am

的源程序包,我们只需要通过执行下述命令来生成Makefile文件: aclocal ,

autoconf,automake,./configure 就可以生成Makefile文件,然后sudo make

就开始编译源程序(编译时error),最后sudo make install

安装。运行。。。。。。(可能有运行时error)!

Logo

更多推荐