免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 739 | 回复: 0
打印 上一主题 下一主题

automake 小回顾 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-04-29 14:09 |只看该作者 |倒序浏览

现在google Makefile 和 automake就能找到一些文章。以一个Hello 程序描述为一个project生成Makefile的过程。
这个例子其实在 Info automake 里能看到。大家把它翻成中文的,不错。
但实际上按照这个例子来做的话,步骤都对,就是太简单,一些常用的设置需要写进去,但是没有提到,还是要自己info , google ,try .
下面是我对Automake一个小总结。
现在google Makefile 和 automake就能找到一些文章。以一个Hello 程序描述为一个project生成Makefile的过程。
这个例子其实在 Info automake 里能看到。大家把它翻成中文的,不错。
但实际上按照这个例子来做的话,步骤都对,就是太简单,一些常用的设置需要写进去,但是没有提到,还是要自己info , google ,try .
下面是我对Automake一个小总结。
1  步骤总述
   (1) autoscan 生成configure.scan .
   (2) 在configure.scan基础上手动编辑,主要要添加的 :
         AM_INIT_AUTOMAKE(myprojectname , version)
         AC_OUTPUT( 最后要生成的Makefile , 包括 子目录中的,中间用空格隔开) , 例如 AC_OUTPUT(Makefile  subdir/Makefile
subdir1/Makefile)

  AC_PROG_RANLIB (意义见第四条末尾)
   (3) aclocal
        autoconf  
                   生成configure脚本。
   (4) 这步我基本靠手,呵呵,有没有脚本来完成这个的?就是在每个最后需要生成Makefile的目录中,写一个Makefile.am .
        最上层的要写明
        AUTOMAKE_OPTIONS = foreign

如果这个目录没有要编译的文件 ,只包含了子目录,则只写个
        SUBDIRS  = dir1   

就ok了。
例如我的工程,最上层只是包含了源码目录,于是就写了
AUTOMAKE_OPTIONS=foreign
SUBDIRS=src

        如果有文件要编译,则要指明target 先。比如我的src目录底下既有文件,又有目录,而src的这层目录中的文件最后是要编译成一个
可执行文件,则src目录下的Makefile.am这么写。
bin_PROGRAMS= myprogram
SUBDIRS= sub1
  myprogram_SOURCES=
     a.cpp
   b.cpp
# 要编译的源文件。这儿的_SOURCES是关键字
EXTRA_DIST=
  a.h
  b.h
# 不用编成.o,但生成target myprogram也需要给编译器处理的头文件放这里
        myprogram_LDADD = libsub1.a 这个_LDADD是关键字,
# 最后生成myprogram这个执行文件,还要link src/sub1这个目录中的内容编成的一个lib :libsub1.a,

myprogram_LDFLAGS = -lpthread -lglib-2.0 -L/usr/bin $(all_libraries)
# myprogram还要link系统中的动态so,以此类推,需要连自编译的so,也写到这个关键字 _LDFLAGS后面就好了。
  
AM_CXXFLAGS = -D_LINUX
# 传递给g++编译器的一些编译宏定义,选项,
INCLUDES=-IPassport -Isub1/ -I/usr/include/glib-2.0
    -I/usr/lib/glib-2.0/include $(all_includes)
#  传递给编译器的头文件路径。
下面是sub1种生成lib的Makefile.am
noinst_LIBRARIES = libprotocol.a
# 不是生成可执行文件,而是静态库,target用noinst_LIBRARIES
libprotocol_a_SOURCES =
  alib.cpp
EXTRA_DIST = mylib.h
   alib.h
INCLUDES= -I../ $(all_includes)
AM_CXXFLAGS = -D_LINUX -DONLY_EPOLL -D_SERVER

ok ,最后补上AC_PROG_RANLIB涵义,如果要自己生成lib,然后link到最终的可执行文件中,则要加上这个宏,否则不用。
2   一点讨论
每个目录至少都要有一个target,或者是可执行文件或者是lib,似乎对目录的划分带来点局限。
比如我的目录结构如果是这样
./Src
./Src/sub1
./Src/sub2
而我想这样,sub1,sub2都没有target,目录划分只是为了区别代码的不同模块,然后把两个目录中编译出的中间文件一起link
,得到最后需要的 myprogram 。
似乎在Src/Makefile.am中要这么写
myprogram_SOURCES = sub1/a.cpp
   sub2/b.cpp
可以实现,但我没试,:P
当然和设成先编译出libsub1.a libsub2.a 最后Link得到myprogram 没有本质区别了。
3    剩下的就是
     automake --add-missing
     Ok , Makefile.in应该放到各个目录下了。
最后,运行configure脚本,生成 各个目录下的Makefile .......
再最后 ,make .......


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/5892/showart_23819.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP