在Linux下面,编写makefile是一件辛苦的事情。因此,为了减轻程序员编写makefile的负担,人们发明了autoconf和automake这两个工具,可以很好地帮我们解决这个问题。
我们可以通过一个简单的示例来说明如何使用配置工具。
有一个小点,不明白的记录下:(与下面程序无关)
rpm是由红帽公司开发的软件包管理方式,使用rpm我们可以方便的进行软件的安装、查询、卸载、升级等工作。但是rpm软件包之间的依赖性问题往往会很繁琐,尤其是软件由多个rpm包组成时。
Yum(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及SUSE中的Shell前端软件包管理器。基於RPM包管理,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软体包,无须繁琐地一次次下载、安装。
下面我不能得到正确的结果,请参照http://www.cnblogs.com/Safe3/archive/2009/02/10/1387460.html,这个我试过是正确的。
(1)首先,编写源文件hello.c。
- #include <stdio.h>
- int main(int argc, char** argv[])
- {
- printf("hello, world!\n");
- return 1;
- }
- SUBDIRS=
- bin_PROGRAMS=hello
- hello_SOURCES=hello.c
(3)直接输入autoscan,生成文件configure.scan,再改名为configure.in。
修改脚本AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)
为AC_INIT(hello, 1.0, feixiaoxing@163.com)
同时,在AC_CONFIG_HEADER([config.h])后面添加
AM_INIT_AUTOMAKE(hello, 0.1)
(4)依次输入aclocal命令、autoheader命令
(5)创建4个文件,分别为README、NEWS、AUTHORS和ChangeLog
(6)依次输入automake -a、autoconf命令
(7)输入./configure,生成最终的Makefile
(8)如果需要编译,输入make;如果需要安装, 输入make install;如果需要发布软件包,输入make dist
更详细的一个例子:
当多个源文件存在依赖关系时,在linux下我们通常会写一个Makefile。但要写一个规范的符合gnu规则的Makefile并不容易,幸亏有automake和autoconf这两个工具。嘿嘿!就让我们开始吧
以下以三个文件file1.c file2.c file2.h为例子讲解linux下Makefile的自动生成过程。
file1.c
[root@localhost temp]# cat file1.c
#include <stdio.h>
#include "file2.h"
int main(void)
{
printf("print file1$$$$$$$$$$$$$$$$$$$$$$4\n");
file2print();
return 0;
}
file2.c
[root@localhost temp]# cat file2.c
#include <stdio.h>
#include "file2.h"
void file2print()
{
printf("print file2************************\n");
}
file2.h
[root@localhost temp]# cat file2.h
#ifndef FILE2_H_
#define FILE2_H_
#ifdef __cplusplus
extern "C"
{
#endif
void file2print();
#ifdef __cplusplus
}
#endif
#endif
第一步:安装automake和autoconf这两个工具。yum install automake ;yum install autoconf.
第二布:将三个源文件放到一个工程目录(以/helloworld为例)进入目录中执行autoscan命令。会生成一个autoscanf.log 和configure.scan;
第三步:将configure.scan 改名为configure.in(configure.scan 是configure.in的原型文件,configure.in 是autoconf的脚本配置文件。在下面我们会用到)
[root@localhost temp]# cat configure.in
# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.
AC_PREREQ(2.59)
AC_INIT(helloworld, 1.0) #最后工程名字和版本号,最后一个bug-report-address省略了
AM_INIT_AUTOMAKE(helloworld,1.0) #工程名字和版本号,这一行要手动添加哦!!!!
AC_CONFIG_SRCDIR([file2.h]) #一般不用修改,用来检测源码文件是否存在,确认目录的有效性
AM_CONFIG_HEADER([config.h]) #用于生成config.h以便下面的autoheader使用。
# Checks for programs.
AC_PROG_CC
# Checks for libraries.
# Checks for header files.
# Checks for typedefs, structures, and compiler characteristics.
# Checks for library functions.
AC_OUTPUT(Makefile) #定义输出为Makefile。
第四步:执行aclocal,autoconf,autoheader注意顺序
第五步:执行automake --add-missing。在执行之前要自己创建一个脚本配置文件Makefile.am.--add-missing此参数会添加一些必要的脚本文件。
[root@localhost temp]# cat Makefile.am
AUTOMAKE_OPTIONS=foreign #有三个参数foreign,gnu,gnits默认gnu。使用foreign只是检查必要的文件而已。
bin_PROGRAMS=helloworld #最后的可执行程序(工程名)
helloworld_SOURCES=file1.c file2.c file2.h #程序所依赖的文件
第六步:执行./configure命令生成Makefile
以上六步之后Makefile就建好了,以后你就可以用make;make install;make uninstall;make clean;make distclean;make dist这些命令来对这个工程操作。
在任何路径下运行./helloworld都能实现。实际上已经是一个软件了。你可以用make dist来打包你的软件分发给你的同学。很过瘾吧!!