您的位置:首页 > 运维架构 > Linux

linux c 一个autotools的最简单例子

2013-11-10 11:53 288 查看
  1、准备:
     需要工具autoscan aclocal autoheader automake autoconf make 等工具.
  2、测试程序编写:
     建立目录:mkdir include src
     编写程序:include/str.h

#include <stdio.h>

int str(char *string);

      编写程序:src/str.c

#include "str.h"

//print string

int str(char *string){

        printf("\n----PRINT STRING----\n\"%s\"\n",string);

        return 0;

}

//interface of this program

int main(int argc , char **argv){

        char str_read[1024];

        printf("Please INPUT something end by [ENTER]\n");

        scanf("%s",str_read);

        return str(str_read );

}

  3、生成configure.ac
    configure.ac是automake的输入文件,所以必须先生成该文件。
    执行命令:

[root@localhost str]# ls

include  src

[root@localhost str]# autoscan

autom4te: configure.ac: no such file or directory

autoscan: /usr/bin/autom4te failed with exit status: 1

[root@localhost str]# ls

autoscan.log  configure.scan  include  src

[root@localhost str]# cp configure.scan configure.ac

    修改 configure.ac 

#                                               -*- Autoconf -*-

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

AC_PREREQ(2.59)

AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)

AC_CONFIG_SRCDIR([include/str.h])

AC_CONFIG_HEADER([config.h])

# Checks for programs.

AC_PROG_CC

# Checks for libraries.

# Checks for header files.

# Checks for typedefs, structures, and compiler characteristics.

# Checks for library functions.

AC_OUTPUT

     修改

AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)

      为

AC_INIT(str,0.0.1, [bug@sounos.org])

FULL-PACKAGE-NAME 为程序名称,VERSION为当前版本, BUG-REPORT-ADDRESS为bug汇报地址
    添加AM_INIT_AUTOMAKE 
    添加AC_CONFIG_FILES([Makefile])

#                                               -*- Autoconf -*-

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

AC_PREREQ(2.59)

#AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)

AC_INIT(str, 0.0.1, [bug@sounos.org])

AM_INIT_AUTOMAKE

AC_CONFIG_SRCDIR([include/str.h])

AC_CONFIG_HEADER([config.h])

# Checks for programs.

AC_PROG_CC

# Checks for libraries.

# Checks for header files.

# Checks for typedefs, structures, and compiler characteristics.

# Checks for library functions.

AC_CONFIG_FILES([Makefile])

AC_OUTPUT

4、执行aclocal

[root@localhost str]# aclocal

/usr/share/aclocal/libfame.m4:6: warning: underquoted definition of AM_PATH_LIBFAME

  run info '(automake)Extending aclocal'

  or see http://sources.redhat.com/automake/automake.html#Extending-aclocal
5、制作Makefile.am

[root@localhost str]# cat Makefile.am

#Makefile.am

bin_PROGRAMS    = str

str_SOURCES     = include/str.h src/str.c

str_CPPFLAGS    = -I include/

6、autoheader

[root@localhost str]# autoheader

7、automake必须文件:

    *  install-sh

    * missing

    * INSTALL

    * NEWS

    * README

    * AUTHORS

    * ChangeLog

    * COPYING

    * depcomp

其中 

    * install-sh

    * missing

    * INSTALL

    * COPYING

    * depcomp

可以通过automake -a选项自动生成,所以这里只需要建立如下文件

[root@localhost str]# touch NEWS README AUTHORS ChangeLog

8、执行automake

[root@localhost str]# automake -a

configure.ac: installing `./install-sh'

configure.ac: installing `./missing'

Makefile.am: installing `./INSTALL'

Makefile.am: installing `./COPYING'

Makefile.am: installing `./compile'

Makefile.am: installing `./depcomp'

9、autoconf

[root@localhost str]# autoconf

[root@localhost str]# ls

aclocal.m4      autoscan.log  config.h.in   configure.scan  include     Makefile.am  NEWS

AUTHORS         ChangeLog     configure     COPYING         INSTALL     Makefile.in  README

autom4te.cache  compile       configure.ac  depcomp         install-sh  missing      src

10、执行测试:
      执行./configure

[root@localhost str]# ./configure --prefix=/u

checking for a BSD-compatible install... /usr/bin/install -c

checking whether build environment is sane... yes

checking for gawk... gawk

