美文网首页Linux文档
利用automake和autoconf源码编译打包

利用automake和autoconf源码编译打包

作者: 一千年之逅 | 来源:发表于2018-09-19 09:05 被阅读0次

1.安装automake和autoconf

root@localhost]#yum install -y automake autoconf

2.进入需要被打包源码的目录

[root@localhost]# cd viscall
[root@localhost]# ls
base64.cpp  crypto.h  http.h   io.cpp  main.cpp  network.cpp  url.cpp  ymdevice.cpp  ymdocument.cpp  ymlog.cpp  ymlua.cpp  ymparam.cpp  ymtask.cpp
common.h    http.cpp  include  io.h    md5.cpp   network.h    url.h    ymdevice.h    ymdocument.h    ymlog.h    ymlua.h    ymparam.h    ymtask.h

3.利用autoconf工具生成makefile文件

[root@localhost]# autoscan
[root@localhost]# ls
autoscan.log  common.h        crypto.h  http.h   io.cpp  main.cpp  network.cpp  url.cpp  ymdevice.cpp  ymdocument.cpp  ymlog.cpp  ymlua.cpp  ymparam.cpp  ymtask.cpp
base64.cpp    configure.scan  http.cpp  include  io.h    md5.cpp   network.h    url.h    ymdevice.h    ymdocument.h    ymlog.h    ymlua.h    ymparam.h    ymtask.h
[root@localhost]# mv configure.scan configure.ac
[root@localhost]# vi configure.ac
#                                               -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.

AC_PREREQ([2.69])

#将AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS]) 修改为
AC_INIT(viscall, 2.0, admin@support.com)
#添加AM_INIT_AUTOMAKE([FULL-PACKAGE-NAME], [VERSION])
AM_INIT_AUTOMAKE(viscall,2.0)
AC_CONFIG_SRCDIR([base64.cpp])
AC_CONFIG_HEADERS([config.h])

# Checks for programs.
AC_PROG_CXX
AC_PROG_CC
    ...
AC_FUNC_MALLOC
AC_FUNC_REALLOC
AC_CHECK_FUNCS([floor gethostbyname gethostname gettimeofday inet_ntoa memchr memmove memset socket strchr strerror strrchr strstr strtoul])

#在AC_OUTPUT后面添加
AC_OUTPUT(Makefile)

·AC_PREREQ 宏声明本文件要求的autoconf版本,本例使用的版本为2.59。
·AC_INIT 宏用来定义软件的名称和版本等信息,”FULL-PACKAGE-NAME”为软件包名称,”VERSION”为软件版本号,”BUG-REPORT-ADDRESS”为BUG报告地址(一般为软件作者邮件地址)。
·AC_CONFIG_SRCDIR 宏用来侦测所指定的源码文件是否存在,来确定源码目录的有效性。
·AC_CONFIG_HEADER 宏用于生成config.h文件,以便autoheader使用。
·AC_PROG_CC 用来指定编译器,如果不指定,选用默认gcc。
·AC_OUTPUT 用来设定 configure 所要产生的文件,如果是makefile,configure会把它检查出来的结果带入makefile.in文件产生合适的makefile。使用Automake时,还需要一些其他的参数,这些额外的宏用aclocal工具产生。

修改完成后执行

[root@localhost]# aclocal
[root@localhost]# ls
autom4te.cache  base64.cpp  configure.ac  http.cpp  include  io.h      md5.cpp      network.h  url.h         ymdevice.h      ymdocument.h  ymlog.h    ymlua.h      ymparam.h   ymtask.h
autoscan.log    common.h    crypto.h      http.h    io.cpp   main.cpp  network.cpp  url.cpp    ymdevice.cpp  ymdocument.cpp  ymlog.cpp     ymlua.cpp  ymparam.cpp  ymtask.cpp
[root@localhost]# autoconf
[root@localhost]# ls
autom4te.cache  base64.cpp  configure     crypto.h  http.h   io.cpp  main.cpp  network.cpp  url.cpp  ymdevice.cpp  ymdocument.cpp  ymlog.cpp  ymlua.cpp  ymparam.cpp  ymtask.cpp
autoscan.log    common.h    configure.ac  http.cpp  include  io.h    md5.cpp   network.h    url.h    ymdevice.h    ymdocument.h    ymlog.h    ymlua.h    ymparam.h    ymtask.h

此时可以看到已经生成了configure

[root@localhost]# autoheader
[root@localhost]# ls
autom4te.cache  common.h     configure.ac  http.h   io.h      network.cpp  url.h         ymdocument.cpp  ymlog.h    ymparam.cpp  ymtask.h
autoscan.log    config.h.in  crypto.h      include  main.cpp  network.h    ymdevice.cpp  ymdocument.h    ymlua.cpp  ymparam.h
base64.cpp      configure    http.cpp      io.cpp   md5.cpp   url.cpp      ymdevice.h    ymlog.cpp       ymlua.h    ymtask.cpp

