一个简单的执行程序的GNU automake自动生成Makefile的方法及案例

/*********************************************************************
 * Author  : Samson
 * Date    : 01/27/2015
 * Test platform:
 *              3.13.0-24-generic
 *              GNU bash, 4.3.11(1)-release
 * *******************************************************************/

在GNU的世界里,存在Automake这样的工具进行自动生成Makefile文件,automake是由Perl语言编写的,必须与GNU autoconf一并使用,具体的生成过程请参看GNU automake的wikipedia中的右下角的图,地址如下:http://en.wikipedia.org/wiki/Automake,由此图可看到使用自动生成Makefile的工具使用的流程,步骤主要如下:

1、autoscan

2、修改生成的configure.scan为configure.in

3、aclocal

4、autoheader

5、autoconf

6、创建Makefile.am并进行具体内容的写入

7、automake

8、automake

9、./configure生成Makefile

10、make得到可执行程序

光空说太抽象了,那么来一个简单的例子吧,

0、创建一个printf("Hello world!\n")的小程序,创建目录hello后创建hello.c,

[email protected]:~/hello$ ls

hello.c

那么下一步即可开始automake的工作了,

1、使用autoscan生成configure.scan

[email protected]:~/hello$ autoscan

[email protected]:~/hello$ ls

autoscan.log  configure.scan  hello.c

[email protected]:~/hello$ aclocal

aclocal: `configure.ac‘ or `configure.in‘ is required

2、在上一步中直接执行aclocal时出现以上的提示,那么就要将生成的configure.scan修改为configure.ac或configure.in再进行aclocal的执行;

[email protected]:~/hello$ mv configure.scan configure.in

[email protected]:~/hello$ ls

autoscan.log  configure.in  hello.c

3、执行aclocal

[email protected]:~/hello$ aclocal

[email protected]:~/hello$ ls

autom4te.cache  autoscan.log  configure.in  hello.c

4、执行autoheader

[email protected]:~/hello$ ls

autom4te.cache  autoscan.log  config.h.in  configure.in  hello.c

5、执行autoconf

[email protected]:~/hello$ autoconf

[email protected]:~/hello$ ls

autom4te.cache  autoscan.log  config.h.in  configure  configure.in  hello.c

6、创建Makefile.am

[email protected]:~/hello$ vim Makefile.am

[email protected]:~/hello$ cat Makefile.am

bin_PROGRAMS=hello

hello_SOURCES=hello.c

关于Makefile.am中的具体内容的意思是说生成的可执行文件的名称为hello,对应的源代码为hello.c。

7、执行automake

[email protected]:~/hello$ automake

configure.in: no proper invocation of AM_INIT_AUTOMAKE was found.

configure.in: You should verify that configure.in invokes AM_INIT_AUTOMAKE,

configure.in: that aclocal.m4 is present in the top-level directory,

configure.in: and that aclocal.m4 was recently regenerated (using aclocal).

automake: no `Makefile.am‘ found for any configure output

automake: Did you forget AC_CONFIG_FILES([Makefile]) in configure.in?

这时出错了,是说configure.in文件中的AM_INIT_AUTOMAKE没有找到,只有修改configure.in文件后再从第三步进行重新执行,configure.in中的AC_INIT行下添加AM_INIT_AUTOMAKE(hello,1.0),格式为AM_INIT_AUTOMAKE(package,version),再修改AC_OUTPUT为AC_OUTPUT(Makefile);

修改完configure.in文件后,再次执行2~7;

8、执行automake

[email protected]:~/hello$ automake

configure.in:6: required file `./install-sh‘ not found

configure.in:6:   `automake --add-missing‘ can install `install-sh‘

configure.in:6: required file `./missing‘ not found

configure.in:6:   `automake --add-missing‘ can install `missing‘

Makefile.am: required file `./INSTALL‘ not found

Makefile.am:   `automake --add-missing‘ can install `INSTALL‘

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

Makefile.am: required file `./COPYING‘ not found

Makefile.am:   `automake --add-missing‘ can install `COPYING‘

Makefile.am: required file `./depcomp‘ not found

Makefile.am:   `automake --add-missing‘ can install `depcomp‘

按照提示创建缺少的文件,

[email protected]:~/hello$ touch NEWS README AUTHORS ChangeLog

再执行: [email protected]:~/hello$ automake --add-missing

没有出错的情况下再次执行automake;

[email protected]:~/hello$ ls

aclocal.m4      ChangeLog     configure.in  INSTALL      missing

AUTHORS         config.h.in   COPYING       install-sh   NEWS

autom4te.cache  config.h.in~  depcomp       Makefile.am  README

autoscan.log    configure     hello.c       Makefile.in

此时已经生成了生成Makefile文件的cinfigure脚本;

9、./configure生成Makefile

[email protected]:~/hello$ ls Makefile

Makefile

10、make得到可执行程序

[email protected]:~/hello$ make

make  all-am

make[1]: 正在进入目录 `/home/ufo/hello‘

gcc -DHAVE_CONFIG_H -I.     -g -O2 -MT hello.o -MD -MP -MF .deps/hello.Tpo -c -o hello.o hello.c

mv -f .deps/hello.Tpo .deps/hello.Po

gcc  -g -O2   -o hello hello.o

make[1]:正在离开目录 `/home/ufo/hello‘