checking whether make sets $(MAKE)... yes

checking for gcc... gcc

checking for C compiler default output file name... a.out

checking whether the C compiler works... yes

checking whether we are cross compiling... no

checking for suffix of executables...

checking for suffix of object files... o

checking whether we are using the GNU C compiler... yes

checking whether gcc accepts -g... yes

checking for gcc option to accept ANSI C... none needed

checking for style of include used by make... GNU

checking dependency style of gcc... gcc3

configure: creating ./config.status

config.status: creating Makefile

config.status: creating config.h

config.status: config.h is unchanged

config.status: executing depfiles commands

       执行 make

[root@localhost str]# make

make  all-am

make[1]: Entering directory `/data/devel/c/str'

if gcc -DHAVE_CONFIG_H -I. -I. -I.  -I include/   -g -O2 -MT str-str.o -MD -MP -MF ".deps/str-str.Tpo" -c -o str-str.o `test -f 'src/str.c' || echo './'`src/str.c; \

then mv -f ".deps/str-str.Tpo" ".deps/str-str.Po"; else rm -f ".deps/str-str.Tpo"; exit 1; fi

gcc  -g -O2   -o str  str-str.o

make[1]: Leaving directory `/data/devel/c/str'

         执行 make install

[root@localhost str]# make install

make[1]: Entering directory `/data/devel/c/str'

test -z "/u/bin" || mkdir -p -- "/u/bin"

  /usr/bin/install -c 'str' '/u/bin/str'

make[1]: Nothing to be done for `install-data-am'.

make[1]: Leaving directory `/data/devel/c/str'     

11、测试程序:

[root@localhost str]# /u/bin/str

Please INPUT something end by [ENTER]

abcksdhfklsdklfdjlkfd

----PRINT STRING----

"abcksdhfklsdklfdjlkfd"

结束语:这只是一个小例子,如果要把这个用得很好需要不断的磨练。。。。呵呵,见笑了。

-----

添加测试包:

[root@localhost str]# make dist-gzip

{ test ! -d str-0.0.1 || { find str-0.0.1 -type d ! -perm -200 -exec chmod u+w {} ';' && rm -fr str-0.0.1; }; }

mkdir str-0.0.1

find str-0.0.1 -type d ! -perm -777 -exec chmod a+rwx {} \; -o \

  ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \

  ! -type d ! -perm -400 -exec chmod a+r {} \; -o \

  ! -type d ! -perm -444 -exec /bin/sh /data/devel/c/str/install-sh -c -m a+r {} {} \; \

|| chmod -R a+r str-0.0.1

tardir=str-0.0.1 && /bin/sh /data/devel/c/str/missing --run tar chof - "$tardir" | GZIP=--best gzip -c >str-0.0.1.tar.gz

{ test ! -d str-0.0.1 || { find str-0.0.1 -type d ! -perm -200 -exec chmod u+w {} ';' && rm -fr str-0.0.1; }; }

添加一个支持子目录、静态库、自定义configure选项的包

支持子目录Makefile.am 选项 SUBDIR = 

#Automake interface 

SUBDIRS = src

支持静态库Makefile.am
EXTRA_DIST  用于添加除源码外的文件到dist包

#Automake interface

bin_PROGRAMS = hello

hello_SOURCES = hello.c lib/sbase.h

hello_CPPFLAGS = -I lib

hello_LDFLAGS = -static lib/libsbase.a

EXTRA_DIST = lib/libsbase.a

configure.ac

AC_PREREQ(2.59)

#AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)

AC_INIT(hello, 0.0.1, [SounOS@gmail.com])

#AM 声明

AM_INIT_AUTOMAKE

AC_CONFIG_SRCDIR([src/hello.c])

AC_CONFIG_HEADER([config.h])

# Checks for programs.

AC_PROG_CC

# Checks for libraries.

# Checks for header files.

AC_HEADER_STDC

AC_CHECK_HEADERS([stdint.h stdlib.h sys/socket.h])

# Checks for typedefs, structures, and compiler characteristics.

AC_C_CONST

AC_TYPE_SIZE_T

AC_TYPE_UINT32_T

AC_TYPE_UINT64_T

#用于自定义configure 选项,见acinclude.am

AC_CHECK_EXTRA_OPTIONS

# Checks for library functions.

AC_CONFIG_FILES([Makefile

                 src/Makefile])

AC_OUTPUT
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: