分类:
2008-07-13 15:55:40
最近开始学习linux c开发,对autotools比较感兴趣,所以找了一些国外的文档看了看,然后自己做了小例子,在这里跟大家分享。 1、准备: 需要工具autoscan aclocal autoheader automake autoconf make 等工具. 2、测试程序编写: 建立目录:mkdir include src 编写程序:include/str.h #include int str(char *string); 编写程序:src/str.c #include "str.h" (这里应该改成#include "../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) 为 CODE: AC_INIT(str,0.0.1, [bug@sounos.org]) FULL-PACKAGE-NAME 为程序名称,VERSION为当前版本, BUG-REPORT-ADDRESS为bug汇报地址 添加AM_INIT_AUTOMAKE 添加AC_CONFIG_FILES([Makefile]) CODE: # -*- 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 CODE: [root@localhost str]# aclocal /usr/share/aclocal/libfame.m4:6: warning: underquoted definition of AM_PATH_LIBFAME run info '(automake)Extending aclocal' or see 5、制作Makefile.am CODE: [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 CODE: [root@localhost str]# autoheader 7、automake必须文件: CODE: * install-sh * missing * INSTALL * NEWS * README * AUTHORS * ChangeLog * COPYING * depcomp 其中 CODE: * install-sh * missing * INSTALL * COPYING * depcomp 可以通过automake -a选项自动生成,所以这里只需要建立如下文件 CODE: [root@localhost str]# touch NEWS README AUTHORS ChangeLog 8、执行automake CODE: [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 CODE: [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 CODE: [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 CODE: [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 CODE: [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、测试程序: CODE: [root@localhost str]# /u/bin/str Please INPUT something end by [ENTER] abcksdhfklsdklfdjlkfd ----PRINT STRING---- "abcksdhfklsdklfdjlkfd" 结束语:这只是一个小例子,如果要把这个用得很好需要不断的磨练。。。。呵呵,见笑了。 ----------------------------------------------------------------------- 添加测试包: CODE: [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 = CODE: #Automake interface SUBDIRS = src 支持静态库Makefile.am EXTRA_DIST 用于添加除源码外的文件到dist包 CODE: #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 CODE: 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 |