[email protected]:~/hello$ ls

aclocal.m4      config.h       configure     hello.c     Makefile.am  stamp-h1

AUTHORS         config.h.in    configure.in  hello.o     Makefile.in

autom4te.cache  config.h.in~   COPYING       INSTALL     missing

autoscan.log    config.log     depcomp       install-sh  NEWS

ChangeLog       config.status  hello         Makefile    README

[email protected]:~/hello$ ./hello

Hello World!

这就是牛X的automake的例子;关于其中的细节日后有空再表了 ;-)

Ref:

http://en.wikipedia.org/wiki/Automake

http://www.gnu.org/software/automake/manual/

http://socgsa.cs.clemson.edu/seminar/tools06/resources/08_autotools/automake.htm

时间: 2024-10-16 11:48:56

一个简单的执行程序的GNU automake自动生成Makefile的方法及案例的相关文章

linux下使用automake工具自动生成makefile文件

linux环境下,当项目工程很大的时候,编译的过程很复杂,所以需要使用make工具,自动进行编译安装,但是手写makefile文件比较复杂,所幸在GNU的计划中,设计出了一种叫做Autoconf/Automake的工具,用来自动生成makefile文件,为编译和安装程序提供了一个方便快捷的入口. 一.首先检查是否安装了autotools工具 使用which命令    aclocal    autoscan    autoconf    autoheader    automake 二.安装aut

AutoConf自动生成Makefile(基于helloworld简单例子)

新建一个简单的helloworld工程文件夹,目录结构如下 hello.h代码: #include<stdio.h> void fprint() { printf("hello world!\n"); } hello.c代码: #include"hello.h" int main() { fprint(); return 0; } 利用AutoConf工具套件来自动生成Makefile 1. 进入helloworld/目录,运行autoscan 生成au

使用autotools自动生成Makefile并在此之上使用dh-make生成可发布的deb程序包(详解)

转自:http://blog.csdn.net/longerzone/article/details/12705507 一.前言 本文将介绍如何使用autotools生成一个Makefile文件,并在此基础上使用dh-make和debuild生成一个可发布的deb程序包,这也是我们在Linux下开发应用程序以及想要发布应用程序需要做的. 无论是在Linux还是在Unix环境中,make都是一个非常重要的编译命令.不管是自己进行项目开发还是安装应用软件,我们都经常要用到make或 make ins

自动生成Makefile时,关于Makefile.am编写

最近编译一个项目的程序时,二十几个源代码文件放在六个文件夹中,而且各个文件中头文件互相包含.以前写过编译这样组织的源码的makefile,所以这次也就直接写了. 确实因为各个文件间的头文件互相包含,造成在第一次写完后,make时出现了很多未定义.于是把各个文件的头文件重新检查一边,同时载makefile中尽量按照相对路径,把所有的头文件都包含进来.终于在忙活了三个小时后,一个可以在自己机器上编译的makefile写好了.(仅指在自己的机器上,因为有一个库文件使用的是我电脑上的绝对路径) 果然,在

IntelliJ IDEA 中自动生成 serialVersionUID 的方法

as, idea plugin中搜如下关键字,并安装该插件: GenerateSerialVersionUID 如上图所示,创建一个类并实现Serializable接口,然后按alt+Enter键,即可收到提示,然后选择SerialVersionUID: 如上图所示,显然我们已经利用 IntelliJ IDEA 中自动生成serialVersionUID啦! 详述 IntelliJ IDEA 中自动生成 serialVersionUID 的方法 https://blog.csdn.net/qq_

自动生成Makefile的全过程详解

一.简介 Linux下的程序开发人员,一定都遇到过Makefile,用make命令来编译自己写的程序确实是很方便.一般情况下,大家都是手工写一个简单Makefile,如果要想写出一个符合自由软件惯例的Makefile就不那么容易了. 在本文中,将介绍如何使用autoconf和automake两个工具来帮助我们自动地生成符合自由软件惯例的Makefile,这样就可以象常见的GNU程序一样,只要使用"./configure","make","make inst

自动生成Makefile文件

主要的工具有autoscan, aclocal, autoheader, autoconfig,automake 1 .创建c源文件hello.c 1 #include <stdio.h> 2 3 int main(){ 4 return 0; 5 } 2.执行autoscan命令 这是目录下会多出configure.scan和autoscan.log文件,我们以configure.scan文件为模板进行修改,将configure.scan重命名改为configure.ac (好多博客写的是c

eclipse自动生成带参数说明方法注释

自动生成方法的注释格式,例如 /*** @param str* @return * @throws  ParseException*/ 快捷键是alt+shift+j,将光标放在方法名上,按快捷键.会生成上述方法注释的格式,具体内容还是要自己填写的.

70-persistent-net.rules无法自动生成,解决方法

无法自动生成70-persistent-net.rules文件的原因: 在更换linux内核前修改ifcfg-eth0文件,更换内核,使用dhclient无法动态分配IP,删掉70-persistent-net.rules文件,重启系统. 在/dev/udev/rules.d文件夹下没有自动生成70-persistent-net.rules文件. 解决方法: 手动执行/lib/udev/write_net_rules 如果提示信息为: missing $INTERFACE 添加变量: expor