linux c 一个autotools的最简单例子

linux c 一个autotools的最简单例子

   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.in
   

configure.in是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.in 

修改 configure.in
#                                                -*- 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 {}  \ - \
  
!   - type d  !   - perm  - 444   - links  1   - exec   chmod  a + r {}  \ - \
  
!   - type d  !   - perm  - 400   - exec   chmod  a + r {}  \ - \
  
!   - type d  !   - perm  - 444   - exec   / bin / sh  / data / devel / c / str / install - sh  - - 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  - > 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.in
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

你可能感兴趣的:(linux c 一个autotools的最简单例子)