标签: linux | 分类:DoxygenMakefile |
所必须的软件:autoconf(generate configuration script [configuration])
automake(
m4
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)
# -*- 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 ]) |
表 1Makefile.am一般格式
对于可执行文件和静态库类型,如果只想编译,不想安装到系统中,可以用noinst_PROGRAMS代替bin_PROGRAMS,noinst_LIBRARIES代替lib_LIBRARIES。
在Makefile.am中尽量使用相对路径,系统预定义了两个基本路径:
在上文中我们提到过安装路径,automake设置了默认的安装路径:
1) 标准安装路径
默认安装路径为:$(prefix) = /usr/local,可以通过./configure--prefix=<new_path>的方法来覆盖。
其它的预定义目录还包括:bindir = $(prefix)/bin, libdir = $(prefix)/lib,datadir = $(prefix)/share, sysconfdir = $(prefix)/etc等等。
2) 定义一个新的安装路径
比如test, 可定义testdir = $(prefix)/test, 然后test_DATA =test1test2,则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 |
noinst_LIBRARIES=libswap.a libswap_a_SOURCES=swap.c INCLUDES=-I$(top_srcdir)/src/includ |
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 |
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 |