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

简介: 1 2 3 4 5 6 7 8 9 //根据configure.in和Makefile.am生成makefile的步骤,基于UBUNTU 12.04 1.
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

 

简单的方式:

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

 

 

 

复杂点的方式:

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

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

  • (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运行

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

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

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

make运行

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

 

目录
相关文章
|
2月前
|
C语言 Windows
使用CMake调用Makefile 项目
使用CMake调用Makefile 项目
27 0
|
18天前
|
IDE Unix 测试技术
CMake基础(10)使用ninja构建
CMake基础(10)使用ninja构建
62 1
|
2月前
|
编译器 Linux 开发者
【cmake 交叉编译配置设置】CMAKE_TOOLCHAIN_FILE:跨平台编译的秘密武器
【cmake 交叉编译配置设置】CMAKE_TOOLCHAIN_FILE:跨平台编译的秘密武器
68 0
|
3月前
|
IDE 编译器 Shell
初玩Makefile与Go项目中Makefile的简单使用
初玩Makefile与Go项目中Makefile的简单使用
36 0
|
4月前
|
Linux 开发工具 C语言
【Linux系统编程】项目自动化构建工具make/Makefile--1
【Linux系统编程】项目自动化构建工具make/Makefile--1
|
4月前
|
Linux C语言
【Linux系统编程】项目自动化构建工具make/Makefile--2
【Linux系统编程】项目自动化构建工具make/Makefile--2
|
Linux 开发工具 C语言
hi3559 C/C++混编 makefile(基于官方sample)
由于个人需要想做海思的C++和C混编,好像不认真学一学makefile不行了 本人博客,csdn搬运 main函数是卸载cpp里面的,写在c里面的就是给你们提供一个思路了 弄明白了有空自己写呐,海思的makefile感觉嵌套的太冗余了,正常开发一个片子用不到呐
195 0
|
11月前
|
安全 编译器 Linux
别忘了给gcc编译器工具链加上-fno-common选项
别忘了给gcc编译器工具链加上-fno-common选项
|
关系型数据库 MySQL Linux
编译tars的时候找不到libmysqlclient.a静态库
获取MariaDB源码 下载相应源码,下载地址mariadb-5.5.56.tar.gz 下载后传到虚拟机中,解压然后编译。
179 0
|
Android开发 C++
【Android 安装包优化】使用 lib7zr.a 静态库处理压缩文件 ( 交叉编译 lib7zr.a 静态库 | 安卓工程导入静态库 | 配置 CMakeLists.txt 构建脚本 )(二)
【Android 安装包优化】使用 lib7zr.a 静态库处理压缩文件 ( 交叉编译 lib7zr.a 静态库 | 安卓工程导入静态库 | 配置 CMakeLists.txt 构建脚本 )(二)
188 0
【Android 安装包优化】使用 lib7zr.a 静态库处理压缩文件 ( 交叉编译 lib7zr.a 静态库 | 安卓工程导入静态库 | 配置 CMakeLists.txt 构建脚本 )(二)