autoheader生成了configure.h.in如果在configure.ac中定义了AC_CONFIG_HEADER,那么此文件就需要;

4.创建Makefile.am并编写内容

[root@localhost]# vi Makefile.am
AUTOMAKE_OPTIONS=foreign
bin_PROGRAMS=viscall
viscall_SOURCES=./main.cpp \
                                ./ymparam.cpp \
                                ./ymdocument.cpp \
                                ./ymlog.cpp \
                                ./ymdevice.cpp \
                                ./md5.cpp \
                                ./base64.cpp \
                                ./url.cpp \
                                ./network.cpp \
                                ./io.cpp \
                                ./http.cpp \
                                ./ymlua.cpp \
                                ./ymtask.cpp
noinst_HEADERS=./common.h \
                                ./ymparam.h \
                                ./ymdocument.h \
                                ./ymlog.h \
                                ./ymdevice.h \
                                ./crypto.h \
                                ./url.h \
                                ./network.h \
                                ./io.h \
                                ./http.h \
                                ./ymlua.h \
                                ./ymtask.h
viscall_CPPFLAGS=-I./include -std=gnu++11
viscall_LDFLAGS=-export-dynamic -lcurl -llua -lpthread

· AUTOMAKE_OPTIONS 为设置Automake的选项。由于GNU对自己发布的软件有严格的规范,比如必须附带许可证声明文件COPYING等,否则Automake执行时会报错。Automake提供了3种软件等级:foreign、gnu和gnits,供用户选择,默认等级为gnu。本例使需用foreign等级,它只检测必须的文件。
· bin_PROGRAMS 定义要产生的执行文件名。如果要产生多个执行文件,每个文件名用空格隔开。
· viscall_SOURCES 定义”viscall”这个执行程序所需要的原始文件。

5.利用automake 生成Makefile.in

[root@localhost]# automake --add-missing
configure.ac:6: warning: AM_INIT_AUTOMAKE: two- and three-arguments forms are deprecated.  For more info, see:
configure.ac:6: http://www.gnu.org/software/automake/manual/automake.html#Modernize-AM_005fINIT_005fAUTOMAKE-invocation
configure.ac:6: installing './install-sh'
configure.ac:6: installing './missing'
Makefile.am:30: warning: 'INCLUDES' is the old name for 'AM_CPPFLAGS' (or '*_CPPFLAGS')
[root@localhost]# ls
aclocal.m4      base64.cpp   configure     depcomp   include     io.h         Makefile.in  network.cpp  url.h         ymdocument.cpp  ymlog.h    ymparam.cpp  ymtask.h
autom4te.cache  common.h     configure.ac  http.cpp  install-sh  main.cpp     md5.cpp      network.h    ymdevice.cpp  ymdocument.h    ymlua.cpp  ymparam.h
autoscan.log    config.h.in  crypto.h      http.h    io.cpp      Makefile.am  missing      url.cpp      ymdevice.h    ymlog.cpp       ymlua.h    ymtask.cpp

6.进行程序安装

[root@localhost]#./configure
checking for a BSD-compatible install... /bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /bin/mkdir -p
checking for gawk... gawk
checking whether make sets $(MAKE)... yes
checking whether make supports nested variables... yes
...
...
...
checking for strtoul... yes
checking that generated files are newer than configure... done
configure: creating ./config.status
config.status: creating Makefile
config.status: creating config.h
config.status: executing depfiles commands
[root@localhost]# make
cd . && /bin/sh /root/viscall-yueme/missing automake-1.13 --foreign Makefile
configure.ac:6: warning: AM_INIT_AUTOMAKE: two- and three-arguments forms are deprecated.  For more info, see:
configure.ac:6: http://www.gnu.org/software/automake/manual/automake.html#Modernize-AM_005fINIT_005fAUTOMAKE-invocation
 cd . && /bin/sh ./config.status Makefile depfiles
