天天看點

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

#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  

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(str,0.0.1, [[email protected]])  

其中:FULL-PACKAGE-NAME 為程式名稱,VERSION為目前版本, BUG-REPORT-ADDRESS為bug彙報位址

然後添加兩句話:

    AM_INIT_AUTOMAKE

    AC_CONFIG_FILES([Makefile])

結果如下:(兩句話不是在一起的)

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

AC_INIT(str, 0.0.1, [[email protected]])  

AM_INIT_AUTOMAKE  

AC_CONFIG_FILES([Makefile])  

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]# vi Makefile.am  

#Makefile.am  

bin_PROGRAMS    = str  

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

str_CPPFLAGS    = -I include/  

automake 這個指令需要用到這個配置檔案。各個選項意思比較直覺,不多說。

6、autoheader

[root@localhost str]# autoheader  

7、automake必須檔案:

*  install-sh  

* missing  

* INSTALL  

* NEWS  

* README  

* AUTHORS  

* ChangeLog  

* COPYING  

* depcomp   

其中,以下檔案在執行automake -a的時候會自動生成

* install-sh  

是以,接下來手動生成剩下的檔案

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

8、執行automake -a

[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  

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'  

此時已經生成了 str(可執行檔案名字在前面設定Makefile.am的參數時候去頂)這個,可以通過./str直接看到運作結果

[root@localhost str]# ./str  

Please INPUT something end by [ENTER]  

abcksdhfklsdklfdjlkfd  

----PRINT STRING----  

"abcksdhfklsdklfdjlkfd"  

不過這裡我們都做一步,把它安裝到系統裡面,這樣我們隻要在終端輸入str就可以運作程式了。

 執行 make install:

[root@localhost str]# make install  

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'       

接下來你可以make clean 清除安裝的那些.o 檔案了。

這樣生成了一個自動的Makefile。

繼續閱讀