zoukankan      html  css  js  c++  java
  • Makefile自动生成工具-----autotools的使用(详细)

    相信每个学习Linux的人都知道Makefile,这是一个很有用的东西,但是编写它是比较复杂,今天介绍一个它的自动生成工具,autotools的使用。很多GNULinux的的软件都是用它生成Makefile的,包括我们非常熟悉的Linux内核源代码。

      1、准备:

      需要工具

      autoscan

      aclocal

      autoheader 

      automake

      autoconf

      auto make 

      在终端敲入命令,哪个没有安装哪个,一般是第一个autoscan没有,其它的我用的Ubuntu10.04下全部都有

      2、测试程序编写:
         建立目录:mkdir include src

         编写程序:include/str.h

    [cpp] view plaincopy
     
    1. #include <stdio.h>  
    2. int str(char *string);  


        编写程序:src/str.c

    [cpp] view plaincopy
     
    1. #include "str.h"  
    2. //print string  
    3. int str(char *string){  
    4.         printf(" ----PRINT STRING---- "%s" ",string);  
    5.         return 0;  
    6. }  
    7.   
    8. //interface of this program  
    9. int main(int argc , char **argv){  
    10.         char str_read[1024];  
    11.         printf("Please INPUT something end by [ENTER] ");  
    12.         scanf("%s",str_read);  
    13.         return str(str_read );  
    14. }  
    15.   
    16.        


      3、生成configure.ac

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

    [cpp] view plaincopy
     
    1. [root@localhost str]# ls  
    2. include  src  
    3. [root@localhost str]# autoscan  
    4. autom4te: configure.ac: no such file or directory  
    5. autoscan: /usr/bin/autom4te failed with exit status: 1  
    6. [root@localhost str]# ls  
    7. autoscan.log  configure.scan  include  src  
    8. [root@localhost str]# cp configure.scan configure.ac   


        修改 configure.ac 

    [cpp] view plaincopy
     
    1. #                                               -*- Autoconf -*-  
    2. # Process this file with autoconf to produce a configure script.  
    3.   
    4. AC_PREREQ(2.59)  
    5. AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)  
    6. AC_CONFIG_SRCDIR([include/str.h])  
    7. AC_CONFIG_HEADER([config.h])  
    8.   
    9. # Checks for programs.  
    10. AC_PROG_CC  
    11.   
    12. # Checks for libraries.  
    13.   
    14. # Checks for header files.  
    15.   
    16. # Checks for typedefs, structures, and compiler characteristics.  
    17.   
    18. # Checks for library functions.  
    19. AC_OUTPUT  




    修改

    [cpp] view plaincopy
     
    1. AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)  


    改为:

    [cpp] view plaincopy
     
    1. AC_INIT(str,0.0.1, [bug@sounos.org])  


    其中:FULL-PACKAGE-NAME 为程序名称,VERSION为当前版本, BUG-REPORT-ADDRESS为bug汇报地址

    然后添加两句话:

        AM_INIT_AUTOMAKE
        AC_CONFIG_FILES([Makefile])

    结果如下:(两句话不是在一起的)

    [cpp] view plaincopy
     
    1. #                                               -*- Autoconf -*-  
    2. # Process this file with autoconf to produce a configure script.  
    3.   
    4. AC_PREREQ(2.59)  
    5. #AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)  
    6. AC_INIT(str, 0.0.1, [bug@sounos.org])  
    7. AM_INIT_AUTOMAKE  
    8. AC_CONFIG_SRCDIR([include/str.h])  
    9. AC_CONFIG_HEADER([config.h])  
    10.   
    11. # Checks for programs.  
    12. AC_PROG_CC  
    13.   
    14. # Checks for libraries.  
    15.   
    16. # Checks for header files.  
    17.   
    18. # Checks for typedefs, structures, and compiler characteristics.  
    19.   
    20. # Checks for library functions.  
    21. AC_CONFIG_FILES([Makefile])  
    22. AC_OUTPUT  



    4、执行aclocal

    [cpp] view plaincopy
     
    1. [root@localhost str]# aclocal  
    2. /usr/share/aclocal/libfame.m4:6: warning: underquoted definition of AM_PATH_LIBFAME  
    3.   run info '(automake)Extending aclocal'  
    4.   or see http://sources.redhat.com/automake/automake.html#Extending-aclocal  


    5、制作Makefile.am

    [cpp] view plaincopy
     
    1. [root@localhost str]# vi Makefile.am  
    2. #Makefile.am  
    3. bin_PROGRAMS    = str  
    4. str_SOURCES     = include/str.h src/str.c  
    5. str_CPPFLAGS    = -I include/  


    automake 这个命令需要用到这个配置文件。各个选项意思比较直观,不多说。

    6、autoheader

    [cpp] view plaincopy
     
    1. [root@localhost str]# autoheader  


    7、automake必须文件:

    [cpp] view plaincopy
     
    1. *  install-sh  
    2. * missing  
    3. * INSTALL  
    4. * NEWS  
    5. * README  
    6. * AUTHORS  
    7. * ChangeLog  
    8. * COPYING  
    9. * depcomp   


    其中,以下文件在执行automake -a的时候会自动生成

    [cpp] view plaincopy
     
    1. * install-sh  
    2. * missing  
    3. * INSTALL  
    4. * COPYING  
    5. * depcomp   


    所以,接下来手动生成剩下的文件

    [cpp] view plaincopy
     
    1. [root@localhost str]# touch NEWS README AUTHORS ChangeLog  


    8、执行automake -a

    [cpp] view plaincopy
     
    1. [root@localhost str]# automake -a  
    2. configure.ac: installing `./install-sh'  
    3. configure.ac: installing `./missing'  
    4. Makefile.am: installing `./INSTALL'  
    5. Makefile.am: installing `./COPYING'  
    6. Makefile.am: installing `./compile'  
    7. Makefile.am: installing `./depcomp'  


    9、autoconf

    [cpp] view plaincopy
     
    1. [root@localhost str]# autoconf  
    2. [root@localhost str]# ls  
    3. aclocal.m4      autoscan.log  config.h.in   configure.scan  include     Makefile.am  NEWS  
    4. AUTHORS         ChangeLog     configure     COPYING         INSTALL     Makefile.in  README  
    5. autom4te.cache  compile       configure.ac  depcomp         install-sh  missing      src  


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

    [cpp] view plaincopy
     
    1. [root@localhost str]# ./configure --prefix=/u  
    2. checking for a BSD-compatible install... /usr/bin/install -c  
    3. checking whether build environment is sane... yes  
    4. checking for gawk... gawk  
    5. checking whether make sets $(MAKE)... yes  
    6. checking for gcc... gcc  
    7. checking for C compiler default output file name... a.out  
    8. checking whether the C compiler works... yes  
    9. checking whether we are cross compiling... no  
    10. checking for suffix of executables...  
    11. checking for suffix of object files... o  
    12. checking whether we are using the GNU C compiler... yes  
    13. checking whether gcc accepts -g... yes  
    14. checking for gcc option to accept ANSI C... none needed  
    15. checking for style of include used by make... GNU  
    16. checking dependency style of gcc... gcc3  
    17. configure: creating ./config.status  
    18. config.status: creating Makefile  
    19. config.status: creating config.h  
    20. config.status: config.h is unchanged  
    21. config.status: executing depfiles commands  


    执行 make

    [cpp] view plaincopy
     
    1. [root@localhost str]# make  
    2. make  all-am  
    3. make[1]: Entering directory `/data/devel/c/str'  
    4. 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;   
    5. then mv -f ".deps/str-str.Tpo" ".deps/str-str.Po"; else rm -f ".deps/str-str.Tpo"; exit 1; fi  
    6. gcc  -g -O2   -o str  str-str.o  
    7. make[1]: Leaving directory `/data/devel/c/str'  


    此时已经生成了 str(可执行文件名字在前面设置Makefile.am的参数时候去顶)这个,可以通过./str直接看到运行结果

    [cpp] view plaincopy
     
    1. [root@localhost str]# ./str  
    2. Please INPUT something end by [ENTER]  
    3. abcksdhfklsdklfdjlkfd  
    4.   
    5. ----PRINT STRING----  
    6. "abcksdhfklsdklfdjlkfd"  


    不过这里我们都做一步,把它安装到系统里面,这样我们只要在终端输入str就可以运行程序了。

     执行 make install:

    [cpp] view plaincopy
     
    1. [root@localhost str]# make install  
    2. make[1]: Entering directory `/data/devel/c/str'  
    3. test -z "/u/bin" || mkdir -p -- "/u/bin"  
    4.   /usr/bin/install -c 'str' '/u/bin/str'  
    5. make[1]: Nothing to be done for `install-data-am'.  
    6. make[1]: Leaving directory `/data/devel/c/str'       


    接下来你可以make clean 清除安装的那些.o 文件了。

    这样生成了一个自动的Makefile。

  • 相关阅读:
    linux
    查看字符的编码数字
    各种语系的unicode对应以及local编码方式
    Unicode字符集,各个语言的区间
    深入理解Python的字符编码
    php 快排
    归并排序
    检测到在集成的托管管道模式下不适用的 ASP.NET 设置的解决方法
    分布式缓存MemcacheHelper
    单例模式
  • 原文地址:https://www.cnblogs.com/lidabo/p/3805864.html
Copyright © 2011-2022 走看看