原创 使用autotools减轻可移植的工作负担

2009-5-27 20:56 2080 5 5 分类: 软件与OS
rar
autoconf可以减轻可移植的工作负担
理解autoconf
使用者只需键入”./configure”为了生成configure脚本,需要在源文件树的根目录下创建configure.in的文件。
创建configure.in
每个configure.in文件必须在开始所有测试前调用AC_INIT,并且在结束后调用AC_OUTPUT。AC_INIT语法如下:
AC_INIT(unique_file_in_source_dir)
unique_file_in_source_dir是在源代码下的一个文件,对AC_INIT的调用在所产生的配置脚本文件中生成一条shell命令,通过检查unique_file_in_source_dir是否存在来验证当前目录是否正确。
AC_OUTPUT创建名为makefile或其他名字(可选)的输出文件,语法如下:
AC_OUTPUT([file...[,extra_cmds[,init_cmds]]])
其中file是用空格分隔的输出文件列表,通过file.in到file来生成这些文件。extra_cmds是一个命令列表,附加在config.status之后,在重新生成配置脚本时会用到。init_cmds也将插入到config.status中,但其位置正好在extra_cmds之前。
构造文件
AC_INIT
AC_OUTPUT
有用的autoconf工具
在测试开始前,可以用Perl脚本autoscan从源文件中抽取与函数调用和头文件有关的信息,并将其输出到configure.scan文件中,完整语法:
autosccan [—maccrodir=dir] [—help] [—verbose] [—version] [srcdir]
大多数情况下,只在源代码树的根目录下执行autosccan 就足够了。ifnames查找源文件中的预处理指令,可以增加autoscan的输出,语法:
Usage: ifnames [-h] [—help] [-m dir] [—maccrodir=dir] [—version] [file...]
关键的参数是file...,它是要扫描的文件名列表,列表可以包含一个或多个文件名。
$autoscan
$cat configure.scan
$ifnames *.c
autotools使用流程
1、autoscan
yannzi@pc:~/桌面/hello (复件)$ autoscan
yannzi@pc:~/桌面/hello (复件)$ ls
autoscan.log  config.h.in~  configure.scan  hello.c

2、autoconf
修改configure.scan
  5 #The next one is modified 用来定义软件名和版本等信息
  6 #AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS])
  7 AC_INIT(hello,1.0)
  8 #The next one is added 是automake所必备的宏,软件名+版本号
  9 AM_INIT_AUTOMAKE(hello,1.0)

 23 #The next is added 用于生成相应的Makefile
 24 AC_CONFIG_FILES([Makefile])

yannzi@pc:~/桌面/hello (复件)$ cp configure.scan configure.in
yannzi@pc:~/桌面/hello (复件)$ aclocal
annzi@pc:~/桌面/hello (复件)$ autoconf
yannzi@pc:~/桌面/hello (复件)$ ls
aclocal.m4      autoscan.log  configure     configure.scan
autom4te.cache  config.h.in~  configure.in  hello.c
生成configure
3、autoheader
yannzi@pc:~/桌面/hello (复件)$ autoheader

4、automake
编写Makefile.am
AUTOMAKE_OPTIONS=foreign
bin_PROGRAMS= hello
hello_SOURCES= hello.c

yannzi@pc:~/桌面/hello (复件)$ automake --add-missing
configure.in:9: installing `./install-sh'
configure.in:9: installing `./missing'
Makefile.am: installing `./depcomp'
yannzi@pc:~/桌面/hello (复件)$ ls
aclocal.m4      config.h.in   configure.in    hello.c      Makefile.in
autom4te.cache  config.h.in~  configure.scan  install-sh   Makefile.in~
autoscan.log    configure     depcomp         Makefile.am  missing
生成了configure.in

5、运行configure
yannzi@pc:~/桌面/hello (复件)$ ./configure
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
./configure: eval: line 1965: syntax error near unexpected token `('
./configure: eval: line 1965: `${SHELL} /home/yannzi/桌面/hello (复件)/missing --run true'
configure: WARNING: `missing' script is too old or missing
checking for a thread-safe mkdir -p... /bin/mkdir -p
checking for gawk... no
checking for mawk... mawk
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 ISO C89... 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: executing depfiles commands

使用autotools生成的Makefile
1、make
yannzi@pc:~/桌面/hello (复件)$ make
make  all-am
make[1]: 正在进入目录 `/home/yannzi/桌面/hello (复件)'
gcc -DHAVE_CONFIG_H -I.     -g -O2 -MT hello.o -MD -MP -MF .deps/hello.Tpo -c -o hello.o hello.c
mv -f .deps/hello.Tpo .deps/hello.Po
gcc  -g -O2   -o hello hello.o 
make[1]:正在离开目录 `/home/yannzi/桌面/hello (复件)'
yannzi@pc:~/桌面/hello (复件)$
yannzi@pc:~/桌面/hello (复件)$ ./hello
Hello autotools
2、make install
yannzi@pc:~/桌面/hello (复件)$ sudo make install
[sudo] password for yannzi:
make[1]: 正在进入目录 `/home/yannzi/桌面/hello (复件)'
test -z "/usr/local/bin" || /bin/mkdir -p "/usr/local/bin"
  /usr/bin/install -c 'hello' '/usr/local/bin/hello'
make[1]: 没有什么可以做的为 `install-data-am'。
make[1]:正在离开目录 `/home/yannzi/桌面/hello (复件)'

3、make clean
4、make dist

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
5
关闭 站长推荐上一条 /3 下一条