Autotools 是一个工具集,可以自动生成 Makefile 文件。Ubuntu 如果没有安装 Autotools ,需要执行 sudo apt-get install autoconf automake 进行安装,其他发行版类似。
在体验 Autotools 之前先创建一个简单的 helloworld 程序:
//helloworld.c
#include
#include
int main(void)
{
double sec;
struct timeval tv;
gettimeofday(&tv, NULL);
sec = tv.tv_sec;
sec += tv.tv_usec/1000000.0;
printf ("hello word!\nsec = %e\n", sec);
return 0;
}
接下来是用 Autotools 为一个简单的程序 helloworld.c 生成 Makefile 文件的过程:
1. 用 autoscan 生成 configure.scan 文件:
进入 helloworld.c 所在的文件夹,执行:
autoscan
这样会得到 configure.scan 文件,这个文件可以修改为 configure.in 。而 configure.in 是 Autoconf 必须的东西,里面包含了一些宏的调用,可以测试系统里存在的和可以使用的包。
在这里 helloworld 的例子里,把 configure.scan 修改为 configure.in 只要修改三行,第一行是修改的,后面两行直接添加:
AC_INIT(helloworld.c)
AM_INIT_AUTOMAKE(helloworld,1.0)
AC_CONFIG_FILES([Makefile])
AC_INIT 宏用来定义软件包里的文件路径,这个简单例子里只有 helloworld.c 一个文件, AM_INIT_AUTOMAKE 描述了将要生成的软件包的名字及其版本号。AC_CONFIG_FILES 用来生成对应的 Makefile 文件,具体里面的其他参数可以参考这个网页。
2. 用 aclocal 生成 aclocal.m4:
aclocal
m4 是一个宏处理器,用来处理本地的宏定义。
3. 用 autoconf 生成 configure:
autoconf
这样可以生成 configure 脚本,用于自动配置软件源代码脚本。
4. 用 autoheader 生成 config.h.in:
autoheader
config.h.in 包含了 configure 所定义的宏,实质是个模板文件,打开可以看到对头文件的定义。configure.in 里的那句 AC_CONFIG_HEADERS 就是用来搜索这个文件的。
5. 创建一个 Makefile.am 文件,里面写入:
AUTOMAKE_OPTIONS=foreign
bin_PROGRAMS=helloworld
helloworld_SOURCES=helloworld.c
其中的 AUTOMAKE_OPTIONS 为设置 automake 的选项。由于 GNU 对自己发布的软件有严格的规范,比如必须附带许可证声明文件 COPYING 等,否则 automake 执行时会报错。automake 提供了三种软件等级:foreign、gnu 和 gnits ,让用户选择采用,默认等级为 gnu。在本例使用 foreign 等级,它只检测必须的文件。
bin_PROGRAMS 定义要产生的执行文件名。如果要产生多个执行文件,每个文件名用空格隔开。
hello_SOURCES 定义“hello”这个执行程序所需要的原始文件。如果”helloworld”这个程序是由多个原始文件所产生的,则必须把它所用到的所有原始文件都列出来,并用空格隔开。例如:若目标体“hello”需要“hello.c”、“sunq.c”、“hello.h”三个依赖文件,则定义hello_SOURCES=hello.c sunq.c hello.h。
6. 用 automake 命令生成 configure.in 文件:
automake --add-missing
参数 –ad-missing 是 add missing standard files to package ,它会让 automake 加入一个标准的软件包所必须的一些文件。
为什么都要sudo cmd呢?
@lyxint, 因为在用make装软件的时候我发现很多时候没有root权限会导致编译失败,所以做makefile的时候也就用sudo了,这个用多了会有副作用吗?
@feicun, 我只是觉得看起来不美观。。。
P.S. 代码高亮插件有问题啊。 include后面的头文件没出来。。
sudo时声称的文件owner和group不一样的。只要在make install时sudo就好
@feicun, 这个… 编译的时候最好不要用 sudo 。我自己编的东西都装到 /home 下,所以 make install 也可以不用 sudo 的。
@jesse, 嗯,我把sudo都去掉了。博客好久没看了,都快废了
@lyxint, 话说,你wp用的什么代码高亮插件?求推荐
代码高亮我用的wp-syntax, 我觉得挺好用的.
@lyxint, 好,我试试去
以前一直只知道你有一个音乐网站, 今天才看到这里. 哈哈, 准备来美国吗?
@Todd, 是啊,如果老婆settle down了那我更要去美国了。