这个东西的战略意义大于实际意义,嗯,还是从一个简单的例子开始作介绍,从写一个自己的HelloWorld程序开始:
- 查看自己的automake有木有安装,aclocal --version; autoconf --version; automake --version,没有的话,装一个
- 新建一个文件夹test,在该文件夹下写一个hello world的程序
保存为helloWorld.cpp#include <iostream> using namespace std; int main() { cout<<"hello world"<<endl; return 0; }
- 执行autoscan,生成一个configure.scan的文件
文件的内容如下:
# -*- Autoconf -*- # Process this file with autoconf to produce a configure script. AC_PREREQ([2.69]) AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS]) AC_CONFIG_SRCDIR([helloWorld.cpp]) AC_CONFIG_HEADERS([config.h]) # Checks for programs. AC_PROG_CXX # Checks for libraries. # Checks for header files. # Checks for typedefs, structures, and compiler characteristics. # Checks for library functions. AC_CONFIG_FILES([Makefile]) AC_OUTPUT
现在修改这个文件,简单说说这个文件的前几行:第一行表示autoconf的版本必须达到2.69,第二行需要自己修改一下,第一个参数填写自己想要生成的软件包的名字,这里可以叫做HELLO,第二个参数填写你的软件包的版本,这里填写为1.0,最后一个参数是如果别人使用你的软件,发现bug的报告地址,填上自己的邮箱即可,例如:
第三行是代码文件的地址,在这里可以不做修改;第四行是是否生成config.h,会生成一些configure.in生成的宏,只有在需要这些宏的情况下可以保留;AC_INIT([HELLO], [1.0], [yaolu1103@gmail.com])
基本的应用这些就够了,但是我们还需要添加一行:
AM_INIT_AUTOMAKE(HELLO, 1.0)
现在修改过后的configure.scan文件大概长得是这样的:
# -*- Autoconf -*- # Process this file with autoconf to produce a configure script. AC_PREREQ([2.69]) AC_INIT([HELLO], [1.0], [yaolu1103@gmail.com]) AC_CONFIG_SRCDIR([helloWorld.cpp]) AM_INIT_AUTOMAKE(HELLO, 1.0) AC_CONFIG_HEADER([config.h]) # Checks for programs. AC_PROG_CXX # Checks for libraries. # Checks for header files. # Checks for typedefs, structures, and compiler characteristics. # Checks for library functions. AC_CONFIG_FILES([Makefile]) AC_OUTPUT
将configure.scan重命名为configure.in。 - 如果header没有注释,需要执行autoheader,否则跳过此步
- 书写Makefile.am文件:
AUTOMAKE_OPTIONS=foreign bin_PROGRAMS=HelloWorld HelloWorld_SOURCES=helloWorld.cpp
- 执行aclocal,完成之后再执行autoconf,最后执行automake --add-missing
- 剩下的就和安装GNU的软件过程一样啦,./configure && make
基本的使用就是这样,最后,还能使用make dist命令给自己HelloWorld软件打个包,很有成就感~
后续需要学习构建更为复杂一些的automake,根据多个模块生成自己的软件,且听下回分解。
参考链接: