相信每个学习Linux的人都知道Makefile,这是一个很有用的东西,但是编写它是比较复杂,今天介绍一个它的自动生成工具,autotools的使用。很多GNULinux的的软件都是用它生成Makefile的,包括我们非常熟悉的Linux内核源代码。
需要工具
autoscan
aclocal
autoheader
automake
autoconf
auto make
在终端敲入命令,哪个没有安装哪个,一般是第一个autoscan没有,其它的我用的Ubuntu10.04下全部都有
编写程序:include/str.h
#include <stdio.h> int str(char *string);
#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 ); }
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
# -*- 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, [[email protected]])
然后添加两句话:
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, [[email protected]]) 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
[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
[root@localhost str]# vi 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
* install-sh * missing * INSTALL * NEWS * README * AUTHORS * ChangeLog * COPYING * depcomp
* install-sh * missing * INSTALL * COPYING * depcomp
[root@localhost str]# touch NEWS README AUTHORS ChangeLog
[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'
[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
[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
[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'
[root@localhost str]# ./str Please INPUT something end by [ENTER] abcksdhfklsdklfdjlkfd ----PRINT STRING---- "abcksdhfklsdklfdjlkfd"
执行 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'
这样生成了一个自动的Makefile。