如何根据configure.ac和Makefile.am为开源代码产生当前平台的Makefile

1
2
3
4
5
6
7
8
9
//根据configure.in和Makefile.am生成makefile的步骤,基于UBUNTU 12.04
1.autoscan (可选)
2.aclocal
3.autoconf
4.autoheader(可选)
5.libtoolize --automake --copy --debug --force(可选)
6.automake --add-missing
7.autoreconffiWall,no–obsolete(可选)
8../configure

 

简单的方式:html

若是拿到的工程文件中,没有Makefile文件,而只有configure.in和Makefile.am文件,咱们是不可以直接进行编译的,必须在UBUNTU等Linux系统下,根据configure.in和Makefile.am文件生成编译所需的Makefile文件。具体操做步骤以下:
一、执行autoscan,而后执行aclocal,产生aclocal.m4文件
aclocal是一个perl 脚本程序,它的定义是:“aclocal – create aclocal.m4 by scanning configure.ac”。 aclocal根据configure.in文件的内容,自动生成aclocal.m4文件。而aclocal.m4文件中,包含了生成configure文件所必须的宏。
二、执行autoconf,生成configure文件
autoconf会根据configure.in和aclocal.m4文件,生成configure文件。其实,autoconf就是把configure.in和aclocal.m4文件中定义的内容, 变成检查系统特性、环境变量、软件必须的参数的shell脚本。
三、执行automake命令,产生Makefile.in
具体命令为:automake –add-missing
automake会根据Makefile.am文件产生一些文件,包含最重要的Makefile.in。前面所生成的configure,会根据Makefile.in文件,来生成最终的Makefile文件。
四、执行configure命令,生成Makefile文件
这样,就产生了编译所须要的Makefile文件。运行make,便可编译。linux

 

 

 

复杂点的方式:git

为一个项目源文件生成makefile并make的步骤以下:github

操做在包含源文件的项目目录下进行。shell

  • (1)运行autoscan,生成文件configure.scan
  • (2)修改configure.scan,更名为configure.in
  • (3)运行autoheader,生成文件configure.h.in(如今通常改成configure.ac)
  • (4)运行libtoolize,生成ltmain.sh
  • (5)运行allocal,生成aclocal.m4
  • (6)运行autoconf,生成configure
  • (7)运行automake,生成makefile.in,每一个包含makefile.am的子目录都生成makefile.in。automake -a选项能够补齐文件config.guess,config.sub,install-sh,missing,depcomp
  • (8)运行./configure,生成config.status,config.h,makefile
  • (9)运行make,生成中间文件对象文件,库文件,最后生成可执行文件
  • (10)运行make install,相应的可执行文件,库文件,头文件拷贝到系统相应位置。

configure运行ui

configure是一个shell脚本文件,由autoconf生成,它自动为源码包配置编译链接选项,适应不一样的硬件平台和POSIX操做系统,输出所须要的Makefile。this

configure主管检查你的系统,把结果存放到config.status中,config.status根据它的检查结果实际执行正确的动做。spa

configure检查与系统相关的一系列变量,这些变量存储到文件config.status中,供makefile调用。这些变量包括编译链接时须要的程序,这些程序在系统中的位置(目录),调用这些程序的选项,好比编译器的目录,编译器的选项-g是否支持等。configure能猜出它运行的系统的规范名字cpu–vendor–os,它经过运行脚本文件config.guess输出变量uname来猜出。configure能识别不少系统名字的别名,它经过运行脚本文件config.sub把系统名字变成规范名字。操作系统

make运行debug

makefile.am对makefile的影响:它根据SUBDIRS = add sub让make递归进入每一个子目录处理子目录的Makefile。根据main_LDADD = add/libadd.la sub/libsub.la为main链接libadd.la和libsub.la库。

configure.in对makefile的影响:

根据AC_PROG_LIBTOOL让libtool完成编译链接工做。

根据AC_CONFIG_HEADERS([config.h])只需传递预处理宏-DHAVE_CONFIG_H给编译器。

makefile中不少与系统相关的信息都是经过变量获取的,这些变量以前已经由configure检查好存放在config.status里面,预处理 宏存放在config.h里面。好比咱们要用到的编译器CC,编译器选项CFLAGS等。makefile中的变量完成替换后,开始实际执行命令,它会递 归执行每个子目录下的makefile,生成对象文件,链接库文件,最后链接成可执行文件。

交叉编译 Cross-compiling

Q:为别的平台编译可执行程序怎么作?

交叉编译就是在目前的平台上为别的目标平台生成可执行程序或库。能够在运行configure时经过–build,–host,–target参数实现交叉编译。

例如:

 

–build=build-type :configure和compile软件包的系统类型。默认状况等于config.guess给出的系统类型

–host=host-type :运行软件包的系统类型。默认状况等于build类型

–target=target-type :不多用,默认状况等于host类型。

交叉编译时,若是编译器,链接器,汇编器名字不是以host_type为前缀,configure都会发出警告。

要搭建交叉变异环境,如交叉编译用的编译器,链接器,汇编器跟本地的不同,通常以host_type为前缀,如arm-pc-linux-gcc。

安装目录

Q:make install时,文件都安装到哪里去了?

prefix:安装目录的前缀。默认状况下/usr/local 。

bindir:安装时拷贝可执行文件到此目录。默认状况下/usr/local/bin 。

includir:安装时拷贝头文件到此目录。默认状况下/usr/local/include 。

libdir:安装时拷贝库文件到此目录。默认状况下/usr/local/libs 。

定制本身的安装目录,能够–prefix 和 –exec-prefix 给configure。

例如:./configure –prefix=/usr 。

 

Configure,Makefile.am, Makefile.in, Makefile文件之间关系

 

 

 

 

针对上面提到的 各个命令,咱们再作些详细的介绍

//http://www.laruence.com/2009/11/18/1154.html

 

 

错误处理:

 

When try to configure an open source code, I get error like this :

configure: error: cannot find install-sh, install.sh, or shtool in “.” “./..” “./../..”

<pre>

autoreconf Wall,noobsolete
./configure

</pre>

 

 

 

“Libtool library used but ‘LIBTOOL’ is undefined”

<pre>sudo apt-get install autoconf
sudo apt-get install automake
sudo apt-get install libtool

从新执行aclocal/autoheader</pre>

 

 

required file build/ltmain.sh' not found

$ automake --add-missing
....
configure.in:18: required file 
build/ltmain.sh’ not found
….
解决方案(libtoolize配置便可):

$libtoolize –version-libtoolize (GNU libtool) 1.4.2…..$libtoolize –automake –copy –debug –force

相关文章
相关标签/搜索