一个简单的执行程序的GNU automake自动生成Makefile的方法及案例
一个简单的执行程序的GNU automake自动生成Makefile的方法及案例
在GNU的世界里,存在Automake这样的工具进行自动生成Makefile文件,automake是由Perl语言编写的,必须与GNU autoconf一并使用,具体的生成过程请参看GNU automake的wikipedia中的右下角的图,地址如下:http://en.wikipedia.org/wiki/Automake,由此图可看到使用自动生成Makefile的工具使用的流程,步骤主要如下:
- autoscan
- 修改生成的configure.scan为configure.in
- aclocal
- autoheader
- autoconf
- 创建Makefile.am并进行具体内容的写入
- automake
- automake
- ./configure生成Makefile
- make得到可执行程序
光空说太抽象了,那么来一个简单的例子吧,
0. 创建一个printf("Hello world!\n")的小程序,创建目录hello后创建hello.c,
ufo@ufo:~/hello$ ls
hello.c
那么下一步即可开始automake的工作了,
1、使用autoscan生成configure.scan
ufo@ufo:~/hello$ autoscan
ufo@ufo:~/hello$ ls
autoscan.log configure.scan hello.c
ufo@ufo:~/hello$ aclocal
aclocal: `configure.ac' or `configure.in' is required
2、在上一步中直接执行aclocal时出现以上的提示,那么就要将生成的configure.scan修改为configure.ac或configure.in再进行aclocal的执行;
ufo@ufo:~/hello$ mv configure.scan configure.in
ufo@ufo:~/hello$ ls
autoscan.log configure.in hello.c
3、执行aclocal
ufo@ufo:~/hello$ aclocal
ufo@ufo:~/hello$ ls
autom4te.cache autoscan.log configure.in hello.c
4、执行autoheader
ufo@ufo:~/hello$ ls
autom4te.cache autoscan.log config.h.in configure.in hello.c
5、执行autoconf
ufo@ufo:~/hello$ autoconf
ufo@ufo:~/hello$ ls
autom4te.cache autoscan.log config.h.in configure configure.in hello.c
6、创建Makefile.am
ufo@ufo:~/hello$ vim Makefile.am
ufo@ufo:~/hello$ cat Makefile.am
bin_PROGRAMS=hello
hello_SOURCES=hello.c
关于Makefile.am中的具体内容的意思是说生成的可执行文件的名称为hello,对应的源代码为hello.c。
7、执行automake
ufo@ufo:~/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
ufo@ufo:~/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'
按照提示创建缺少的文件,
ufo@ufo:~/hello$ touch NEWS README AUTHORS ChangeLog
再执行:
ufo@ufo:~/hello$ automake --add-missing
没有出错的情况下再次执行automake;
ufo@ufo:~/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
ufo@ufo:~/hello$ ls Makefile
Makefile
10、make得到可执行程序
ufo@ufo:~/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'
ufo@ufo:~/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
ufo@ufo:~/hello$ ./hello
Hello World!
这就是牛X的automake的例子;关于其中的细节日后有空再表了
一个简单的执行程序的GNU automake自动生成Makefile的方法及案例的更多相关文章
- GNU autotools自动生成Makefile 介绍
一.目的 使用autotools工具来帮助我们自动地生成符合自由软件惯例的makefile(这样就可以像常见的GNU程序一样,只要使用"./configure", "ma ...
- 使用autoconf与automake自动生成MakeFile文件
automake主要通过编辑Makefile.am来控制它的行为,下面就常用的三个Makefile.am配置做出说明. 1.1. autotools的工作原理 autotools最终是为了生成Make ...
- 简单实例,说明自动生成Makefile的详细过程
为了编译一个简单的源文件main.c,需要自动生成一个makefile,以下是步骤: 第一步:----------在/root/project/main目录下创建一个文件main.c,其内容如下:-- ...
- linux下使用automake工具自动生成makefile文件
linux环境下,当项目工程很大的时候,编译的过程很复杂,所以需要使用make工具,自动进行编译安装,但是手写makefile文件比较复杂,所幸在GNU的计划中,设计出了一种叫做Autoconf/Au ...
- 使用automake等命令自动生成Makefile文件 (转载)
使用automake等命令自动生成Makefile文件 Linux下编程时,为了方便编译,往往使用Makefile文件自动完成编译,但是Makefile文件本身的书写十分复杂,规则很多.好在Lin ...
- 自动生成 Makefile (automake/autoconf 入门)
作为Linux 下的程序开发人员,大家一定都遇到过Makefile ,用make 命令来编译自己写的程序确实是很方便.一般情况下,大家都是手工写一个简单Makefile ,如果要想写出一个符合自由软件 ...
- 自动生成makefile
原文 http://www.laruence.com/2009/11/18/1154.html 作为Linux下的程序开发人员,大家一定都遇到过Makefile,用make命令来编译自己写的程序确实 ...
- 如何自动生成Makefile
作为Linux下的程序开发人员,大家一定都遇到过Makefile,用make命令来编译自己写的程序确实是很方便.一般情况下,大家都是手工写一个简单Makefile,如果要想写出一个符合自由软件惯例的M ...
- 使用autotools自动生成Makefile并在此之上使用dh-make生成可发布的deb程序包(详解)
转自:http://blog.csdn.net/longerzone/article/details/12705507 一.前言 本文将介绍如何使用autotools生成一个Makefile文件,并在 ...
随机推荐
- OpenCV使用说明
我在这边大概说一下OpenCV的使用,具体环境配置参考下面我给出的两个链接. 1. 对于目前OpenCV来说,安装变的简单了很多,现在官方已经给出了预编译文件,不要重新编译.具体使用可以参考http: ...
- PHP array_diff_uassoc()
定义和用法 array_diff_uassoc() 函数使用用户自定义的回调函数 (callback) 做索引检查来计算两个或多个数组的差集.返回一个数组,该数组包括了在 array1 中但是不在任何 ...
- Html5笔记 表格 布局
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Python自定义钉钉机器人发送自动化结果报告
环境python3.5+jenkins # coding:utf-8 import urllib.request import json import sys import time import r ...
- ant+jmeter 报告优化
环境基础:ant+jmeter+java +jmeter脚本 1.将 JMeter的extras目录中ant-jmeter-1.1.1.jar包拷贝至ant安装目录下的lib目录中 2.修改JMete ...
- spark定制之五:使用说明
背景 spark-shell是一个scala编程解释运行环境,能够通过编程的方式处理逻辑复杂的计算,但对于简单的类似sql的数据处理,比方分组求和,sql为"select g,count(1 ...
- luogu4218 [JSOI2008] 最小生成树计数
题目大意 求一个加权无向图的最小生成树的个数.1<=n<=100; 1<=m<=1000,具有相同权值的边不会超过10条. 题解 命题1 由构成最小生成树的边的边权从小到大排序 ...
- 第16课 “远程 Git文档库” 的基础操作
16-1 “远程Git文档库” 的功能 如果 “本地Git文档库” 和 “远程Git文档库” 是存储在不同的计算机中,它们之前传送数据可以通过HTTP/HTTPS.SSH.GIT proto ...
- 排序系列 之 归并排序算法 —— Java实现
基本思想: 归并排序法是分治法的典型实例,分为分割和归并两部分. 把一个数组分为大小相近的子数组(分割),分别把子数组排好序后,通过合成一个大的排好序的数组(归并). 实例: 先分割成每个子序列只有一 ...
- JS代码放在哪里比较好!
在页面上加上<script></script>只有2个地方:head中,body体中 如果外部的JS文件,在head中加,写页面特效js放在body后面. <html&g ...