QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 873|回复: 6

熟悉autoconf和automake的高手帮帮忙

[复制链接]
发表于 2003-12-10 11:42:46 | 显示全部楼层 |阅读模式
我最近在学利用autoconf和automake自动生成configure和Makefile文件。我的程序结构结构是这样的,在/home/demo目录下有include和src两个目录,分别存放list.h和list.c,demo.c。list.h和list.c用于生成一个实现链表的库,demo.c里是调用这个库的主函数,预计生成一个叫demo的执行程序。

首先我在/home/demo目录下用autoscan命令生成了一个configure.scan,然后想以它为蓝本,编辑autoconf用的configure.in文件,可是这个文件里有很多宏,这些宏的意思我看不懂,有没有大侠能针对我这个demo程序的程序结构,指点指点configure.in里的那些宏都是什么意思,在那些宏的参数里应该怎样填呢,我万分感激!
发表于 2003-12-10 12:44:56 | 显示全部楼层
具体的看autoconf和automake的文档吧.

没有什么依赖配置,或者不打算移植或发布,还是用Makefile好了.

你的这个比较简单,应该没有依赖库,只要gcc就够了.简单给个例子
$HOME/demo/configure.ac 老版本的autoconf可能要改成$HOME/demo/configure.in
[code:1]
AC_INIT(src/demo.c)
AM_CONFIG_HEADER(config.h)

PACKAGE=demo
VERSION=0.1

AM_INIT_AUTOMAKE($PACKAGE,$VERSION)

AC_PROG_CC
AC_PROG_INSTALL
AC_STDC_HEADERS

AC_OUTPUT([Makefile src/Makefile])
[/code:1]
$HOME/demo/Makefile.am
[code:1]
SUBDIRS = src
[/code:1]
$HOME/demo/src/Makefile.am
[code:1]
bin_PROGRAMS = demo
demo_SOURCES = demo.c list.c
INCLUDES = -I./ -I../ -I../include
[/code:1]
然后运行如下命令:
[code:1]
cd $HOME/demo
aclocal
autoheader
touch stamp-h
autoconf
automake -a -c
[/code:1]
回复

使用道具 举报

 楼主| 发表于 2003-12-10 13:49:30 | 显示全部楼层
谢谢老大。能不能在configure.in的那些宏的代码后加上注释呢?我用autoscan自动生成的congfigure.in的代码如下,为什么和您写的有些地方不一样,如果您方便,能不能告诉我您这样改的原因,以及下面的那些宏都是什么意思,谢谢

#                                               -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.

AC_PREREQ(2.57)
AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)
AC_CONFIG_SRCDIR([list.h])
AC_CONFIG_HEADER([config.h])

# Checks for programs.
AC_PROG_CC

# Checks for libraries.

# Checks for header files.
AC_HEADER_STDC
AC_CHECK_HEADERS([malloc.h stdlib.h])

# Checks for typedefs, structures, and compiler characteristics.
AC_C_CONST

# Checks for library functions.
AC_FUNC_MALLOC
AC_OUTPUT
回复

使用道具 举报

 楼主| 发表于 2003-12-10 14:08:17 | 显示全部楼层
还有,autoheader 是什么意思呢?我看一些参考书里都写的是有了configure.in文件后,用aclocal  ,  autoconf 生成configure文件,然后再在/demo目录下,/demo/include/目录下,/demo/src目录下都要编辑一个makefile.am文件,然后再用automake命令,生成makefile.in文件,然后执行configure脚本,生成makefile,然后执行make,生成可执行程序,您看这样的步骤有问题吗?
回复

使用道具 举报

发表于 2003-12-10 20:46:29 | 显示全部楼层
呵呵.你的autoconf版本较新.
autoconf和automake都是用m4宏来实现,m4我也不会.
[code:1]
#要求2.57以上的autoconf才能根据这个文件生成configure
AC_PREREQ(2.57)
#定义宏,这里你自己改, 例如 AC_INIT(demo, 0.1, [email protected])
AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)
#配置源代码所在路径.用一个代码树中独一无二的文件声明.我想这里应该是
#AC_CONFIG_SRCDIR([include/list.h])
#因为你的configure生成在$HOME/demo下
AC_CONFIG_SRCDIR([list.h]),
#生成config.h 主要是配置一些宏,如文件路径,版本等信息
AC_CONFIG_HEADER([config.h])

#检测编译器.标准宏,不用管
# Checks for programs.
AC_PROG_CC

# Checks for libraries.

# Checks for header files.
AC_HEADER_STDC
#你的程序中用到了下面的非AC_HEADER_STDC中包含的头文件.加入检测.
AC_CHECK_HEADERS([malloc.h stdlib.h])

# Checks for typedefs, structures, and compiler characteristics.
AC_C_CONST


# Checks for library functions.
AC_FUNC_MALLOC
#要输出的文件自己填
AC_OUTPUT
[/code:1]
autoscan生成的只是一个模板,肯定要修改才能满足需求.
一般是把模板变量改成自定义的,再加入关于automake的宏.就是AM打头的.这样可以根据AM的宏来完善configure,配置一些关于make时使用的变量.
autoheader是生成config.in的.有时也要手工编辑以满足配置的需要.最后生成的config.h是根据你的配置得到一些宏定义,代码中根据这些宏来决定编译条件.
$HOME/include里是否要加入Makefile.am,是根据你是否要安装这个头文件.

我的步骤是先autoscan,修改configure.scan,保存为configure.[ac][in],然后编辑Makefile.am,最后一把运行aclocal;autoheader;touch stamp-h;autoconf;"automake -a -c" .较复杂的配置我也是用那几个基本的检测宏来做.

具体的宏应该看文档,那里才有详细介绍,我凭映像也说的可能不准确.你可以找个开源包,分析一下目录结构和他提供的configure.in,config.h.in,makefile.am结合文档看.也可以找个结构类似的,把他的copy过来改改就能用了.
回复

使用道具 举报

 楼主| 发表于 2003-12-12 09:19:23 | 显示全部楼层
谢谢您提供的方法
回复

使用道具 举报

发表于 2003-12-12 23:24:14 | 显示全部楼层
呵呵.客气了.
autoconf和automake我也是刚入门而已(因为不会m4).只会一些简单的宏.检测一些库和软件包我主要是靠pkg-config提供的宏来实现.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-9 06:07 , Processed in 0.038476 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表