简述automake的使用

一、生成configure过程中各文件之间的关系图

image.png

相关细节自行查阅!

二、准备工作:

安装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
image.png

执行后会发现一个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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,504评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,434评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,089评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,378评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,472评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,506评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,519评论 3 413
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,292评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,738评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,022评论 2 329
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,194评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,873评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,536评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,162评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,413评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,075评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,080评论 2 352

推荐阅读更多精彩内容