新建一个简单的helloworld工程文件夹,目录结构如下
hello.h代码:
#include<stdio.h> void fprint() { printf("hello world! "); }
hello.c代码:
#include“hello.h” int main() { fprint(); return 0; }
利用AutoConf工具套件来自动生成Makefile
1. 进入helloworld/目录,运行autoscan
生成autoscan.log和configure.scan文件
2. 修改configure.scan为configure.in,并在其中添加如下语句
11行: M_INIT_AUTOMAKE(hello,1.0.0)
21行: AC_OUTPUT(Makefile)
3. 新建文件 NEWS README ChangeLog AUTHORS
NEWS: 用来记录package对用户可见的修改,最新的修改信息在top顶端,格式不固定
README: 对package的总体介绍
ChangeLog: 重要的文件,有固定格式,记录package的改动
AUTHORS: package贡献的作者,联系方式
4. 运行aclocal命令,产生文件aclocal.m4以及文件夹autom4te.cache/
5. 运行autoheader,生成config.h.in文件
6. 运行autoconf命令,生成configure二进制命令
7. 新建Makefile.am文件,并在其中添加
bin_PROGRAMS = hello
hello_SOURCES = hello.c hello.h
8. 运行automake -a 命令,生成Makefile.in文件
9. 运行./configure,生成Makefile
学习记录:
如果源文件改动后,需要重新生成configure、Makefile、可执行文件命令
方法一: 利用autoreconf命令,重新生成configure二进制文件;但不推荐此方法,因为autoreconf命令中并处理automake命令的--add-missing参数。(例子略)
方法二: 利用AM_MAINTAINER_MODE,打开configure文件的maintainer mode模式,新建bootstrap脚本
(1)在configure.in中添加:AM_MAINTAINER_MODE (这一步好像无关紧要,因为我没有做,最后也重新生成了)
(2)新建bootstrap.sh文件,代码如下图,并赋予可执行权限:chmod u+x bootstrap.sh
每当改变源代码后,./bootstrap.sh即可更新全部文件,生成新的可执行命令
网上有两篇博客很好的解释了这个过程:
http://www.cnblogs.com/iTsihang/archive/2012/12/01/2797011.html
http://blog.csdn.net/fuli1215/article/details/6399175
后面,再来分析大型工程项目以及交叉编译的项目 自动生成Makefile的过程。
自我寄语:保持每天学一点,进步一点,只有学习进步才能让无助的自己变得更好更强大!