config.status: creating Makefile
config.status: executing depfiles commands
make  all-am
make[1]: Entering directory /root/viscall-yueme
g++ -DHAVE_CONFIG_H -I.  -I./include -std=gnu++11   -g -O2 -MT viscall-main.o -MD -MP -MF .deps/viscall-main.Tpo -c -o viscall-main.o `test -f './main.cpp' || echo './'`./main.cpp
mv -f .deps/viscall-main.Tpo .deps/viscall-main.Po
g++ -DHAVE_CONFIG_H -I.  -I./include -std=gnu++11   -g -O2 -MT viscall-ymparam.o -MD -MP -MF .deps/viscall-ymparam.Tpo -c -o viscall-ymparam.o `test -f './ymparam.cpp' || echo './'`./ymparam.cpp
mv -f .deps/viscall-ymparam.Tpo .deps/viscall-ymparam.Po
g++ -DHAVE_CONFIG_H -I.  -I./include -std=gnu++11   -g -O2 -MT viscall-ymdocument.o -MD -MP -MF .deps/viscall-ymdocument.Tpo -c -o viscall-ymdocument.o `test -f './ymdocument.cpp' || echo './'`./ymdocument.cpp
mv -f .deps/viscall-ymdocument.Tpo .deps/viscall-ymdocument.Po
g++ -DHAVE_CONFIG_H -I.  -I./include -std=gnu++11   -g -O2 -MT viscall-ymlog.o -MD -MP -MF .deps/viscall-ymlog.Tpo -c -o viscall-ymlog.o `test -f './ymlog.cpp' || echo './'`./ymlog.cpp
mv -f .deps/viscall-ymlog.Tpo .deps/viscall-ymlog.Po
g++ -DHAVE_CONFIG_H -I.  -I./include -std=gnu++11   -g -O2 -MT viscall-ymdevice.o -MD -MP -MF .deps/viscall-ymdevice.Tpo -c -o viscall-ymdevice.o `test -f './ymdevice.cpp' || echo './'`./ymdevice.cpp
...
...
...
mv -f .deps/viscall-ymtask.Tpo .deps/viscall-ymtask.Po
g++  -g -O2 -export-dynamic -lcurl -llua -lpthread  -o viscall viscall-main.o viscall-ymparam.o viscall-ymdocument.o viscall-ymlog.o viscall-ymdevice.o viscall-md5.o viscall-base64.o viscall-url.o viscall-network.o viscall-io.o viscall-http.o viscall-ymlua.o viscall-ymtask.o  
make[1]: Leaving directory /root/viscall-yueme
[root@localhost]#ls
[root@localhost]# ls
aclocal.m4      config.h       configure.ac  include     Makefile     network.cpp  viscall           viscall-md5.o         viscall-ymlog.o    ymdevice.h      ymlua.cpp    ymtask.h
autom4te.cache  config.h.in    crypto.h      install-sh  Makefile.am  network.h    viscall-base64.o  viscall-network.o     viscall-ymlua.o    ymdocument.cpp  ymlua.h
autoscan.log    config.log     depcomp       io.cpp      Makefile.in  stamp-h1     viscall-http.o    viscall-url.o         viscall-ymparam.o  ymdocument.h    ymparam.cpp
base64.cpp      config.status  http.cpp      io.h        md5.cpp      url.cpp      viscall-io.o      viscall-ymdevice.o    viscall-ymtask.o   ymlog.cpp       ymparam.h
common.h        configure      http.h        main.cpp    missing      url.h        viscall-main.o    viscall-ymdocument.o  ymdevice.cpp       ymlog.h         ymtask.cpp 

在目录中生成viscall的执行文件

打包源码

[root@localhost]# make dist
make  dist-gzip am__post_remove_distdir='@:'
make[1]: Entering directory /root/viscall-yueme
if test -d "viscall-2.0"; then find "viscall-2.0" -type d ! -perm -200 -exec chmod u+w {} ';' && rm -rf "viscall-2.0" || { sleep 5 && rm -rf "viscall-2.0"; }; else :; fi
test -d "viscall-2.0" || mkdir "viscall-2.0"
test -n "" \
|| find "viscall-2.0" -type d ! -perm -755 \
    -exec chmod u+rwx,go+rx {} \; -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 /root/viscall-yueme/install-sh -c -m a+r {} {} \; \
|| chmod -R a+r "viscall-2.0"
tardir=viscall-2.0 && ${TAR-tar} chof - "$tardir" | GZIP=--best gzip -c >viscall-2.0.tar.gz
make[1]: Leaving directory /root/viscall-yueme
if test -d "viscall-2.0"; then find "viscall-2.0" -type d ! -perm -200 -exec chmod u+w {} ';' && rm -rf "viscall-2.0" || { sleep 5 && rm -rf "viscall-2.0"; }; else :; fi
[root@localhost]# ls
aclocal.m4      config.h       configure.ac  include     Makefile     network.cpp  viscall             viscall-main.o      viscall-ymdocument.o  ymdevice.cpp    ymlog.h      ymtask.cpp
autom4te.cache  config.h.in    crypto.h      install-sh  Makefile.am  network.h    viscall-2.0.tar.gz  viscall-md5.o       viscall-ymlog.o       ymdevice.h      ymlua.cpp    ymtask.h
autoscan.log    config.log     depcomp       io.cpp      Makefile.in  stamp-h1     viscall-base64.o    viscall-network.o   viscall-ymlua.o       ymdocument.cpp  ymlua.h
base64.cpp      config.status  http.cpp      io.h        md5.cpp      url.cpp      viscall-http.o      viscall-url.o       viscall-ymparam.o     ymdocument.h    ymparam.cpp
common.h        configure      http.h        main.cpp    missing      url.h        viscall-io.o        viscall-ymdevice.o  viscall-ymtask.o      ymlog.cpp       ymparam.h

执行命令后会生成viscall-2.0.tar.gz文件

相关文章

网友评论

    本文标题:利用automake和autoconf源码编译打包

    本文链接:https://www.haomeiwen.com/subject/yfmpnftx.html