一、生成configure过程中各文件之间的关系图
相关细节自行查阅!
二、准备工作:
安装autoscan:
sudo apt-get install automake
三、实例
我的文件是c++文件,这里创建一个hello.cpp文件,里面的内容如下:
#include <iostream>
using namespace std;
int main()
{
cout<<"hello word"<<endl;
return 0;
}
步骤如下:
1.使用autoscan工具扫描文件源
[linux@ubuntu ~/r818_tina_git/mytest]$ autoscan #扫描源文件,生成configure.scan
[linux@ubuntu ~/r818_tina_git/mytest]$ ls
autoscan.log configure.scan hello.cpp Makefile.am
2.使用aclocal工具生成aclocal.m4
将生成的configure.scan修改为configure.ac或configure.in,先修改configure.ac里面的内容,再进行aclocal的执行;
# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.
AC_PREREQ([2.69]) # automake版本
AC_INIT([hello], [1.0], [xpz@qq.com]) #设置软件包信息,需手动添加
AM_INIT_AUTOMAKE(hello, 1.0) #automake必备的宏,需手动添加
AC_CONFIG_SRCDIR([hello.cpp]) #源文件名,来确定目录的有效性。
#AC_CONFIG_HEADERS([config.h])
# config.h文件,便于autoheader使用,这个地方我们不需要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]) #注册Makefile文件
AC_OUTPUT #要输出的文件名,由于Makefile已注册此处无需修改,否则改为AC_OUTPUT(Makefile)
然后执行:
[linux@ubuntu ~/r818_tina_git/mytest]$ aclocal
[linux@ubuntu ~/r818_tina_git/mytest]$ ls
aclocal.m4 autom4te.cache autoscan.log configure.ac hello.cpp Makefile.am
3.使用autoconf工具生成configure文件
将configure.ac中的宏展开,生成configure脚本。这个过程可能要用到aclocal.m4中定义的宏。
[linux@ubuntu ~/r818_tina_git/mytest]$ autoconf
[linux@ubuntu ~/r818_tina_git/mytest]$ ls
aclocal.m4 autom4te.cache autoscan.log configure configure.ac hello.cpp Makefile.am
4.使用autoheader 工具生成 config.h config.h.in
测试将之前注释的AC_CONFIG_HEADERS
放开,其实不注释也可以的。
[linux@ubuntu ~/r818_tina_git/mytest]$ autoheader
[linux@ubuntu ~/r818_tina_git/mytest]$ ls
aclocal.m4 autom4te.cache autoscan.log config.h.in configure configure.ac hello.cpp Makefile.am
autoheader
生成了configure.h.in
如果在configure.ac
中定义了AC_CONFIG_HEADER
,那么此文件就需要;
5.手动生成Makefile.am
并修改为:
AUTOMAKE_OPTIONS=foreign
bin_PROGRAMS=hello
hello_SOURCES=hello.cpp
**AUTOMAKE_OPTIONS **为设置Automake的选项。由于GNU对自己发布的软件有严格的规范,比如必须附带许可证声明文件COPYING等,否则Automake执行时会报错。Automake提供了3种软件等级:foreign、gnu和gnits,供用户选择,默认等级为gnu。本例使需用foreign等级,它只检测必须的文件。
bin_PROGRAMS 定义要产生的执行文件名。如果要产生多个执行文件,每个文件名用空格隔开。
hello_SOURCES 定义”hello”这个执行程序所需要的原始文件。如果”hello”这个程序是由多个原始文件所产生的,则必须把它所用到的所有原始文件都列出来,并用空格隔开。例如:若目标体”hello”需要”hello.c”、”hello.h”两个依赖文件,则定义hello_SOURCES=hello.c hello.h。本实例只有一个.cpp文件,只需要添加一个即可。
6.使用Automake生成Makefile.in文件
- 如果linux第一次使用automake这里容易出问题,如下出现了下面的问题:
configure.ac:6: warning: AM_INIT_AUTOMAKE: two- and three-arguments forms are deprecated. For more info, see:
configure.ac:6: http://www.gnu.org/software/automake/manual/automake.html#Modernize-AM_005fINIT_005fAUTOMAKE-invocation
configure.ac:6: error: required file './install-sh' not found
configure.ac:6: 'automake --add-missing' can install 'install-sh'
configure.ac:6: error: required file './missing' not found
configure.ac:6: 'automake --add-missing' can install 'missing'
...
- 方法已经提示了,我们只需要执行
automake --add-missing
。此步主要是为了生成Makefile.in,加上--add-missing参数后,会补全缺少的脚本;
[linux@ubuntu ~/r818_tina_git/mytest]$ automake --add-missing
configure.ac:6: warning: AM_INIT_AUTOMAKE: two- and three-arguments forms are deprecated. For more info, see:
configure.ac:6: http://www.gnu.org/software/automake/manual/automake.html#Modernize-AM_005fINIT_005fAUTOMAKE-invocation
[linux@ubuntu ~/r818_tina_git/mytest]$ ls
aclocal.m4 autom4te.cache autoscan.log config.h.in configure configure.ac COPYING depcomp hello.cpp INSTALL install-sh Makefile.am Makefile.in missing
有个警告标识这种形式在新版本中已经弃用,但不影响我们的使用。想要详细了解的自行探究!
- 还有个错误:
Makefile.am: error: required file './NEWS' not found
Makefile.am: error: required file './README' not found
Makefile.am: error: required file './AUTHORS' not found
Makefile.am: error: required file './ChangeLog' not found
这个错误实际上不影响我们生成Makefile.in文件,如何想要解决也很简单:
[linux@ubuntu ~/r818_tina_git/mytest]$ touch NEWS README AUTHORS ChangeLog #缺什么就相应的生成什么
7.**执行./configure **
(1)生成Makefile
######################## ./configure ##########################
[linux@ubuntu ~/r818_tina_git/mytest]$ ./configure
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /bin/mkdir -p
checking for gawk... gawk
checking whether make sets $(MAKE)... yes
checking whether make supports nested variables... yes
checking for g++... g++
checking whether the C++ compiler works... yes
checking for C++ compiler default output file name... a.out
checking for suffix of executables...
checking whether we are cross compiling... no
checking for suffix of object files... o
checking whether we are using the GNU C++ compiler... yes
checking whether g++ accepts -g... yes
checking for style of include used by make... GNU
checking dependency style of g++... gcc3
checking that generated files are newer than configure... done
configure: creating ./config.status
config.status: creating Makefile
config.status: executing depfiles commands
(2)编译
######################## make ##########################
[linux@ubuntu ~/r818_tina_git/mytest]$ make
....
make all-am
make[1]: 进入目录“/home/linux/r818_tina_git/mytest”
g++ -DHAVE_CONFIG_H -I. -g -O2 -MT hello.o -MD -MP -MF .deps/hello.Tpo -c -o hello.o hello.cpp
mv -f .deps/hello.Tpo .deps/hello.Po
g++ -g -O2 -o hello hello.o
make[1]: 离开目录“/home/linux/r818_tina_git/mytest”
[linux@ubuntu ~/r818_tina_git/mytest]$ ls
aclocal.m4 autoscan.log config.h.in config.status configure.ac depcomp hello.cpp INSTALL Makefile Makefile.in stamp-h1
autom4te.cache config.h config.log configure COPYING hello hello.o install-sh Makefile.am missing
(3)打包
######################### make dist #########################
[linux@ubuntu ~/r818_tina_git/mytest]$ make dist
....
tardir=hello-1.0 && ${TAR-tar} chof - "$tardir" | eval GZIP= gzip --best -c >hello-1.0.tar.gz
make[1]: 离开目录“/home/linux/r818_tina_git/mytest”
[linux@ubuntu ~/r818_tina_git/mytest]$ ls
aclocal.m4 autoscan.log config.h.in config.status configure.ac depcomp hello-1.0.tar.gz hello.o install-sh Makefile.am missing
autom4te.cache config.h config.log configure COPYING hello hello.cpp INSTALL Makefile Makefile.in stamp-h1
执行后会发现一个hello-1.0.tar.gz安装包,这时候发给别人,解压编译即可运行了。
四、相对复杂的目录结构下的不同
上述例子中只有一个文件,目录结构简单,那么复杂的目录结构下该如何配置呢?
├── conf
│ └── test.conf
└── src
├── test1.c
├── test2.c
└── test3.c
1.执行autoscan命令修改.ac有所不同
# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.
AC_PREREQ([2.69])
AC_INIT([test], [1.0], [xpz@qq.com])
AM_INIT_AUTOMAKE(test, 1.0)
AC_CONFIG_SRCDIR([src/test1.c])
#AC_CONFIG_HEADERS([config.h])
# Checks for programs.
AC_PROG_CC
# Checks for libraries.
AC_CHECK_LIB(pthread, pthread_create) #pthread为链接库名字, pthread_create为库中的一个函数
# Checks for header files.
AC_CHECK_HEADERS(stdlib.h string.h pthread.h)
# Checks for typedefs, structures, and compiler characteristics.
# Checks for library functions.
AC_OUTPUT(Makefile src/Makefile conf/Makefile) #每一个目录需要输出一个Makefile文件
2.使用aclocal工具生成aclocal.m4
3.使用autoconf工具生成configure文件
4.创建Makefile.am
在顶层目录创建的Makefile.am的内容如下:
#mytest/ffftest/Makefile.am
SUBDIRS= src conf
在src目录下创建的Makefile.am内容如下:
#mytest/ffftest/src
bin_PROGRAMS= test
test_SOURCES= test1.c test2.c test3.c
在conf目录下创建的Makefile.am内容如下:
configdir = /etc #这个数据文件将要移动到的目录
config_DATA = test.conf #数据文件名,如果有多个文件则这样写config_DATA = test1.dat test2.dat
5.使用Automake生成Makefile.in文件
# 这个错误上面以及提到了
[linux@ubuntu ~/r818_tina_git/mytest/ffftest]$ automake --add-missing
Makefile.am: required file `./NEWS' not found
Makefile.am: required file `./README' not found
Makefile.am: required file `./AUTHORS' not found
Makefile.am: required file `./ChangeLog' not found
# 缺什么就创建什么
[linux@ubuntu ~/r818_tina_git/mytest/ffftest]$ touch NEWS README AUTHORS ChangeLog
6.后面的步骤就和上面的例子一样了./configure 、 make、make dist