Automake生成Makefile过程简介
2016-04-12 16:11
411 查看
Automake支持三种目录层次:flat,shadow,deep
1.flat 所有的源文件及相关文件都放在顶层目录中。
2.shadow 主要的源文件存放在顶层目录中,其它的存放在各个子目录中。
3.deep 所有的源文件都分别存放在各个子目录中。
我的程序用了deep模式,所有的源文件都放在了src目录中。下面写一下automake生成Makefile的步骤:
1.运行autoscan命令,生成configure.scan。
configure.scan就是configure.in的模板,对它做一些修改,然后改名为configure.in或者configure.ac就可以了(新版本的automake好像是configure.ac)。
configure.in:
AC_INIT宏以任何一个源文件作为参数,它只是检查这个源文件的存在,也说意味着着源文件所在的目录存在
AM_INIT_AUTOMAKE 增加了几个标准的检查,它以程序名称和版本号作为参数
AC_PROG_CC 指出源代码可能是用C写的,如果源代码是用C++写的我们就需要AC_PROP_CXX
AC_PROG_INSTALL 会生成一个install目录文件,这样用户就可以通过输入“make install”来安装这个软件
AC_OUTPUT 指出将会生成的Makefile文件的名字
AC_CONFIG_HEADER 表示将会使用config.h文件,autoconf需要一个config.h.in文件,用它来生成config.h,config.h.in可以通过autoheader工具生成
AM_PATH_GTK_2_0(,,AC_MSG_ERROR(openfetion 0.1 needs GTK+ 2.0))
AM_PATH_XML2(,,AC_MSG_ERROR(openfetion 0.1 needs LIBXML2)) 这两句话检查系统中是否安装了程序所需要共享库, GTK+2.0和libxml2,这两个库在安装的时候分别安装了AM_PATH_GTK_2_0和 AM_PATH_XML2这两个宏,所以可以用这种方法检测,如果系统中没有安装libxml2,configure脚本就会执行失败,并报错:openfetion 0.1 needs LIBXML2
关于library的检查可参见文章:Using C/C++ libraries with Automake and Autoconf
其它的就不详细说了,需要的时候可以谷歌。
2.在顶层目录中创建一个Makefile.am,在其它各级需要的子目录中也创建Makefile.am。
我的顶层目录Makefile.am中只有下面几句话:
src目录下的Makefile.am文件:
3.生成GNU风格的项目时需要在顶层目录中你创建NEWS、 README、 ChangeLog 、AUTHOR这几个文件。
touch NEWS README ChangeLog AUTHOR
如果不需要生成GNU风格的项目就不需要创建这几个文件,而是需要在Makefile.am中加入
AUTOMAKE_OPTIONS = foreign
这是执行automake命令时的选项
4.执行aclocal。
由configure.in生成aclocal.m4
5.执行autoconf
由configure.in和aclocal.m4生成configure脚本
6.执行automake
由Makefile.am和configure.in生成各级目录下的Makefile.in
./configure执行的时候会扫描各个目录下的Makefile.in生成不同的Makefile。然后就可以执行make和make install了
GNU Automake工具集的功能远不止这些,我了解地也不够深刻,继续学习。
转载自basic coder
本文链接地址: http://basiccoder.com/automake-introduction.html
1.flat 所有的源文件及相关文件都放在顶层目录中。
2.shadow 主要的源文件存放在顶层目录中,其它的存放在各个子目录中。
3.deep 所有的源文件都分别存放在各个子目录中。
我的程序用了deep模式,所有的源文件都放在了src目录中。下面写一下automake生成Makefile的步骤:
1.运行autoscan命令,生成configure.scan。
configure.scan就是configure.in的模板,对它做一些修改,然后改名为configure.in或者configure.ac就可以了(新版本的automake好像是configure.ac)。
configure.in:
AC_INIT(src/openfetion.cpp) AM_INIT_AUTOMAKE(openfetion,0.1) AM_CONFIG_HEADER(config.h) AM_PATH_GTK_2_0(,,AC_MSG_ERROR(openfetion 0.1 needs GTK+ 2.0)) AM_PATH_XML2(,,AC_MSG_ERROR(openfetion 0.1 needs LIBXML2)) AC_PROG_CC AC_PROG_CXX AC_PROG_INSTALL AC_OUTPUT(src/Makefile)
AC_INIT宏以任何一个源文件作为参数,它只是检查这个源文件的存在,也说意味着着源文件所在的目录存在
AM_INIT_AUTOMAKE 增加了几个标准的检查,它以程序名称和版本号作为参数
AC_PROG_CC 指出源代码可能是用C写的,如果源代码是用C++写的我们就需要AC_PROP_CXX
AC_PROG_INSTALL 会生成一个install目录文件,这样用户就可以通过输入“make install”来安装这个软件
AC_OUTPUT 指出将会生成的Makefile文件的名字
AC_CONFIG_HEADER 表示将会使用config.h文件,autoconf需要一个config.h.in文件,用它来生成config.h,config.h.in可以通过autoheader工具生成
AM_PATH_GTK_2_0(,,AC_MSG_ERROR(openfetion 0.1 needs GTK+ 2.0))
AM_PATH_XML2(,,AC_MSG_ERROR(openfetion 0.1 needs LIBXML2)) 这两句话检查系统中是否安装了程序所需要共享库, GTK+2.0和libxml2,这两个库在安装的时候分别安装了AM_PATH_GTK_2_0和 AM_PATH_XML2这两个宏,所以可以用这种方法检测,如果系统中没有安装libxml2,configure脚本就会执行失败,并报错:openfetion 0.1 needs LIBXML2
关于library的检查可参见文章:Using C/C++ libraries with Automake and Autoconf
其它的就不详细说了,需要的时候可以谷歌。
2.在顶层目录中创建一个Makefile.am,在其它各级需要的子目录中也创建Makefile.am。
我的顶层目录Makefile.am中只有下面几句话:
1 2 3 4 5 6 7 8 9 10 | #子目录变量,用于递归处理各级子目录 SUBDIRS=src #安装路径,可使用./configure --prefix=/usr/local/openfetion修改 prefix=/usr/local #数据文件的安装路径 datadir=$(prefix)/skin #数据文件的具体内容,这里的意思是要将skin目录下的所有文件安装到/usr/local/skin中 data_DATA=skin/* #程序打包时要加入的其它文件,使用make dist生成tar.gz文件时会放进去的东西 EXTRA_DIST=skin |
1 2 3 4 5 6 7 8 9 1011 | #libxml2 , GTK+2.0和GThread-2.0的cflags和libs #libxml2安装了xml2-config脚本,GTK+2.0和GThread-2.0安装了.pc pkg-config文件 AM_CPPFLAGS=`xml2-config --cflags` `pkg-config --cflags gtk+-2.0 gthread-2.0` AM_LDFLAGS=`xml2-config --libs` `pkg-config --libs gtk+-2.0 gthread-2.0` #预定义的目录,prefix已经说过了 prefix=/usr/local #这个是可执行文件安装的目录 bindir=$(prefix)/bin #这个是自定义的目录,用来安装包含协议实现部分的静态库的 slibdir=/usr/lib #编译生成可执行文件名称 bin_PROGRAMS=openfetion #这里必须以上一步定义的名称为前缀,编译openfetion所需要的源文件 openfetion_SOURCES=openfetion.cpp fetion_ui.cpp ... login_ui.cpp #编译openfetion所需要的库文件,libfx.a是我事先编译好了的。 openfetion_LDADD=libfx.a #这个变量前面也说了,要把下面这些文件打包放到tar.gz中 EXTRA_DIST= fetion_ui.h main_ui.h .... libfx.a #要安装的头文件,执行完make install后,这些文件将被安装到/usr/include里面 include_HEADERS= fgroup.h flogin.h ... common.h #自定义目录的数据文件,执行完make install后,这个文件就会被安装到/usr/lib里面 slib_DATA=libfx.a |
touch NEWS README ChangeLog AUTHOR
如果不需要生成GNU风格的项目就不需要创建这几个文件,而是需要在Makefile.am中加入
AUTOMAKE_OPTIONS = foreign
这是执行automake命令时的选项
4.执行aclocal。
由configure.in生成aclocal.m4
5.执行autoconf
由configure.in和aclocal.m4生成configure脚本
6.执行automake
由Makefile.am和configure.in生成各级目录下的Makefile.in
./configure执行的时候会扫描各个目录下的Makefile.in生成不同的Makefile。然后就可以执行make和make install了
GNU Automake工具集的功能远不止这些,我了解地也不够深刻,继续学习。
转载自basic coder
本文链接地址: http://basiccoder.com/automake-introduction.html
相关文章推荐
- ,怎么获得数据库表结构。
- 安卓开发——问题:ScrollView中嵌套ListView时,listview只显示一行
- 【mount】挂载:将新的文件系统关联至当前根文件系统
- 查看服务器当前网络使用情况实用工具nload
- Android 源码集合
- 《Spark MLlib 机器学习》第二章代码
- 反射学习总结
- JDBC之向数据库中插入图片
- 迭代服务器与并发服务器
- Android-ClockView
- 问题error C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. 的解决
- android shape的使用
- java学习 集合之arrayList
- Div+css中ul ol li dl dt dd使用
- lcm——hdu2028
- automake工具集使用
- DNS 配置详解
- ubuntu自启动默认登录(不需要输入密码)
- 直接插入排序
- 【mknod】创建一个设备文件