EJABBERD在windows上的编译以及ejabberd的架构

  Erlang是一个好东东,只是可惜了没有一个好的IDE,让我想当起了javascript多年的沉寂。
  花了一天时间,终于把ejabberd的流整理理清楚了。放在这里,算是一次总结。

 

  第一步,编译。


    我使用的版本是ejabberd-2.0.3,这一版本是在差不多2年前选择的,当年选择的时候还是最新版本,重回http://www.ejabberd.im/上查看发现现在已经升级到2.1.3了,感叹时间过得真快,转眼间10个版本了。
    不得不说,编译ejabberd是个力气活,从网上下载了ejabberd,如果期望下载后直接就能编过那就大错特错了。erlang实现了夸平台,但我个人感觉是一个很*ux化的东东。首先他所需要的依赖都不在自己的目录下,也就是说,svn上面仅仅提供erlang的代码以及link in drive(不知道这个?那您还需要更深入的了解erlang)的c代码。按官方说明运行configure.bat,看看这个bat都干了些啥:

//------------------------BAT--------------------------
@if "x%1"=="x--help" goto usage

@set arg=dynamic
@if "x%1"=="x--static" set arg=static

@echo Configuring for %arg% build...

erlc configure.erl
erl -s configure -env arg %arg% -noshell

@goto end

:usage
@echo Usage: configure.bat
@echo or configure.bat --static
@echo or configure.bat --help

:end
//-----------------------------------------------------
    嗯,大致意思 就是说先运行先编译同目录下的configure.erl程序,所以在这个时候,你必须保证你的erlang环境正常,不然无法正常通行此bat。编译完了之后在后台执行configure模块的start方法。

    如果一切正常,你会发现你的目录下多了一个makefile.inc文件,这都是拜configure.erl所赐。

    其实这个configure.erl写得不够好。他强制的将GNU的解决方案设置到了c:/Gnu/SDK而没有任何的提示。所以接下来要配置相关GNU方案的路径。所使用到的GNU方案有:
   libiconv:编解码
   ExpatLib:解析XMP,SAX模型,记得好像已停止开发维护。
   Zlib    :大名顶顶的压缩解压的。上次因自己静态编译这个东东忘在vs 2008中加版本提升郁闷死我了,在产品发布给客户后发现在xp下无法运行,悲据了。。。
   openssl : 实现ssl,同样大名顶顶

   如果还没有这些库,你需要先从相关开源站点上下载这些库。

   下载好后配置路径。在配置路径时要注意,ejabberd的开发者再一次在makefile中强建了你的意志。他自动在你设置的目录下找include子目录及lib子目录,特别是openssl,他会自动去找lib/vc/...,所以如果你不想修改makefile.win32,那么,请你乖乖的按照此目录放置你的动态库,头文件等。

   一切准备就续,打开你的cmd,cd到你的目录,然后:nmake -f makefile.win32

   如果你避免了我提到的陷阱,你应该可以顺利编译过。

   如果你看到这里就开始编译,我只好说,这样也行。。。

   不过等等,吾是一个在代码,结构目录上有洁癖的人,他居然把beam与erl放在同一个目录,所以,下一步需要用erl的emakefile把代码指向ebin目录,对于在makefile中写死了的你码,只有您去改改makefile了。

 

    至此,编译告一段落。。。


   ejabebrd结构的说明


 1,ejabberd的入口点
   这里的入口点与c里面的入口点的概念有点不太一样,事实上我想说的是从什么地方开始,让整个ejabberd系统run起来,这个听起来更像是你拥有了一台高性能的汽车之后寻找启动按钮。
   ejabberd:start就是这样一个启动按钮,他调用application:start,并传入ejabberd做为参数,哈哈,一旦调用此方法以后,请您端起您的咖啡,好好享用erlang为我们提供的超人性化服务。他会在你的ejabberd.beam目录下录找ejabberd.app文件,查找回调模块,大至是这样子:

{application, ejabberd,
 [
  {mod, {ejabberd_app, []}}]}.
 
   ejabberd中定义了回调方法(就像接口一样)。至此,导火线已点燃。让我们看看ejabberd_app.erl中做了啥。

   2,加载其它模块
   ejabberd中的start/2加载首先启动ejabberd_config:start读取配置,然后按配置中的模块,一个一个载加起来,模块均实现gen_mode的behaviour。

   3,客户端连接处理
ejabberd做为一个服务器,关于客户端连接的处理必将成为一个核心。这一块的逻辑基本上就是在ejabberd_listener模块中调用ejabberd_socket:start(Module, gen_tcp, Socket, Opts).ejabberd_socket通过SockMod:controlling_process(Socket, Receiver)对接收数据的进程重定向,定向到receiver进程,而Receiver进程通过ejabberd_receiver:start(Socket, SockMod, none, MaxStanzaSize)产生。ejabberd_receiver实现了gen_server的behaviour。

嘿嘿,that it is.

 

 

更多内容,请移步这里

posted @ 2010-05-04 00:34  新起点_不能用  阅读(3702)  评论(0编辑  收藏  举报