Automake
时间:2010-08-25 来源:tempname2
本来已经接受了在Linux中用Make构建程序,虽然不及VC中那个“惊叹号”那么方便,要说麻烦也不至于麻烦到哪去。何况复杂一点的程序肯定是要用Makefile的。
前一段时间得知Stallman还有XEmacs作者因为工作时间太长按键过度而使手指受到损伤。据说医生告诫Stallman“如果还不休养以后就永远不能敲键盘了”。我相信工作时间过长是主要原因,而使用Emacs无疑使情况雪上加霜。据此,我决定转向Vi。
适应了几天,发现Vi也挺方便。
整个暑假没有写一行代码,于是思索趁最后几天写一个词法分析器。刚刚写完一个测试程序,预备写Makefile时,隐约想起Vi的TAB好像有点问题。用VI写Makefile岂不是很麻烦。于是去寻求自动生成Makefile的方法。关于方面,当然听过Automake。Google一下,资料还是很多的,但是无一例外的复杂,IBM网站上的那个尤甚。综合各个网页,尝试了一个多小时,还是不能成功。继续Goole,找到了法国某大学助教做的幻灯片。虽然有五百多张,幻灯片的一页的内容不多,看起来还是很快的。开始看这个幻灯片的时候,觉得它走的是另一个极端:网上那些个教程一个劲的给步骤,又不跟你把整个过程的来龙去脉说清楚;这个幻灯片把整个过程的工作原理讲的非常清楚,但又不给出一步步的操作。
看第二遍的时候才发现是我误会了,作者在中途给了个Hello,World的例子。看了这个Hello,World的例子,我一下子觉得Automake很简单,完全没有那些网页写的那样复杂。可能是因为作者在之前把工作原理讲的很清楚的原因吧。
据那个幻灯片所说,只需要写两个文件,接着autoreconf --install即可生成configre文件。下来的操作就很熟了,搞LFS时做了百把遍。所需要的两个输入文件是configure.ac与Makefile.am。关于第一个文件,网页上普遍的说法是用autoscan生成。autoscan得到的是configure.scan,将其重命名为configure.ac,然后修改其中的内容。最初在网上搜到这些内容时,第一感觉:太扯淡了,哪有这种事。重命名加改内容,太强大了。
幻灯片里提到了autoscan,称其作用为“Scan sources for common portability problems,
and related macros missing from congure.ac”,但并没有用autoscan去生成configure.scan,而是直接用手写configure.ac与Makefile.am。由于幻灯片已经介绍了M4,还讲了几个简单的例子,还直接了当地说autoconf就是个加强版的M4,再看configure.ac的内容就好理解多了。configure.ac就是一些宏内容,由autoconf展开成脚本。
自顶而下看整个过程,主要步骤是:
make根据Makefile构建程序
Makefile由configure从Makefile.in中生成
configure由autoconf从configure.ac中生成
configure.ac是我们手写的
Makefile.in由automake从Makefile.am、configure.ac生成
Makefile.am、configure.ac是我们手写的
也就是说,我们用autoconf生成configure,用auotmake生成Makefile.in。最后安装时,./configure就可以根据Makefile.in生成Makefile。最后再make之。整个过程仅需要我们写两个文件:configure.ac与Makefile.am。我们平时构建程序只要写一个Makefile即可,其实这里的Makefile.am就是我们在Makefile里写的内容,但是它只给出构建信息,不包含动作。具体来说里面写了生成的是什么类型的文件(可执行、静态库、动态库),生成的文件安装时放到哪个目录(大概以此决定make install时产生什么行为),生成的文件需要哪些源文件(就是makefile里的依赖)。而configure.ac主要是配置需要检查的内容,比如说程序中使用的某头文件,configure.ac里就可以要求检查一下安装程序的系统里有没有这个头文件,也就是我们./configure时看到的N多"Checking for"。其实平时写些小程序根本用不到什么稀奇古怪的东西,更重要的是,我们写的程序根本无意发布,要么是练练手要么是自己的用,这种检查没有意义。
总而言之,Automake,Autoconf等貌似是为了考虑可移植性而设计一个动态生成Makefile的东西。我们把构建程序的信息写在Makefile.am中,把依赖于系统的信息(库文件,头文件,编译器等)写在configure.ac中。然后由Autoconf与Automake生成configure文件与“Makefile模板”文件。后面的事,我们安装软件的时候都看到了。这其中的过程还挺复杂的,按幻灯片上的步骤,只要写好了configure.ac与Makefile.am,然后执行autoreconf --install。Autoreconf会照顾好一切,按顺序调用该运行的程序做该做的事,像GCC一样,只是个前端而已。
忙活了半天,结果发现这根本不是我要的结果,真是悲剧。
更悲剧的是,我又隐约想起Vi的TAB应该没什么问题。于是试用Vi写个Makefile,TNND,一点问题也没有......
前一段时间得知Stallman还有XEmacs作者因为工作时间太长按键过度而使手指受到损伤。据说医生告诫Stallman“如果还不休养以后就永远不能敲键盘了”。我相信工作时间过长是主要原因,而使用Emacs无疑使情况雪上加霜。据此,我决定转向Vi。
适应了几天,发现Vi也挺方便。
整个暑假没有写一行代码,于是思索趁最后几天写一个词法分析器。刚刚写完一个测试程序,预备写Makefile时,隐约想起Vi的TAB好像有点问题。用VI写Makefile岂不是很麻烦。于是去寻求自动生成Makefile的方法。关于方面,当然听过Automake。Google一下,资料还是很多的,但是无一例外的复杂,IBM网站上的那个尤甚。综合各个网页,尝试了一个多小时,还是不能成功。继续Goole,找到了法国某大学助教做的幻灯片。虽然有五百多张,幻灯片的一页的内容不多,看起来还是很快的。开始看这个幻灯片的时候,觉得它走的是另一个极端:网上那些个教程一个劲的给步骤,又不跟你把整个过程的来龙去脉说清楚;这个幻灯片把整个过程的工作原理讲的非常清楚,但又不给出一步步的操作。
看第二遍的时候才发现是我误会了,作者在中途给了个Hello,World的例子。看了这个Hello,World的例子,我一下子觉得Automake很简单,完全没有那些网页写的那样复杂。可能是因为作者在之前把工作原理讲的很清楚的原因吧。
据那个幻灯片所说,只需要写两个文件,接着autoreconf --install即可生成configre文件。下来的操作就很熟了,搞LFS时做了百把遍。所需要的两个输入文件是configure.ac与Makefile.am。关于第一个文件,网页上普遍的说法是用autoscan生成。autoscan得到的是configure.scan,将其重命名为configure.ac,然后修改其中的内容。最初在网上搜到这些内容时,第一感觉:太扯淡了,哪有这种事。重命名加改内容,太强大了。
幻灯片里提到了autoscan,称其作用为“Scan sources for common portability problems,
and related macros missing from congure.ac”,但并没有用autoscan去生成configure.scan,而是直接用手写configure.ac与Makefile.am。由于幻灯片已经介绍了M4,还讲了几个简单的例子,还直接了当地说autoconf就是个加强版的M4,再看configure.ac的内容就好理解多了。configure.ac就是一些宏内容,由autoconf展开成脚本。
自顶而下看整个过程,主要步骤是:
make根据Makefile构建程序
Makefile由configure从Makefile.in中生成
configure由autoconf从configure.ac中生成
configure.ac是我们手写的
Makefile.in由automake从Makefile.am、configure.ac生成
Makefile.am、configure.ac是我们手写的
也就是说,我们用autoconf生成configure,用auotmake生成Makefile.in。最后安装时,./configure就可以根据Makefile.in生成Makefile。最后再make之。整个过程仅需要我们写两个文件:configure.ac与Makefile.am。我们平时构建程序只要写一个Makefile即可,其实这里的Makefile.am就是我们在Makefile里写的内容,但是它只给出构建信息,不包含动作。具体来说里面写了生成的是什么类型的文件(可执行、静态库、动态库),生成的文件安装时放到哪个目录(大概以此决定make install时产生什么行为),生成的文件需要哪些源文件(就是makefile里的依赖)。而configure.ac主要是配置需要检查的内容,比如说程序中使用的某头文件,configure.ac里就可以要求检查一下安装程序的系统里有没有这个头文件,也就是我们./configure时看到的N多"Checking for"。其实平时写些小程序根本用不到什么稀奇古怪的东西,更重要的是,我们写的程序根本无意发布,要么是练练手要么是自己的用,这种检查没有意义。
总而言之,Automake,Autoconf等貌似是为了考虑可移植性而设计一个动态生成Makefile的东西。我们把构建程序的信息写在Makefile.am中,把依赖于系统的信息(库文件,头文件,编译器等)写在configure.ac中。然后由Autoconf与Automake生成configure文件与“Makefile模板”文件。后面的事,我们安装软件的时候都看到了。这其中的过程还挺复杂的,按幻灯片上的步骤,只要写好了configure.ac与Makefile.am,然后执行autoreconf --install。Autoreconf会照顾好一切,按顺序调用该运行的程序做该做的事,像GCC一样,只是个前端而已。
忙活了半天,结果发现这根本不是我要的结果,真是悲剧。
更悲剧的是,我又隐约想起Vi的TAB应该没什么问题。于是试用Vi写个Makefile,TNND,一点问题也没有......
相关阅读 更多 +