一.简单的一个工程
1目录结构:testmake/src/main.c,即就只有一个源程序文件,testmake工程目录。
1.1 automake模板:
在testmake/下建立文件Makefile.am,内容为SUBDIRS=src
在testmake/src下建立文件Makefile.am,内容为
bin_PROGRAMS=testmake
testmake _sources=main.c
1.2 autoconf模板
切换到testmake目录,执行命令
autoscan
产生configure.scan
重命名:
mv configure.scan configure.in
修改
vi configure.in
修改初始化autoconf的AC_INIT项为:
AC_INIT(testmake , 0.1, 11111)
添加初始化automake的AM_INIT_AUTOMAKE项为:
AM_INIT_AUTOMAKE(testmake, 0.1);
1.3
执行aclocal
拷贝用到的宏定义
1.6
执行
autoheader
产生配置头文件的模板
1.7
touch README NEWS AUTHORS ChangLog
1.8
执行
autoconf
automake -a
产生要执行的configure文件和Makefile.in
1.9
执行./configure
参数 -prefix和 -host用于指定目录和要用的编译器
这样就自动产生了Makefile文件。
二. linux 自动项目管理automake:
2.1.必须软件:
autoconf/automake/m4/perl/libtool
autoconf:自动配置软件源码包,适应多种shell脚本工具,要用到m4
automake:Makefile.am--->Makefile.in的工具,要用到perl,由于其完全遵循GNU,故创建中不用perl
automake支持三种目录:
一是源文件,头文件,其他库文件都在当前目录中,没有子目录。
二是主要源文件在当前目录,部分功能的源文件在各自目录。
三是所有的源代码都在子目录中,顶层没有任何源文件。
2.2
configure.scan:
结构:
AC_INIT开头,
测试程序
测试函数库
测试头文件
测试类型定义
测试结构
测试编译器特性
测试库函数
测试系统调用
以AC_OUTPUT结尾,
2.3configure.in修改部分:
修改AC_INIT(**, **, **)
添加
AM_INIT_AUTOMAKE(binprigram, version)
多线程中需修改:
#FIXME:replace 'main' with a function in '-lpthread'
AC_CHECK_LIB([pthread], [main])---->AC_CHECK_LIB([pthread], [pthread_rwlock_init])
使用库时添加:AC_PROG_RANLIB
使用c++时用:AC_PROC_CXX
使用c时用:AC_PROC_CC
2.4.Makefile.am
2.4.1需要生成的文件
可执行文件:
bin_PROGRAMS=foo
foo_SOURCES=***.c
foo_LDADD=
foo_LDFLAGS=
foo_DEPENDENCIES=
静态库:
lib_LIBARIES=libfoo.a
foo_a_SOURCES=***.c
foo_a_LIBADD=
foo_a_LDFLAGS=
头文件:
include_HEADERS=foo.h
数据文件:
data_DATA=data1 data2
如果只想编译,可以用noinst_PROGRAMS和noinst_LIBARIES代替,表示不用安装到系统。
2.4.2
Makefile.am中的一些全局变量:
INCLUDES:连接是所需要的头文件
LDADD: 可执行程序连接时所需要的库文件
LDFLAGS:链接时所需要的库文件选项标志(如gcc中的:-L -I -fpic -shared)
EXTRA_DIST:源程序和默认的文件自动打入.tar.gz包
SUBDIRS:需要递归处理的子目录
LIBADD:库连接时所需要的其他库文件
LIBTOOLFFLAGS:libtool编译选项
CFLAGS/CXXFFLAGS:对应gcc中 的-o2 -g
可用的路径变量:
$(top_srcdir): 工程最顶层目录,用于引用源程序
$(top_builddir): 目标文件的最上层,用于引用.o等编译出来的目标文件
2.5编译可执行文件
bin_PROGRAM=xxx
xxx_SOURCES=***.c
xxx_LDADD =
xxx_LDFLAGS =
xxx_CFLAGS =
将除main外的函数文件编译为静态库,这样实现就简单多了
2.6库
xxx_LIBRARIES = lib***.a
lib***_a_SOURCES = ***.c
lib***_a_LIBADD =
2.7动态库
mylibdir = $libdir
mylib_PROGRAMS = libutils.so
libutils_so_SOURCES = utils.c utils.h
libutils_so_LDFFLAGS = -shared -fpic
编译为动态库,这需要将编译类型修改为LTLIBRARES,注意,automake中的LIBRARIES生成的是静态库。
同时configure.in中需要添加LT_INIT,同时去掉AC_PROG_RANLIB
注:automake内置libtool支持
2.8补充:
目录
prefix /usr/local
exec_prefix $(prefix)
bindir $(exec_prefix/bin)
libdir $(exec_prefix/lib)
includedir $(prefix)/include
noinstdir
2.8打包:
将data_DATA 打包:
dist_data_DATA = distribute_this
将foo_SOURCES不打包:
nodist_data_DATA =do-not-distribute
2.9其他一些宏:
AC_ARG_WITH
AM_CONDITIONAL
AC_ARG_ENABLE
AC_CHECK_HEADER
AC_CHECK_HEADERS
AC_CHECK_LIB
阅读(502) | 评论(0) | 转发(0) |